Supposons que nous lisions une séquence de nombres, un par un. Comment trouver le plus petit élément simplement en utilisant la mémoire de cellule et en temps linéaire ( ). Je pense que nous devrions enregistrer les premiers termes de la séquence et lorsque nous obtenons le 'ème terme, supprimer un terme qui nous assure qu'il ne peut pas être le ième élément le plus petit, puis enregistrer ' ème terme. Nous devrions donc avoir un indicateur qui montre ce terme inutilisable à chaque étape et cet indicateur devrait être mis à jour à chaque étape rapidement. J'ai commencé avec "max"; mais il ne peut pas se mettre à jour rapidement; Signifie que si nous considérons max, alors lors de la première suppression, nous manquons le max et nous devons rechercher max dans et sa cause temps qu'il n'est pas linéaire. Peut-être devrions-nous enregistrer les premiers termes de la séquence de manière plus intelligente.
Comment puis-je résoudre ce problème?
la source
Réponses:
Créez un tampon de taille . Lire 2 k éléments du tableau. Utilisez un algorithme de sélection à temps linéaire pour partitionner le tampon de sorte que les k plus petits éléments soient les premiers; cela prend du temps O ( k ) . Maintenant, lisez dans un autre k éléments de votre tableau dans le tampon, en remplaçant les k plus grands éléments du tampon, partitionnez le tampon comme précédemment et répétez.2k 2k k O(k) k k
Cela prend temps et O ( k ) espace.O(k∗n/k)=O(n) O(k)
la source
min
la source