J'ai été demandé à cette question d'entrevue récemment:
Vous êtes donné un tableau qui est presque triées, en ce que chacun des
N
éléments peuvent être égarés par pas plus dek
des postes à partir du bon ordre de tri. Trouver un espace-temps d'algorithme efficace pour trier le tableau.
J'ai un O(N log k)
solution comme suit.
Nous allons désigner arr[0..n)
à la moyenne des éléments de la matrice à partir de l'index 0
(inclus) N
(exclusif).
- Trier
arr[0..2k)
- Maintenant, nous savons que
arr[0..k)
sont dans leur dernière triés positions... - ...mais
arr[k..2k)
peut encore être égaré park
!
- Maintenant, nous savons que
- Trier
arr[k..3k)
- Maintenant, nous savons que
arr[k..2k)
sont dans leur dernière triés positions... - ...mais
arr[2k..3k)
peut encore être égaré park
- Maintenant, nous savons que
- Trier
arr[2k..4k)
- ....
- Jusqu'à ce que vous triez
arr[ik..N)
, puis vous avez terminé!- Cette dernière étape peut être moins cher que les autres étapes lorsque vous avez moins de
2k
éléments de gauche
- Cette dernière étape peut être moins cher que les autres étapes lorsque vous avez moins de
Dans chaque étape, vous de tri à la plupart des 2k
éléments O(k log k)
, mettre de côté au moins k
éléments dans leur dernière triés à la fin de chaque étape. Il y a O(N/k)
étapes, de sorte que la complexité globale est - O(N log k)
.
Mes questions sont les suivantes:
- Est -
O(N log k)
- elle optimale? Cela peut-il être amélioré? - Pouvez-vous faire cela sans (partiellement) re-trier les mêmes éléments?