J'ai un problème assez unique à résoudre et j'espère que quelqu'un ici pourra me donner un aperçu de la meilleure façon de le résoudre.
Problème: supposons qu'une liste de N nombres soit partagée entre un ensemble de participants de telle manière qu'aucun participant ne connaisse réellement aucun des nombres qu'ils partagent. Tous les participants connaissent N (la taille de la liste des nombres) et la somme de tous les nombres de la liste, mais rien de plus a priori.
En travaillant ensemble, il est possible de comparer deux nombres partagés a et b de telle manière que les participants apprennent si l'énoncé "a <b" est vrai, mais rien de plus. Cependant, c'est une chose extrêmement coûteuse à faire (lire: cela pourrait prendre plusieurs secondes, voire quelques minutes, pour effectuer une seule comparaison). Voir la fin de ce post pour un peu plus d'informations sur la façon dont une telle chose est possible.
À la fin de la journée, les parties souhaitent afficher les indices de la liste qui correspondent aux "K% supérieurs" (le K% qui est le plus grand) des nombres partagés dans la liste. Cela peut bien sûr être fait par tri, ou en utilisant un algorithme de sélection "top K". Cependant, ceux-ci ont tendance à utiliser beaucoup de comparaisons, ce qui est à éviter. (Ce sont soit O (n log n) ou O (n), avec des constantes cachées assez grandes.)
Une autre alternative consiste à "deviner" un nombre X pour lequel (1-K)% sont plus petits que X et K% sont plus grands. Ensuite, vous pouvez comparer chaque élément avec X et voir combien sont plus grands et combien sont plus petits. Si votre supposition était fausse, révisez-la en utilisant quelque chose comme une recherche binaire jusqu'à ce que vous convergiez vers une solution correcte. Cela prend beaucoup moins de comparaisons si votre estimation est bonne.
Donc, ma question est,
Étant donné seulement N et la somme, quelle est la meilleure façon de "prédire" X?
Bien sûr, cela dépendra de la distribution sous-jacente. Pour différents cas d'utilisation, la distribution sous-jacente sera probablement différente mais sera connue, donc je suis intéressé par de bonnes solutions pour toutes les plus courantes (normales, uniformes, exponentielles, peut-être quelques autres). J'aimerais aussi entendre des suggestions sur la meilleure façon de faire la recherche "binaire" pour minimiser le nombre d'étapes étant donné une hypothèse sur la distribution sous-jacente.
ANNEXE: Chaque valeur de la liste est partagée entre les participants à l'aide du schéma de partage secret de Shamir. Supposons qu'il y ait M participants et que la liste soit de longueur N. Ensuite, le i-ème nombre sur la liste est représenté par un polynôme de degré M-1 sur un champ fini F. Le terme constant de f i est le nombre qui est partagé, tous les autres coefficients sont choisis uniformément au hasard parmi F. Les parts du j-ième participant sont alors f i ( j ) , 1 ≤ i ≤ N. Compte tenu de cette part, le participant n'a aucune information (au sens théorique de l'information) sur le nombre; en fait, aucun sous-ensemble de participants ne peut combiner les connaissances pour apprendre des informations sur les numéros partagés. Cependant, en utilisant une technique de calcul multipartite sécurisée sophistiquée, il est possible de déterminer si une valeur partagée est inférieure à une autre sans révéler plus d'informations. Cette technique implique la coopération de tous les participants, c'est pourquoi il est si coûteux de le faire et devrait être fait le moins de fois possible.