Wit Binar
Ing Jawa, ana macem-macem jinis struktur data. Tumpukan kasebut adhedhasar struktur wit sing diarani wit biner . Wit binar kasusun saka simpul, sing saben bisa duwe maksimal 2 simpul anak:

Tumpukan Max
Max heap (utawa maxheap) minangka wit binar lengkap . Sing penting yaiku simpul induk kudu duwe nilai sing luwih gedhe tinimbang utawa padha karo simpul anak kiwa lan tengen. Yen iki ora dipatuhi, sampeyan ora duwe tumpukan maksimal. Min tumpukan, ing tangan liyane, ngelawan karo ROOT minangka nilai paling cilik karo simpul sukses mundhak ing Nilai; saben simpul anak nduweni nilai sing luwih gedhe tinimbang utawa padha karo induke. Iku uga wit binar lengkap. Conto tumpukan maksimal yaiku:
Kelas PriorityQueue
Heaps ing Jawa bisa diimplementasikake nggunakake Kelas PriorityQueue . PriorityQueues digunakake kanggo nemokake item paling utawa paling penting ing koleksi.Kelas PriorityQueue bisa ditemokake ing java.util.package . PriorityQueues kudu kawangun saka obyek sing iso dibandhingke supaya padha diselehake ing urutan tartamtu ing antrian. PriorityQueue bisa duwe comparator supaya comparison antarane obyek digawe lan antrian kawangun miturut comparison iki. Tuladhane yaiku:
import java.util.Comparator;
import java.util.PriorityQueue;
public class Main
{
public static void main(String[] args) {
// Create PriorityQueue with comparator for ascending order of array length
PriorityQueue intQueue = new PriorityQueue((a,b) -> a - b);
Integer [] array1 = {1, 2, 4, 6, 8, 9};
Integer [] array2 = {3, 6, 9};
Integer [] array3 = {2, 4, 8, 16, 32, 64, 128};
Integer [] array4 = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55};
Integer [] array5 = {4};
//Add the array lengths to intQueue
intQueue.add(array1.length);
intQueue.add(array2.length);
intQueue.add(array3.length);
intQueue.add(array4.length);
intQueue.add(array5.length);
//Write out contents of intQueue as stored
while (intQueue.size() != 0) {
System.out.println(intQueue.remove());
}
}
}
Menehi output:
1 3 6 7 11
Ing conto iki, ukuran standar intQueue yaiku 11, mula durung dicritakake (biasane argumen pisanan sadurunge komparator) lan komparator diwenehi:
(a,b) -> a - b
Iki bakal nggawe mbandhingake antarane item ing intQueue lan ngurutake dadi dawa array saka urutan munggah.
Implementasine PriorityQueue kanggo Nggawe Heap Max
Kelas PriorityQueue standar kanggo tumpukan min tanpa komparator. Min heap minangka kebalikan saka max heap lan ROOT minangka nilai paling cilik lan simpul anak sing berturut-turut luwih gedhe utawa padha karo akar lan kelenjar parental sakteruse. Mulane, kanggo numpuk max, perlu nggunakake reverseOrder () saka framework Koleksi Jawa minangka komparator. Iki bakal njamin kita entuk tumpukan maksimal lan dudu tumpukan min. Kelas iki nduweni cara sing migunani kayata add() , ngemot() , mbusak() , poll() , lan peek() .Metode | Katrangan | Kompleksitas Wektu |
---|---|---|
tambah (J) | Nambahake unsur J ing mburi wit | O (Log N) |
mbusak (J) | Mbusak nilai J saka wit | O(N) |
polling() | Mbusak unsur max saka wit | O (Log N) |
ngintip() | Ngasilake unsur ROOT ing ndhuwur wit | O(1) |
ngandhut (J) | Ngasilake bener yen J ana ing antrian, salah yen ora | O(N) |

mport java.util.Collections;
import java.util.PriorityQueue;
public class MaxHeap {
public static void writeQueue(PriorityQueue<Integer> priorityQueue)
{
// Write out elements in queue, priorityQueue, and remove them using poll()
while(priorityQueue.size() != 0)
{
System.out.println(priorityQueue.poll());
}
}
public static void writeMaxHeap(PriorityQueue<Integer> priorityQueue)
{
// Write out elements in queue as a max heap - root, left child, right child, etc
for (Integer element : priorityQueue) {
System.out.println(element);
}
}
public static void main(String args[])
{
// Array of numbers to create a max heap array from
int[] theArray = {5, 3, 13, 10, 99, 19, 6, 51, 9};
// theQueue is created
PriorityQueue<Integer> theQueue =
new PriorityQueue<Integer>(Collections.reverseOrder());
// Elements are added to theQueue
for (int i = 0 ; i <theArray.length; ++i)
{
theQueue.add(theArray[i]);
}
// The head or root element (priority element) is printed out
System.out.println("The root value is : " + theQueue.peek());
// Find size of theQueue. Use method size()
Integer s = theQueue.size();
System.out.println("Size of theQueue? " + s);
// All elements of theQueue are printed in terms of parent,
// left child, right child
System.out.println("theQueue written using for loop:");
writeMaxHeap(theQueue);
// Does theQueue contain 10? Use method contains()
boolean b = theQueue.contains(10);
System.out.println("Does theQueue contain 10? " + b);
// Erasing value 10 from array using remove()
theQueue.remove(10);
// All elements of theQueue are printed out and removed.
// Each one is the maximum value left in the queue.
// At the end theQueue will be empty
System.out.println("theQueue written out using poll():");
writeQueue(theQueue);
// Find size of theQueue. Use method size()
s = theQueue.size();
System.out.println("Size of theQueue? " + s);
}
}
Output:
99 Ukuran Antrian? 9 antrian ditulis nganggo loop 99 51 19 13 10 5 6 3 9 Apa antrian ngemot 10? true theQueue ditulis nganggo poll() 99 51 19 13 9 6 5 3 Ukuran Antrian? 0
Max Heapify
Algoritma Max Heapify digunakake kanggo mesthekake yen wit binar minangka tumpukan maksimal. Yen kita ana ing simpul, n, lan kelenjar anak sawijining, kiwa lan tengen uga max heaps piyambak, banjur gedhe, kita duwe numpuk max. Yen iki ora kedadeyan ing saindenging wit, mula kita ora duwe tumpukan maksimal. Algoritma Max Heapify digunakake kanggo ngurutake wit supaya manut prinsip maxheap. Max Heapify mung dianggo ing siji simpul. Yen sarat yaiku array kasebut minangka array heap maksimal, mula kabeh sub wit kudu diowahi dadi maxheap sadurunge root, siji-sijine. Algoritma kudu digunakake ing saben simpul. Iki bakal ditindakake ing simpul N / 2 (godhong bakal netepi syarat tumpukan maksimal). Kompleksitas wektu tumpukan yaiku O(NlogN), lan kanggo siji simpul ing dhuwur X, kompleksitas wektu yaiku O(X). Kode ing ngisor iki nuduhake carane maxheapify wit (array).
public class MaxHeapify
{
public static Integer[] maxHeapify(Integer[ ] array, Integer i)
{
// Create left-child and right-child for the node in question
Integer leftChild = 2 * i + 1;
Integer rightChild = 2 * i + 2;
// Assign maxVal to parent node, i
Integer maxVal = i;
// Set maxVal to greater of the two: node or left-child
if( leftChild < array.length && array[leftChild] > array[maxVal] )
maxVal = leftChild;
// Set maxVal to greater of the two: maxVal or right-child
if( rightChild < array.length && array[rightChild] > array[maxVal] )
maxVal = rightChild;
// Check if maxVal is not equal to parent node, then set parent node to
// maxVal, swap values and then do a maxheapify on maxVal
// which is now the previous parent node
if( maxVal != i )
{
Integer value = array[i];
array[i] = array[maxVal];
array[maxVal] = value;
array = maxHeapify(array, maxVal);
}
return array;
}
public static Integer[] maxHeapCreate(Integer array[])
{
// Call maxHeapify to arrange array in a max heap
Integer [] theNewArr = array;
for( Integer i = array.length/2; i >= 0; i-- )
theNewArr = maxHeapify(array, i);
return theNewArr;
}
public static void main(String[] args)
{
// Create array to be maxheapified, theArray,
// and array, newArray, to write results into, by calling maxheapCreate
// newArray will now be a maxheap
Integer[] theArray = {5, 3, 13, 10, 99, 19, 6, 51, 9};
Integer[ ] newArray = maxHeapCreate(theArray);
// Print out contents of newArray
System.out.println("newArray:");
for(int i = 0; i < newArray.length; ++i)
{
System.out.println(newArray[i]);
}
// Print out labelled contents of newArray
System.out.println(" root : " + newArray[0]);
for (int i = 0; i <= newArray.length/2 - 1; i++) {
System.out.print(" parent node : " + newArray[i] + " left child : " +
newArray[(2*i)+1] + " right child :" + newArray[(2*i)+2]);
System.out.println();
}
}
}
Menehi output:
newArray:99 51 19 10 3 13 65 9 root : 99 simpul induk : 99 anak kiwa : 51 anak tengen : 19 simpul induk : 51 anak kiwa : 10 anak tengen : 3 simpul induk : 19 anak kiwa : 13 anak tengen : 6 simpul induk : 10 anak kiwa : 5 tengen bocah :999999999 simpul induk : 99 anak kiwa : 51 anak tengen : 19 simpul induk : 51 anak kiwa : 10 anak tengen : 3 simpul induk : 19 anak kiwa : 13 anak tengen : 6 simpul induk : 10 anak kiwa : 5 anak tengen :999 simpul induk : 99 anak kiwa : 51 anak tengen : 19 simpul induk : 51 anak kiwa : 10 anak tengen : 3 simpul induk : 19 anak kiwa : 13 anak tengen : 6 simpul induk : 10 anak kiwa : 5 anak tengen :96 simpul induk : 10 anak kiwa : 5 anak tengen :96 simpul induk : 10 anak kiwa : 5 anak tengen :9
Ing kode iki, Array digawe lan diisi karo nomer. Array kapindho, newArray , digawe lan wektu iki bakal ngemot asil metode, maxheapCreate , array tumpukan maksimal. Cara maxHeapCreate diarani saka main , lan ing kene array anyar, theNewArr , digawe lan diisi karo asil maxHeapify . Iki ditindakake kanthi ngubungake luwih saka setengah ukuran array input. Kanggo saben pass saka daur ulang, cara maxHeapify , diarani miwiti ing unsur ing tengah Uploaded lan pungkasan karo pisanan. Kanggo saben telpon saka maxHeapify, anak kiwa lan anak tengen simpul tiyang sepah, i, ketemu lan mriksa rampung kanggo nemokake kang paling gedhe saka telu, nemtokake sing minangka maxVal . Yen maxVal ora padha karo simpul induk banjur swap ditindakake supaya simpul induk lan maxVal diganti banjur maxHeapify diarani maneh ing maxVal lan langkah sing padha ditindakake kaya sadurunge. Pungkasane tumpukan maksimal bakal digawe lan ora ana maneh pengulangan sing kudu ditindakake. Array sing dianyari, array , saiki bali menyang utama minangka newArray banjur saben unsur berturut-turut dicithak menyang konsol. newArraysaiki dadi tumpukan maksimal. Elinga, kaya ing conto sadurunge nggunakake PriorityQueue nomer kasebut ditulis: ROOT, anak tengen ROOT minangka wong tuwa, anak kiwa saka ROOT minangka wong tuwa, anak tengen anak tengen pisanan minangka wong tuwa, anak kiwa saka pisanan. anak kiwa minangka wong tuwa, anak tengen anak kiwa pisanan minangka wong tuwa, anak kiwa anak tengen minangka wong tuwa, lan sapiturute. Urutane rada beda karo nalika nggunakake PriorityQueue amarga mbandhingake ditindakake ing antarane unsur sing berturut- turut . dene ing conto maxheapify, simpul dibandhingake karo loro unsur sukses sabanjuré ing Uploaded lan swapped kanggo Nilai paling gedhe. Ing cendhak, loro algoritma beda digunakake. Loro-lorone nggawe tumpukan maksimal.
GO TO FULL VERSION