Trouver la médiane d'une liste de tableaux triés


8

Entrée: un ensemble de tableaux UNEje(de nombres).
Les éléments de chaque tableau sont triés, mais l'ensemble des tableaux n'est pas nécessairement trié. Les tableaux ne sont pas nécessairement de la même taille. Le nombre total d'éléments estn.

Sortie: leke plus petit élément parmi tous les éléments de l'entrée.

Quel est l'algorithme le plus efficace pour ce problème?

Est-il possible, par exemple, d'atteindre un temps de fonctionnement de O(+Journaln)?


Il y a une question très proche sur SO , avec des réponses insatisfaisantes.
Joe

Les tableaux sont-ils tous de la même longueur?
vonbrand

Les tableaux ne sont pas nécessairement de la même taille. Cependant, je suis également intéressé par un cas spécial où les tailles sont géométriques, c'est-à-dire le tableauUNEje a la taille n/2je, mais je doute que cela aide dans la durée.
Joe

4
Comment obtenez-vous O(logn)? Tu peux recevoirO((logn)2)en émulant l'algorithme "quickselect". Dans chaque phase, vous choisissez un pivot et calculez le nombre d'éléments en dessous, enO(logn). Ensuite, vous supprimez les éléments du mauvais côté et répétez. Le processus se termine aprèslognitérations (dans l'attente, ou dans le pire des cas si vous choisissez intelligemment le pivot).
Yuval Filmus

2
@Joe Je pense que tu devrais aussi décrire ton algorithme. Ce serait très intéressant et pourrait fournir un point de départ pour de meilleurs algorithmes s'il est correct. Si elle est incorrecte, les gens peuvent trouver des erreurs.
Paresh

Réponses:


5

Vous pouvez le faire en O(l+k log l) temps et O(l) espace supplémentaire comme suit:

  1. Créez un tas binaire avec une entrée pour chacun des tableaux. La clé d'entréei est le plus petit élément du tableau Ai. Cela prendO(l) temps.
  2. Sélectionnez la plus petite entrée du tas et supprimez-la (en prenant O(log l) temps). Ajoutez cette entrée au tas en utilisant la plus petite entrée suivante dans le tableau correspondant comme clé (à nouveauO(log l) temps).
  3. Faites l'étape précédente kfois. Le dernier élément que vous supprimez du tas est votre réponse.

Si vous remplacez le tas binaire par un tas de Fibonacci, je pense que cela vous amène à amorti O(l+k) temps, mais en pratique, ce sera plus lent que le tas binaire à moins l est énorme.

Je soupçonne que le segment de tas de Fibonacci est optimal, car intuitivement vous allez devoir inspecter au moins k éléments pour trouver le ke le plus petit, et vous devrez inspecter au moins un élément de chacun des l tableaux puisque vous ne savez pas comment ils sont triés, ce qui donne immédiatement une limite inférieure de Ω(max(k,l))=Ω(k+l).


3
Vous n'avez pas besoin d'inspecter au moins kéléments puisque les tableaux sont triés. Voir la solution dans mon commentaire, qui donneO((Journaln)2).
Yuval Filmus

1
Vous pouvez améliorer le temps d'exécution le plus défavorable dans le modèle RAM, car vous pouvez implémenter votre file d'attente prioritaire pour n éléments dans o(Journaln). Dans ce modèle, vous pouvez réaliser des opérations d'insertion et de suppressionO(JournalJournaln) et O(1)temps pour l'opération findMin.
Massimo Cafaro

1
Êtes-vous sûr que le tas Fibonnaci prend en charge la bonne opération? Je pense que vous pensez à diminuer la clé dans un tas de min.
Joe

C'est fondamentalement la même chose que la réponse de vonbrand, avec l'observation supplémentaire que vous n'avez à fusionner aucun élément après le kième.
Joe

Je crois que le tas de Fibonacci vous permet de diminuer ou d'augmenter une clé dans O(1)temps. Oui, c'est fondamentalement la même réponse, mais en observant que vous avez seulement besoin de fusionnerkéléments réduit votre temps d'exécution de manière équitable.
Matt Lewis

5

Voici un randomisé O(log2n)algorithme. Il peut probablement être dérandomisé en utilisant la même astuce que celle utilisée pour dérandomiser la sélection rapide habituelle.

Nous émulons l'algorithme de sélection rapide classique. Dans chaque phase, vous choisissez un pivot et calculez le nombre d'éléments en dessous, enO(logn), en utilisant la recherche binaire dans chaque liste. Ensuite, vous supprimez les éléments du mauvais côté et répétez. Le processus se termine aprèslogn itérations dans l'attente.


1

Cela semble être résolu par l'étude de la sélection et du classement généralisés (version préliminaire) par Frederickson et Johnson dans STOC '80.

Ils donnent des limites supérieures et inférieures de: Θ(+i=1log|Ai|) qui se révèle être logn pour la plupart des distributions de taille de tableau.

L'algorithme réel pour atteindre la limite supérieure est apparemment donné dans un article précédent: Algorithmes optimaux pour générer des informations quantiles dans X + Y et des matrices avec des colonnes triées , Proc. 13th Annual Conference on Information Science and Systems, Université Johns Hopkins (1979) 47-52.


0

Une -la fusion prend du temps Θ(nlog) (utilisez un moyen efficace pour représenter une file d'attente prioritaire des éléments de tête dans chaque liste), puis vous choisissez le k-th élément en temps constant. Je pense que cela est discuté dans "Tri et recherche" de Knuth pour le tri. Obtenir le plus petit (ou le plus grand) prend clairementΘ(), pour un tableau non trié, il est O(n) IIRC.

Veuillez décrire votre algorithme.


1
C'est beaucoup plus lent que ce qui m'intéresse. Vous pouvez trouver la médiane dans O(n)temps simplement concaténer les listes et en utilisant l'algorithme de sélection de temps linéaire.
Joe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.