Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
1. Pochopenie základov
* HEAP Vlastnosť: Halda udržiava konkrétny poriadok. V minimálnom have je kľúč rodičovského uzla vždy menší alebo rovný svojim deťom. V maximálnom have je kľúč rodičovského uzla vždy väčší alebo rovný svojim deťom.
* `priorityqueue` v Java: `Priorityqueue` predvolene implementuje ministerstvo. Môžete si ho prispôsobiť ako maximálny program pomocou vlastného „porovnávača“.
* Čas zložitosť:
* `add (element)`:o (log n) v priemere (kde n je počet prvkov v halde)
* `remove ()` (odstraňuje koreň, min alebo max):o (log n)
* `peek ()` (vráti koreň):o (1)
* `obsahuje (element)`:o (n) v najhoršom prípade. Haldy nie sú * efektívne na hľadanie ľubovoľných prvkov.
* Budovanie hromady z poľa:O (n)
2. Základné techniky a prípady použitia
* Nájdenie najmenších/najväčších prvkov K: Jedná sa o klasickú aplikáciu haldy.
* k najmenšie:
1. Vytvorte maximálnu heap veľkosti `k` z prvých prvkov vášho súboru údajov.
2. Iterujte prostredníctvom zostávajúcich prvkov. Ak je prvok menší ako koreň maximálneho haim, odstráňte koreň a vložte nový prvok.
3. Po spracovaní všetkých prvkov bude maximálny herec obsahovať najmenšie prvky „K`.
* k najväčšie:
1. Vytvorte ministerstvo veľkosti `k` z prvých prvkov„ K` vo svojom súbore údajov.
2. Iterujte prostredníctvom zostávajúcich prvkov. Ak je prvok väčší ako koreň Min-Heap, odstráňte koreň a vložte nový prvok.
3. Po spracovaní všetkých prvkov bude ministerstvo najväčších prvkov `k`.
`` `Java
import java.util.priorityqueue;
import java.util.comparator;
import java.util.list;
import java.util.arraylist;
public class heapexamples {
public statický zoznam
Priorityqueue
pre (int num:nums) {
if (minheap.size ()
} else if (num> minheap.peek ()) {
Minheap.Poll (); // Odstráňte najmenšie
Minheap.add (num); // Pridajte nový, väčší prvok
}
}
// Konvertujte haldu na zoznam (voliteľné, pre konkrétne objednávanie)
Zoznam
Klarges.sort (Comparator.reverseorder ()); // Zoradiť zostupný pre najväčší až najmenší
Návrat Klargest;
}
public statický zoznam
Priorityqueue
pre (int num:nums) {
if (maxHeap.size ()
} else if (num
maxheap.add (num); // Pridajte nový, menší prvok
}
}
// Konvertujte haldu na zoznam (voliteľné, pre konkrétne objednávanie)
Zoznam
Kshallest.sort (Comparator.NaturalDorDer ()); // Zoradiť stúpanie na najmenšie až najväčšie
návrat ksmalest;
}
public static void main (String [] args) {
int [] data ={5, 2, 9, 1, 5, 6};
int k =3;
Zoznam
System.out.println ("K najväčší:" + najväčší); // Výstup:K najväčší:[9, 6, 5]
Zoznam
System.out.println ("k najmenší:" + najmenší); // Výstup:k najmenší:[1, 2, 5]
}
}
`` `
* Zlúčenie K zoradené zoznamy:
1. Vytvorte ministerstvo na uloženie prvého prvku z každého zoznamu. Každý prvok v halde by mal uložiť hodnotu * a * index zoznamu, z ktorého pochádza.
2. Opakovane odstráňte minimálny prvok z haldy. Toto je ďalší prvok v zlúčnom zoradenom zozname.
3. Ak zoznam, z ktorého vylúčený prvok prišiel, má viac prvkov, pridajte ďalší prvok z tohto zoznamu do haldy.
4. Pokračujte, až kým nebude hromada prázdna.
`` `Java
import java.util.priorityqueue;
import java.util.list;
import java.util.arraylist;
public triedy MergesortedLists {
Private Static Class uzol implementuje porovnateľné
hodnota int;
Int ListIndex;
int elementIndex;
public node (int value, int listIndex, int elementIndex) {
this.value =value;
this.ListIndex =ListIndex;
this.ElementIndex =elementIndex;
}
@Override
public int compareto (uzol iný) {
return Integer.comPare (this.value, int.value);
}
}
Verejný statický zoznam
Zoznam
Priorityqueue
// Pridajte prvý prvok z každého zoznamu do haldy
pre (int i =0; i
MinHeap.add (nový uzol (zoznam.get (i) .get (0), i, 0));
}
}
while (! minheap.isempty ()) {
Uzol prúd =minheap.poll ();
mergedList.add (current.value);
int listIndex =current.ListIndex;
int elementIndex =current.ElementIndex;
// Pridajte ďalší prvok z toho istého zoznamu, ak existuje
if (elementIndex + 1
}
}
návrat Zlúčené zoznam;
}
public static void main (String [] args) {
Zoznam
zoznam.add (List.of (1, 4, 7));
zoznam.add (List.of (2, 5, 8));
zoznam.add (List.of (3, 6, 9));
Zoznam
System.out.println ("Zlučovaný zoznam:" + zlúčené); // Výstup:Zlúčené zoznam:[1, 2, 3, 4, 5, 6, 7, 8, 9]
}
}
`` `
* Prioritné fronty Aplikácie:
* Plánovanie úloh: Uprednostnite úlohy na základe naliehavosti a vykonajte ich v poriadku.
* grafové algoritmy (Dijkstra, a*): Uložte uzly, ktoré sa majú navštíviť na základe ich odhadovanej vzdialenosti od zdroja.
* Simulácia udalostí: Procesné udalosti v chronologickom poradí.
3. Dôležité úvahy pre veľké údaje
* Správa pamäte: Ak je váš súbor údajov * extrémne * veľký a nezmestí sa do pamäti, zvážte:
* Externé triedenie (zlúčiť zoradenie s hromádou): Rozdeľte údaje na menšie kúsky, ktoré sa zmestia do pamäte, zoradte každý kúsok (pomocou haldy alebo iných metód) a potom zlúčte zoradené kúsky pomocou haldy. Zahŕňa to čítanie a písanie údajov na disk.
* Streamovacie algoritmy: Algoritmy určené na spracovanie údajov v jednom priechode, čím sa minimalizujú využitie pamäte. Zatiaľ čo čistá halda nemusí byť vhodný na streamovanie vo všetkých prípadoch, môžete použiť techniky, ako je odber vzoriek nádrže v spojení s haldami.
* Vlastný komparátor: V prípade komplexných objektov implementujte „porovnávací“, ktorý definuje, ako by sa vaše objekty mali porovnávať v halde.
* Zbierka odpadu: Veľké haldy môžu vyvíjať tlak na zberateľ odpadu. Majte na pamäti tvorbu a likvidáciu objektov, aby ste predišli prekážkam výkonu.
* Profiling: Použite profilovacie nástroje na identifikáciu výkonnostných hotspotov vo vašom kóde. To vám môže pomôcť zistiť, či sú haldy operácie prekážkou a či ich potrebujete ďalej optimalizovať.
* primitívne typy (ak je to možné): Ak pracujete s primitívnymi typmi (napr. `Int`,` double`), zvážte použitie `int []` alebo `double []` ako podkladové úložisko pre vašu haldu, a nie „celé číslo alebo` double` objekty. To môže znížiť režijné náklady na pamäť a zlepšiť výkon. Potom by ste implementovali logiku haldy sami (pomocou indexov polí). Je to potrebné iba v scenároch citlivých na výkon.
* predprupka: Ak poznáte približnú maximálnu veľkosť vašej haldy vopred, vopred prepojte „priorityqueue“ s touto kapacitou. To môže zabrániť zmenám veľkosti operácií, ktoré môžu byť nákladné.
Príklad:Prioritné záznamy protokolov
Predstavte si, že spracovávate veľký protokolový súbor a musíte extrahovať najdôležitejšie záznamy protokolov na základe skóre závažnosti.
`` `Java
import java.util.priorityqueue;
import java.util.comparator;
import java.util.list;
import java.util.arraylist;
Logentry triedy {
Správa String;
int závažnosť;
public logentry (String Message, int závažnosť) {
this.Message =správa;
this.Severity =závažnosť;
}
@Override
public String toString () {
return "logentry {" +
"message ='" + správa +' \ '' +
", závažnosť =" + závažnosť +
'}';
}
}
verejná trieda Loganalyzer {
public statický zoznam
Priorityqueue
pre (logntry log:logs) {
if (minheap.size ()
} else if (log.getSeVerity ()> minHeap.peek (). getSeverity ()) {
Minheap.Poll ();
MinHeap.add (log);
}
}
Zoznam
criticallogs.sort (Comparator.comParingInt (Logentry ::GetSeverity) .reversed ());
návrat kritikov;
}
public static void main (String [] args) {
Zoznam
logs.add (nový Logentry („Chyba nízkej priority“, 1));
logs.add (nový Logentry („Varovanie v oblasti priority strednej priority“, 5));
logs.Add (nový Logentry („Critical Error - System Crash“, 10));
logs.add (nový Logentry („Ďalšia udalosť s nízkou prioritou“, 2));
logs.add (nový Logentry („Vydanie siete s vysokou prioritou“, 8));
logs.add (nový Logentry („Problém databázy strednej priority“, 6));
int n =3;
Zoznam
System.out.println ("Najdôležitejšie protokoly:" + kritické);
// output:Väčšina kritických protokolov:[Logentry {Message ='Critical Error - System Crash', závažnosť =10}, Logentry {Message ='High Priority Network Problém', závažnosť =8}, Logentry {Message ='Problém s databázou strednej priority', závažnosť =6}]
}
}
`` `
v súhrne:
Haldy sú výkonné na nájdenie extrémnych hodnôt (min/max) a priority prvkov v súbore údajov. Pri riešení veľkého množstva údajov nezabudnite na využitie pamäte, v prípade potreby zvážte techniky externého triedenia a profilujte svoj kód na identifikáciu a riešenie prekážok výkonu. Trieda „Priorityqueue“ v Java je pohodlným východiskovým bodom, ale možno ju budete musieť prispôsobiť alebo implementovať svoju vlastnú logiku haldy pre konkrétne prípady použitia a obmedzenia pamäte.