trouver les plus petits k éléments du tableau dans O (k)

12

C'est une question intéressante que j'ai trouvée sur le Web. Étant donné un tableau contenant n nombres (sans aucune information à leur sujet), nous devrions pré-traiter le tableau en temps linéaire afin de pouvoir retourner les k plus petits éléments en temps O (k), quand on nous donne un nombre 1 <= k <= n

J'ai discuté de ce problème avec des amis mais personne n'a pu trouver de solution; Toute aide serait appréciée!

notes rapides: -l'ordre des k plus petits éléments n'est pas important -les éléments dans le tableau sont des nombres, peuvent être des entiers et peuvent ne pas l'être (donc pas de tri radix) -le nombre k n'est pas connu dans la phase de prétraitement. le prétraitement est en temps O (n). la fonction (trouver k plus petits éléments) sur le temps O (k).

Idan
la source
4
Que diriez-vous d'utiliser un min-tas?
Shir
1
Regardez k-skyband et le calcul top-k. L'article cs.sfu.ca/~jpei/publications/subsky_tkde07.pdf propose une belle revue de la littérature connexe.
András Salamon
1
Shir-j'ai examiné l'idée de tas min. cependant, afin d'imprimer les k plus petits nombres en tas min est en temps O (klogn) et non O (k) comme requis
Idan
4
@idannik: Pourquoi pensez-vous qu'il faut du temps pour trouver les k plus petits éléments dans un tas min? Ω(klogn)k
Kristoffer Arnsfelt Hansen
8
Je ne pense pas que ce soit au niveau de la recherche. Cela ressemble à une affectation. Où l'as tu trouvé?
Kaveh

Réponses:

24

Prétraitez le tableau de valeurs dans le temps O ( n ) :nO(n)

  • in
  • tandis que i>2
    • Calculer la médiane de A [ 1 .. i ] dans le temps O ( i )mA[1..i]O(i)
    • partitionner en A [ 1 .. i / 2 - 1 ] m et A [ i / 2 + 1 .. i ] m en même temps.A[1..i]A[1..i/21]mA[i/2+1..i]m
    • ii/2

Le temps total de précalcul est à O(1+2+4+...+n)O(n)

Répondez à une requête pour les plus petits éléments de A dans le temps O ( k ) :kAO(k)

  • llog2k
  • sélectionner le ème élément x de A [ 2 l . .2 l + 1 ] dans le temps O ( 2 l ) O ( k )(k2l)xA[2l..2l+1]O(2l)O(k)
  • partition par x en même tempsA[2l..2l+1]x

contient les k plus petits éléments.A[1..k]k

Les références:

  • En 1999, Dor et Zwick ont donné un algorithme pour calculer la médiane de éléments dans le temps à l'intérieur de 2,942 n + o ( n ) comparaisons, ce qui produit un algorithme pour sélectionner le k ème élément parmi n éléments non ordonnés dans moins de 6 n comparaisons.n2.942n+o(n)kn6n
Jeremy
la source
1
Je suppose que la boucle externe est censée être «pour i dans ». Votre algorithme est-il différent de celui de la réponse de Yuval Filmus? {2lgn,,4,2,1}
Radu GRIGore
2
Ceci est une généralisation de mon algorithme à arbitraire . Il précise également certains détails de mise en œuvre qui ont été (délibérément) omis de ma réponse. n
Yuval Filmus
3
@YuvalFilmus Souhaitez-vous laisser entendre par votre commentaire que ma réponse est éthiquement proche de la vôtre? C'est la solution qui m'est venue à l'esprit lorsque j'ai examiné la question. J'ai vu que vous en aviez posté un semblable, mais je l'ai trouvé peu clair, alors j'ai écrit le mien (au lieu de faire un montage majeur du vôtre). Ce qui importe en fin de compte, c'est la qualité des réponses sur les systèmes, pas vraiment qui les a écrites: les badges et la réputation ne sont que des incitations, pas des objectifs en soi.
Jeremy
4
n
2
Oh :( Désolé à ce sujet alors. (Bien que je pense toujours que donner des réponses complètes soit une priorité sur les soupçons d'affectation)
Jeremy
14

n=2m2m1,2m2,2m3,,1kt2t1k2t2t2k2tkO(2t)=O(k)

Θ(nlogn)

while n > 0:
  find the (lower) median m of A[0..n-1]
  partition A in-place so that A[n/2-1] = m
  n = n/2

n+n/2+n/4++1<2nAkA[0..n/2k1]n/2k

Yuval Filmus
la source
1
O(1)kO(n)
4
lognnlogn
3
@ AndrásSalamon: Si vous lisez la réponse donnée par Jeremy (qui me semble presque la même que celle-ci), vous voyez que vous traitez d'abord l'ensemble du tableau, puis la première moitié, et ainsi de suite.
Radu GRIGore
3
n+n/2+n/4++1<2n
5
Incidemment, cet algorithme apparaît comme un sous-programme dans ma réponse à une question précédente: cstheory.stackexchange.com/questions/17378/…
David Eppstein
0

kk

jbapple
la source
1
k
2
Je vois. Mon erreur.
jbapple