Szia! A mai lecke kissé eltér a többitől. Abban különbözik, hogy csak közvetve kapcsolódik a Java-hoz. Ez a téma minden programozó számára nagyon fontos. Az algoritmusokról fogunk beszélni . Mi az algoritmus? Egyszerűen fogalmazva, ez egy bizonyos műveletsor, amelyet végre kell hajtani a kívánt eredmény eléréséhez . A mindennapi életben gyakran használunk algoritmusokat. Például minden reggel van egy konkrét feladatod: menj iskolába vagy munkába, és ezzel egyidőben legyél:
- Felöltözve
- Tiszta
- Fed
- Ébresztőóra segítségével ébredjen.
- Zuhanyozz le és mosakodj meg.
- Készítsen reggelit és kávét vagy teát.
- Eszik.
- Ha előző este nem vasalta ki a ruháit, akkor vasalja ki.
- Öltözz fel.
- Hagyja el a házat.
- Vásárolja meg vagy töltse le a Webster's Third New International Dictionary 1961-es kiadását.
- Ebben a szótárban megtalálja a listánk összes nevét.
- Írja fel egy papírra a szótár azon oldalát, amelyen a név található.
- Használja a papírdarabokat a nevek rendezéséhez.
for
ciklust, amely végrehajtja ezt a feladatot
int[] numbers = new int[100];
// ...fill the array with numbers
for (int i: numbers) {
System.out.println(i);
}
Mi ennek az algoritmusnak a bonyolultsága? Lineáris, azaz O(n). A programnak végrehajtandó műveletek száma attól függ, hogy hány számot adnak át neki. Ha 100 szám van a tömbben, akkor 100 művelet lesz (utasítások a karakterláncok képernyőn történő megjelenítéséhez). Ha 10 000 szám van a tömbben, akkor 10 000 műveletet kell végrehajtani. Javítható-e az algoritmusunk valamilyen módon? Nem. Nem számít, mi lesz, N alkalommal kell áthaladnunk a tömbön , és N utasítást kell végrehajtanunk ahhoz, hogy a karakterláncokat megjelenítsük a konzolon. Vegyünk egy másik példát.
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
Van egy üres LinkedList
, amelybe több számot szúrunk be. Értékelnünk kell, hogy a példánkban egy szám beszúrásának milyen algoritmikus bonyolultsága van LinkedList
, és hogyan függ ez a lista elemeinek számától. A válasz O(1), azaz állandó komplexitás . Miért? Vegye figyelembe, hogy minden számot beszúrunk a lista elejére. Ezen kívül emlékezni fog arra, hogy ha számot szúr be egy LinkedList
, az elemek nem mozdulnak el sehova. A hivatkozások (vagy hivatkozások) frissülnek (ha elfelejtette a LinkedList működését, nézze meg egyik régi leckénket ). Ha a listánk első száma x
, és az y számot beszúrjuk a lista elejére, akkor csak a következőt kell tennünk:
x.previous = y;
y.previous = null;
y.next = x;
Amikor frissítjük a hivatkozásokat, nem érdekel, hogy hány szám van már a -banLinkedList
, egy vagy egymilliárd. Az algoritmus összetettsége állandó, azaz O(1).