Cześć! Dzisiejszy wykład będzie nieco inny od pozostałych. Będzie się różnić tym, że jest tylko pośrednio powiązany z Javą. Temat ten jest jednak bardzo ważny dla każdego programisty. Porozmawiamy o algorytmach . Co to jest algorytm? Mówiąc najprościej, jest to pewna sekwencja działań, które należy wykonać, aby osiągnąć pożądany rezultat . Często używamy algorytmów w życiu codziennym. Na przykład każdego ranka stajesz przed zadaniem: przyjść do szkoły lub pracy, a jednocześnie być:
- Ubrany
- Czysty
- Dobrze dokarmiony
- Obudź się przy budziku.
- Weź prysznic, umyj twarz.
- Przygotuj śniadanie, zaparz kawę/herbatę.
- Jeść.
- Jeśli nie prasowałeś ubrań od wieczora, wyprasuj je.
- Ubrać się.
- Opuścić dom.
- Kup lub pobierz w Internecie „Słownik rosyjskich imion osobistych” wydanie z 1966 r.
- Znajdź w tym słowniku każde imię z naszej listy.
- Zapisz na kartce papieru, na której stronie słownika znajduje się dane imię.
- Uporządkuj nazwy, korzystając z notatek na kartce papieru.
for
, która wykonuje to zadanie
int[] numbers = new int[100];
// ..заполняем массив числами
for (int i: numbers) {
System.out.println(i);
}
Jaka jest złożoność zapisanego algorytmu? Liniowy, O(N). Liczba akcji, które program musi wykonać, zależy od tego, ile dokładnie liczb zostało do niego przekazanych. Jeśli w tablicy będzie 100 liczb, będzie 100 akcji (wyjście na ekranie).Jeśli w tablicy będzie 10 000 liczb, trzeba będzie wykonać 10 000 akcji. Czy można ulepszyć nasz algorytm? NIE. W każdym razie będziemy musieli wykonać N przejść przez tablicę i wykonać N wyjść na konsolę. Spójrzmy na inny przykład.
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
Mamy pusty LinkedList
, do którego wstawiamy kilka liczb. Musimy oszacować złożoność algorytmu wstawiania pojedynczej liczby do LinkedList
naszego przykładu i to, jak zależy to od liczby elementów na liście. Odpowiedź brzmi O(1) – stała złożoność . Dlaczego? Uwaga: każdorazowo wstawiamy cyfrę na początku listy. Dodatkowo, jak pamiętacie, wstawiając liczby do LinkedList
elementów, nie są one nigdzie przesuwane - linki są na nowo definiowane (jeśli nagle zapomnieliście, jak działa LinkedList, obejrzyjcie jeden z naszych starych wykładów ). Jeśli teraz pierwszą liczbą na naszej liście jest liczba х
, a na początku listy wstawimy liczbę y, wystarczy:
x.previous = y;
y.previous = null;
y.next = x;
Dla tej redefinicji odniesienia nie ma dla nas znaczenia, ile jest teraz liczbLinkedList
- przynajmniej jedna, co najmniej miliard. Złożoność algorytmu będzie stała - O(1).
GO TO FULL VERSION