111 votes

Comment trouver le plus petit élément de kth dans l’union de deux tableaux triés ?

C'est un des devoirs de la question. Ils disent qu'il faut O(logN + logM)N et M sont les matrices de longueurs.

Nommons-les tableaux en a et b. Évidemment, nous ne pouvons l'ignorer tous a[i] et b[i] où i > k.
D'abord, nous allons comparer a[k/2] et b[k/2]. Laissez - b[k/2] > a[k/2]. Par conséquent, nous ne pouvons ignorer aussi tous b[i], où i > k/2.

Maintenant, nous avons tous a[i], où i < k et tous b[i], où i < k/2 pour trouver la réponse.

Quelle est la prochaine étape?

80voto

lambdapilgrim Points 389

J'espère que je ne suis pas répondre à vos devoirs comme il l'a été plus d'un an que cette question a été posée. Voici une queue solution récursive qui prendra du log(len(a)+len(b)).

Hypothèse: Les entrées sont à droite. c'est à dire k est dans l'intervalle [0, len(a)+len(b)]

De la Base de cas:

  • Si la longueur de l'un des tableaux est 0, la réponse est la k-ième élément de la deuxième matrice.

Étapes de réduction:

  • Si le milieu de l'indice de + milieu de l'indice de b est inférieure à k
    • Si le milieu de l'élément de a est plus grand que le milieu de l'élément de b, on peut ignorer le premier semestre de b, ajuster k.
    • d'autre ignorer la première moitié d'un, ajuster k.
  • Sinon si k est inférieur à la somme de la mi indices de a et b:
    • Si le milieu de l'élément de a est plus grand que le milieu de l'élément de b, nous pouvons ignorer seconde moitié d'un
    • le reste, nous pouvons ignorer la seconde moitié de b

Code:

def kthlargest(arr1, arr2, k):
    if len(arr1) == 0:
        return arr2[k]
    elif len(arr2) == 0:
        return arr1[k]

    mida1 = len(arr1)/2
    mida2 = len(arr2)/2
    if mida1+mida2<k:
        if arr1[mida1]>arr2[mida2]:
            return kthlargest(arr1, arr2[mida2+1:], k-mida2-1)
        else:
            return kthlargest(arr1[mida1+1:], arr2, k-mida1-1)
    else:
        if arr1[mida1]>arr2[mida2]:
            return kthlargest(arr1[:mida1], arr2, k)
        else:
            return kthlargest(arr1, arr2[:mida2], k)

Veuillez noter que ma solution est la création de nouvelles copies de petits tableaux dans chaque appel, ce qui peut être facilement éliminé par le seul passage de début et de fin des indices sur l'origine des tableaux.

52voto

Jules Olléon Points 1761

Vous l’avez, juste continuer à aller ! Et soyez prudent avec les index...

Pour simplifier un peu je vais supposer que N et M sont > k, donc la complexité ici est O (log k), qui est O (log N + log M).

Pseudo-code :

Pour la démonstration, vous pouvez utiliser l’invariant de boucle i + j = k, mais je ne le ferai  :) tous vos devoirs

5voto

J.F. Sebastian Points 102961

Voici une version de C++ itérative de la solution de @lambdapilgrim (voir l’explication de l’algorithme il) :

Il fonctionne pour tous les indexe et a complexité.

Exemple de

4voto

Qichao Dong Points 236

Ma tentative pour les premiers petits nombres k, kth nombre dans 2 tableaux triés et n tri de tableaux :

Le code complet avec utils de débogage se trouvent à : https://github.com/brainclone/teasers/tree/master/kth

2voto

superb Points 200

Voici mon code basé sur la solution de Jules Olleon :

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