Bună! Lecția de astăzi va fi puțin diferită de restul. Acesta va diferi prin faptul că este doar indirect legat de Java. Acestea fiind spuse, acest subiect este foarte important pentru fiecare programator. Vom vorbi despre algoritmi . Ce este un algoritm? În termeni simpli, este o secvență de acțiuni care trebuie finalizată pentru a obține rezultatul dorit . Folosim algoritmi des în viața de zi cu zi. De exemplu, în fiecare dimineață aveți o sarcină specifică: mergeți la școală sau la serviciu și, în același timp, fiți:
- Îmbrăcat
- Curat
- hrănit
- Treziți-vă folosind un ceas cu alarmă.
- Fă un duș și spală-te.
- Pregătiți micul dejun și niște cafea sau ceai.
- Mânca.
- Dacă nu ți-ai călcat hainele în seara precedentă, atunci călcă-le.
- Îmbracă-te.
- Ieși din casă.
- Cumpărați sau descărcați ediția din 1961 a Webster's Third New International Dictionary.
- Găsiți fiecare nume din lista noastră în acest dicționar.
- Pe o bucată de hârtie, scrieți pagina dicționarului pe care se află numele.
- Utilizați bucățile de hârtie pentru a sorta numele.
for
buclă obișnuită care îndeplinește această sarcină
int[] numbers = new int[100];
// ...fill the array with numbers
for (int i: numbers) {
System.out.println(i);
}
Care este complexitatea acestui algoritm? Linear, adică O(n). Numărul de acțiuni pe care programul trebuie să le efectueze depinde de câte numere îi sunt transmise. Dacă există 100 de numere în matrice, vor exista 100 de acțiuni (instrucțiuni pentru a afișa șiruri pe ecran). Dacă există 10.000 de numere în matrice, atunci trebuie efectuate 10.000 de acțiuni. Algoritmul nostru poate fi îmbunătățit în vreun fel? Nu. Indiferent de ce, va trebui să facem N treceri prin matrice și să executăm N instrucțiuni pentru a afișa șiruri de caractere pe consolă. Luați în considerare un alt exemplu.
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
Avem un gol LinkedList
în care introducem mai multe numere. Trebuie să evaluăm complexitatea algoritmică a inserării unui singur număr în LinkedList
exemplul nostru și modul în care aceasta depinde de numărul de elemente din listă. Răspunsul este O(1), adică complexitate constantă . De ce? Rețineți că inserăm fiecare număr la începutul listei. În plus, vă veți aminti că atunci când introduceți un număr într-un LinkedList
, elementele nu se mișcă nicăieri. Legăturile (sau referințele) sunt actualizate (dacă ați uitat cum funcționează LinkedList, uitați-vă la una dintre vechile noastre lecții ). Dacă primul număr din lista noastră este x
, și inserăm numărul y în partea de sus a listei, atunci tot ce trebuie să facem este următorul:
x.previous = y;
y.previous = null;
y.next = x;
Când actualizăm linkurile, nu ne interesează câte numere sunt deja înLinkedList
, fie unul sau un miliard. Complexitatea algoritmului este constantă, adică O(1).
GO TO FULL VERSION