Musiałem ukończyć test programowania online na staż i otrzymałem pytanie dotyczące analizy złożoności. Odpowiedziałem na pytanie i zostało oznaczone jako błędnie, i chciałbym tylko zrozumieć, dlaczego, więc mogę poprawić.Złożoność algorytmu w teście online
Pytanie:
Daj złożoność dla następującego algorytmu gdy reverseOrder jest prawdą, a kiedy jest fałszywe:
List<int> stackToList(Stack<int> stack, bool reverseOrder) {
List<int> items = new List<int>();
while (stack.Count > 0) {
int item = stack.Pop();
if (reverseOrder) {
items.Insert(0, item);
} else {
items.Add(item);
}
}
return items;
}
EDIT: Było multi-wybór , a możliwe odpowiedzi:
- O (1)
- O (nlogn)
- O (n)
- O (N^2)
Można wybrać jeden dla przypadku reverseOrder jest prawdziwa, a drugi, gdy to to fałsz.
My odpowiedzi:
- Po reverseOrder warunków: O (n)
- Gdy reverseOrder fałszywe: O (n)
I uzyskałem tę odpowiedź w następujący sposób:
- while Pętla będzie iteracyjne
n
razy, bo to trwa, dopóki nie istnieje żaden element w lewo, aby zasnąć Pop()
jestO(1)
W przypadku
reverseOrder
będąctrue
AnInsert
do przodu na liście jest zrobione. OdList<T>
jest wspierany przez układ, jest zmieniany dynamicznie, i każdy element przemieszcza się o jedno miejsce, a element zostaje wstawiony na wskaźnik 0. Według https://msdn.microsoft.com/en-us/library/sey5k5z4(v=vs.110).aspx:Ta metoda jest O (n), działanie, gdzie n jest liczbą.
W przypadku
reverseOrder
będącfalse
AnAdd
jest wykonany, aby dołączyć pozycję do tyłu listy. Oditems
nie podano początkowego rozmiaru,Count
nigdy nie jest mniejsze niżCapacity
, powodując zmiany rozmiaru, tak według https://msdn.microsoft.com/en-us/library/3wcytfd1(v=vs.110).aspx:Jeśli liczba jest mniejsza niż moc ta metoda jest O (1) działanie.Jeśli pojemność musi zostać zwiększona, aby pomieścić nowy element, ta metoda staje się operacją O (n), gdzie n oznacza liczbę.
czuję się zupełnie zniechęca w tej chwili, ponieważ coraz to źle spowodował mój wynik gwałtownie spadły, choć mam wszystkie inne pytania na teście prawidłowe.
'Count' może być mniejsza niż' Capacity', jak i lista rośnie w wielkości to zwykle bywa. Nie ustawiasz 'Capacity' ręcznie, więc domyślnym zachowaniem jest to, że gdy' Count' przekracza 'Capacity',' Capacity' podwaja się. – Abion47
Pojemność zostanie zwiększona ponad wymaganą długość, gdy będzie wymagać rozszerzenia. Zwróć uwagę na próbkę w dalszej części łącza, gdzie pojemność to 8, a liczba to 5. Pamiętaj też, że O (n) na liście nie jest w rzeczywistości o (n), ponieważ rozmiar listy nie jest pełnym rozmiarem pozycji . Może O (log n) bardziej realistycznie. –
@ stephen.vakil Ta logika nie jest poprawna. Jeśli faktycznie istniała zmiana rozmiaru na każdym 'Dodaj' (nie ma, ale ta logika ma zastosowanie do wstawiania na początku). Kiedy przesuniesz 1, następnie 2, następnie 3, ..., następnie n-1, następnie n, wykonałeś operacje n (n-1)/2 (wykonałeś połowę kwadratu, w którym przecinałeś przekątną). To jest O (n^2). – Servy