Załóżmy, że odczytujemy ciąg liczb, jeden po drugim. Jak znaleźć najmniejszy element za pomocą pamięci komórkowej oraz w czasie liniowym ( ). Myślę, że powinniśmy zapisać pierwsze wyrażeń w sekwencji, a kiedy otrzymamy -ty termin, usuń go, który z pewnością nie może być -tym najmniejszym elementem, a następnie zapisz -ty termin. Powinniśmy więc mieć wskaźnik, który pokazuje ten bezużyteczny termin na każdym etapie, a wskaźnik ten powinien być aktualizowany na każdym kroku szybko. Zacząłem od „max”; ale nie można szybko zaktualizować; Oznacza to, że jeśli weźmiemy pod uwagę max, to przy pierwszym usuwaniu pomijamy maksimum i powinniśmy szukać maksimum w i jego przyczynie czas, że nie jest on liniowy. Może powinniśmy bardziej inteligentnie zapisać pierwsze warunków sekwencji.
Jak rozwiązać ten problem?
źródło
Odpowiedzi:
Utwórz bufor o rozmiarze . Wczytaj 2 k elementów z tablicy. Użyj algorytmu wyboru czasu liniowego, aby podzielić bufor, tak aby k najmniejszych elementów było pierwsze; zajmuje to czas O ( k ) . Teraz wczytaj kolejne k elementów z tablicy do bufora, zastępując k największych elementów w buforze, podziel bufor jak poprzednio i powtórz.2k 2k k O(k) k k
To zajmuje czas i O ( k ) przestrzeń.O(k∗n/k)=O(n) O(k)
źródło
min
źródło