44 votes

Médiane de 5 tableaux triés

Je suis en train d'essayer de trouver la solution pour la médiane de 5 tableaux triés. C'était une des questions d'entrevue.

La solution que je pouvais penser était de fusionner les 5 tableaux et ensuite trouver la médiane [O(l+m+n+o+p)].

Je sais que pour 2 triés tableaux de même taille que nous pouvons faire en log(2n). [par comparaison à la médiane des deux tableaux, puis de le jeter hors 1 de la moitié de chaque tableau et en répétant le processus]. .. Trouver la médiane peut être constante de temps de tri des tableaux .. donc je pense que ce n'est pas log(n) ? .. qu'est-ce que la complexité du temps pour cela ?

1] Est-il une solution similaire pour les 5 tableaux . Que faire si les matrices sont de même taille , est-il une meilleure solution ?

2] je suppose, puisque cela a été demandé pour la 5, il y aurait une solution pour N triés tableaux ?

Merci pour tous les pointeurs.

Quelques précisions/questions que j'ai posées à l'interviewer:
Sont les matrices de même longueur
=> Pas de
Je pense qu'il y a un chevauchement dans les valeurs des tableaux
=> Oui

Comme exercice, je pense que la logique pour 2 tableaux de ne pas prolonger . Voici un essai:
L'application de la logique ci-dessus de 2 tableaux à-dire 3 tableaux: [3,7,9] [4,8,15] [2,3,9] ... les médianes 7,8,3
jeter éléments [3,7,9] [4,8] [3,9] .. les médianes 7,6,6
jeter éléments [3,7] [8] [9] ..les médianes 5,8,9 ...
jeter éléments [7] [8] [9] .. médiane = 8 ... Cela ne semble pas être correcte ?

La fusion des éléments triés => [2,3,4,7,8,9,15] => attendue médiane = 7

28voto

Nemo Points 32838

(C'est une généralisation de votre idée pour les deux tableaux).

Si vous commencez par regarder la cinq médianes des cinq tableaux, évidemment, la médiane globale doit être entre le plus petit et le plus grand des cinq médianes.

La preuve va quelque chose comme ceci: Si a est le min des médianes, et b est le max de la médianes, puis chaque tableau est moins de la moitié de ses éléments moins d'un et moins de la moitié de ses éléments supérieur à b. Résultat suit.

Ainsi, dans le tableau contenant un, jeter les numéros de moins de un; dans le tableau contenant b, jeter les nombres plus grand que b... Mais seulement jeter le même nombre d'éléments des deux tableaux.

C'est, si a est j éléments à partir du début de son éventail, et b à k éléments à partir de la fin de son tableau, vous jetez le premier min(j,k) les éléments d'un tableau et la dernière min(j,k) d'éléments de b du tableau.

Itérer jusqu'à ce que vous êtes jusqu'à 1 ou 2 éléments total.

Chacune de ces opérations (c'est à dire, trouver la médiane d'un tableau trié et jeter k éléments à partir du début ou de la fin d'un tableau) est la constante de temps. Donc à chaque itération est la constante de temps.

Chaque itération jette (plus de) la moitié des éléments à partir d'au moins une matrice, et vous ne pouvez le faire que log(n) fois pour chacun des cinq tableaux... de Sorte que l'ensemble de l'algorithme est log(n).

[Mise à jour]

Comme Himadri Choudhury points dans les commentaires, ma solution est incomplète; il y a beaucoup de détails et le coin des cas, à s'inquiéter. Donc, à la chair des choses un peu...

Pour chacun des cinq tableaux de R, la définition de ses médian inférieur" R[n/2-1] et de son "supérieur" médiane de R[n/2], où n est le nombre d'éléments dans le tableau (et les tableaux sont indexés à partir de 0, et la division par 2 arrondi vers le bas).

Laissez "un" être le plus petit de la basse-terre-pleins, et "b" être le plus important de la partie supérieure du médianes. S'il y a plusieurs tableaux avec la plus petite inférieur à la médiane et/ou plusieurs tableaux ayant le plus haut revenu médian, choisir a et b à partir de différentes matrices (c'est un de ces cas de coin).

Maintenant, l'emprunt Himadri suggestion: Effacer tous les éléments jusqu'à et y compris un à partir de son tableau, et tous les éléments vers le bas à et y compris b à partir de son tableau, en prenant soin d'enlever le même nombre d'éléments des deux tableaux. Noter que a et b pourraient être dans le même tableau; mais, dans ce cas, ils ne pourraient pas avoir la même valeur, parce que sinon, on aurait été en mesure de choisir l'un d'entre eux à partir d'un tableau différent. Donc c'est OK si cette étape des vents jusqu'à jeter des éléments à partir du début et de la fin de la même matrice.

Itérer tant que vous avez trois ou plusieurs tableaux. Mais une fois que vous êtes vers le bas, juste un ou deux tableaux, vous devez modifier votre stratégie pour être exclusif au lieu de inclusivement; vous n'efface jusqu'à , mais pas y compris l' un et en bas à mais pas y compris b. Continuer comme ça, en autant que le reste de un ou deux tableaux a au moins trois éléments (en vous garantissant faire des progrès).

Enfin, vous permettra de réduire de quelques cas, la plus délicate, qui est de deux tableaux restants, dont l'un a un ou deux éléments. Maintenant, si je vous ai demandé: "étant Donné un tableau trié plus un ou deux éléments supplémentaires, la médiane de tous les éléments", je pense que vous pouvez le faire en temps constant. (Encore une fois, il y a un tas de détails à peaufiner, mais l'idée de base est que l'ajout d'un ou deux éléments d'un tableau ne pas "pousser la médiane autour de" beaucoup.)

1voto

karmakaze Points 4615

Vous n'avez pas besoin de faire une fusion complète des 5 tableaux. Vous pouvez faire un tri par fusion jusqu'à ce que vous ayez (l + n + o + p + q) / 2 éléments puis vous avez la valeur médiane.

1voto

Ryan Ye Points 953

Devrait être assez simple à appliquer la même idée à 5 baies.

Tout d'abord, convertir la question plus générale. Trouver Kième élément N triés tableaux

  1. Trouver (K/N)ème élément de chaque tableau trié avec les binaires de recherche, dire K1, K2 KN...

  2. Kmin = min(K1, ... KN), Kmax = max(K1, ... KN)

  3. Jeter tous les éléments moins de Kmin ou plus grand que Kmax, disons X éléments a été jeté.

  4. Maintenant, répétez le processus en trouver (K - X)ème élément de tri des tableaux avec des éléments restants

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X