CodeGym /Java Blog /यादृच्छिक /जावा मध्ये कमाल ढीग
John Squirrels
पातळी 41
San Francisco

जावा मध्ये कमाल ढीग

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले

बायनरी ट्री

Java मध्ये, डेटा स्ट्रक्चर्सचे अनेक प्रकार आहेत. ढीग झाडाच्या संरचनेवर आधारित आहे ज्याला बायनरी ट्री म्हणतात . बायनरी ट्रीमध्ये नोड्स असतात, त्यापैकी प्रत्येकामध्ये जास्तीत जास्त 2 चाइल्ड नोड्स असू शकतात: जावा मधील कमाल ढीग - 2बायनरी ट्रीमध्ये पॅरेंट नोड असतात ज्यात 0 ते 2 नोड्स असू शकतात. यात लेफ्ट-चाइल्ड नोड आणि/किंवा राइट-चाइल्ड नोड किंवा कोणतेही नोड असू शकतात. पूर्ण बायनरी ट्रीमध्ये, शेवटच्या स्तराशिवाय सर्व नोड्स भरले जातात जे पूर्ण असू शकतात, परंतु ते पूर्ण असणे आवश्यक नाही. शेवटचा स्तर, nवा स्तर, 1 ते 2n नोड्स असू शकतो, जेथे पहिला n = 0 वर आहे आणि मूळ आहे.जावामधील कमाल ढीग - 3

कमाल ढीग

मॅक्स हीप (किंवा मॅक्सहीप) हे संपूर्ण बायनरी ट्री आहे . त्याबद्दल महत्त्वाची गोष्ट अशी आहे की पॅरेंट नोडचे मूल्य लेफ्ट- आणि राइट-चाइल्ड नोड्सपेक्षा मोठे किंवा समान असणे आवश्यक आहे. याचे पालन न केल्यास, तुमच्याकडे कमाल ढीग नाही. याउलट, मिन हीप, रूटच्या विरुद्ध आहे कारण एकामागून एक नोड्सचे मूल्य वाढते; प्रत्येक चाइल्ड नोडचे मूल्य त्याच्या पालकापेक्षा मोठे किंवा समान असते. हे एक संपूर्ण बायनरी वृक्ष देखील आहे. कमाल हीपचे उदाहरण आहे: जावा मधील कमाल ढीग - 4अॅरेमधून कमाल हीप तयार करता येते. या अॅरेचा विचार झाडाच्या दृष्टीने केला जाईल. हिपसाठी, जर रूट, (वृक्षाचा वरचा मूळ नोड) पोझिशन (इंडेक्स) n वर संग्रहित केला असेल, तर त्याची व्याख्या array, theArray , theArray[n] म्हणून केली जाते.. डावे- आणि उजवे-चाइल्ड नोड्स अनुक्रमे Array[2n+1] आणि theArray[2n+2] येथे आहेत . कमाल हीपसाठी, रूट अ‍ॅरे[0] वर आहे . स्तर n साठी, रूट n = 0: theArr[n] हा मूळ नोड आहे theArr[(2*n)+1] हा डावा चाइल्ड नोड आहे theArr[(2*n)+2] हा उजवा चाइल्ड नोड आहे

अग्रक्रम रांग वर्ग

PriorityQueue क्लास वापरून Java मधील Heaps लागू केले जाऊ शकतात . PriorityQueue चा वापर संग्रहातील सर्वात किंवा कमीत कमी महत्त्वाचा आयटम शोधण्यासाठी केला जातो. PriorityQueue वर्ग java.util.package मध्ये आढळू शकतो . प्राधान्याच्या रांगांमध्ये तुलना करता येण्याजोग्या वस्तू बनवल्या पाहिजेत जेणेकरून त्या रांगेत एका विशिष्ट क्रमाने ठेवल्या जातील. PriorityQueue मध्ये एक तुलनाकर्ता असू शकतो जेणेकरून ऑब्जेक्ट्समधील तुलना केली जाईल आणि या तुलनेनुसार रांग तयार होईल. एक उदाहरण आहे:

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());
        }
    }          
}
आउटपुट देणे:
1 3 6 7 11
या उदाहरणात, intQueue चा डीफॉल्ट आकार 11 आहे, म्हणून सांगितलेला नाही (सामान्यत: तुलनाकर्त्यासमोरील पहिला युक्तिवाद) आणि तुलनाकर्ता खालीलप्रमाणे दिलेला आहे:
(a,b) -> a - b
हे intQueue मधील आयटमची तुलना करेल आणि चढत्या क्रमाच्या अॅरे लांबीमध्ये क्रमवारी लावेल.

जास्तीत जास्त ढीग तयार करण्यासाठी प्राधान्यक्रमाची अंमलबजावणी

PriorityQueue क्लास डीफॉल्ट min heap मध्ये तुलनेकाशिवाय होतो . मिन हीप कमाल हीपच्या विरुद्ध आहे आणि म्हणून रूट हे सर्वात लहान मूल्य आहे आणि लागोपाठ चाइल्ड नोड्स रूट आणि त्यानंतरच्या पॅरेंटल नोड्सपेक्षा मोठे किंवा समान आहेत. या कारणास्तव, कमाल हीपसाठी, जावाच्या कलेक्शन फ्रेमवर्कमधील रिव्हर्सऑर्डर () तुलनाकर्ता म्हणून वापरणे आवश्यक आहे . हे सुनिश्चित करेल की आम्हाला किमान ढीग नाही तर जास्तीत जास्त ढीग मिळेल. या वर्गात add() , contains() , remove() , poll() , आणि peek() सारख्या उपयुक्त पद्धती आहेत .
पद्धत वर्णन वेळेची गुंतागुंत
जोडा(जे) झाडाच्या शेवटी जे घटक जोडतो O(LogN)
काढा(J) झाडापासून J मूल्य काढा O(N)
मतदान() झाडाचा जास्तीत जास्त घटक काढून टाकतो O(LogN)
डोकावून पाहणे() झाडाच्या शीर्षस्थानी मूळ घटक मिळवते O(1)
समाविष्टीत आहे(J) J रांगेत असल्यास सत्य मिळवते, नसल्यास असत्य मिळवते O(N)
घटक रांगेत जोडले जातात आणि ते कोणत्याही क्रमाने असू शकतात. नवीन PriorityQueue रांग त्या घटकांना उलट क्रमाने कमाल हीप म्हणून संग्रहित करेल. जेव्हा रांग लिहिली जाते, तेव्हा क्रम असा असेल: मूळ डावे-मुल पालक म्हणून रूटसह (डावे-बाल_1) मूळ-पालक म्हणून उजवे-मुल (उजवे-बाल_1) डावे-मुल डावे-बाल_1 पालक म्हणून (लेफ्ट-चाइल्ड_2) ) उजव्या-मुलासह डावे-मुल_1 पालक म्हणून (उजवे-मुल_2) डावे-मुल उजवे-मुलासह_1 पालक म्हणून (डावे-मुल_3) उजवे-मुल उजवे-बालक_1 पालक म्हणून (उजवे-मुल_3) डावे-मुल डावे-मुलासह_2 पालक म्हणून (डावे-मुल_4) उजवे-मुलासह डावे-मुल_2 पालक म्हणून (उजवे-मुल_4), इ.जावा मधील कमाल ढीग - 5खालील कोड हे java मध्ये max heap (maxheap) कसे तयार केले जाते याचे उदाहरण आहे. पहिली गोष्ट म्हणजे अॅरे भरणे ज्यासाठी कमाल हीप तयार केली जाईल. याला अॅरे म्हणतात . पुढे, PriorityQueue , theQueue , तयार होते आणि नंतर Array मधील घटक त्यात जोडले जातात. हे रांगेच्या शेवटी 10 जोडण्यासाठी add() , उदा. theQueue.add(10) ही पद्धत वापरते . PriorityQueue क्लासची काही कार्यक्षमता स्पष्ट करण्यासाठी , मेथड peek() नंतर हीपचे हेड शोधण्यासाठी वापरले जाते, आणि हे कमाल मूल्य आहे, या प्रकरणात, 99. पुढील कार्य म्हणजे ढिगाचा आकार तपासणे. आकार वापरून ()जे 9 असल्याचे आढळले आहे आणि हे कन्सोलवर छापले आहे. मेथड writeMaxHeap रांगेतील घटक रूटच्या क्रमाने लिहिते, मूल म्हणून डावे मूल, पालक म्हणून मूळ असलेले उजवे मूल, पालक म्हणून पहिले डावे मूल असलेले डावे मूल, पालक म्हणून उजवे मूल, पहिले डावे मूल असे पालक, उजवे-मुल पहिल्या उजव्या-मुलासह पालक म्हणून, डावे-मुलासह पहिले उजवे-मुल पालक म्हणून इ., त्यानंतरच्या मूल्यांसह डावे आणि उजवे मुले पालक म्हणून वरील क्रमाने वापरतात. PriorityQueue मेथडमध्ये समाविष्ट(J) एक विशिष्ट घटक, J, रांगेत आहे की नाही हे शोधण्यासाठी वापरले जाते . या प्रकरणात आम्ही J = 10 शोधतो. आमच्या उदाहरणात, हे खरे आहे की हे रांगेत आहे म्हणून हे कन्सोलवर सत्य म्हणून लिहिले आहे. दुसरी प्रायोरिटी क्यू पद्धत, remove(J) नंतर रांगेतून J = 10 काढण्यासाठी वापरली जाते . PriorityQueue ची अधिक कार्यक्षमता स्पष्ट करण्यासाठी , मेथड पोल() चा वापर हेड एलिमेंट (जास्तीत जास्त मूल्य) काढून टाकण्यासाठी वेळ लूप वापरून केला जातो, प्रत्येक वेळी नवीन रांगेतील हेड एलिमेंट काढून टाकून आणि प्रत्येक वेळी रांगेचा आकार एकने कमी केला जातो. हे पध्दत writeQueue मध्ये घडतेमुख्य वरून कॉल केला. प्रत्येक वेळी काढलेला घटक कन्सोलवर मुद्रित केला जातो. मूळ रांगेत शेवटी कोणतेही घटक शिल्लक राहणार नाहीत. मुद्रित घटक हे मूल्याच्या उतरत्या क्रमाने जास्तीत जास्त ढीग असतात, जेथे प्रत्येक वेळी रांगेचे शीर्ष मुद्रित केले जाते.

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);
       }
   }
आउटपुट:
99 रांगेचा आकार? 9 the Queue for loop 99 51 19 13 10 5 वापरून लिहिलेले 6 3 9 रांगेत 10 आहेत का? poll() 99 51 19 13 9 वापरून लिहिलेली रांग खरे आहे 6 5 3 रांगेचा आकार? 0

कमाल Heapify

बायनरी ट्री कमाल हीप आहे याची खात्री करण्यासाठी Max Heapify अल्गोरिदम वापरला जातो. जर आपण नोडवर आहोत, n, आणि त्याचे चाइल्ड नोड्स, डावे आणि उजवे देखील स्वतःच कमाल ढीग आहेत, तर उत्तम, आपल्याकडे कमाल ढीग आहे. जर संपूर्ण झाडामध्ये असे होत नसेल तर आमच्याकडे कमाल ढीग नाही. Max Heapify अल्गोरिदम ट्री क्रमवारी लावण्यासाठी वापरले जाते जेणेकरून ते maxheap तत्त्वांचे पालन करते. Max Heapify केवळ एका नोडवर कार्य करते. जर अ‍ॅरे कमाल हीप अ‍ॅरे असेल, तर सर्व उप झाडे एका वेळी एक, रूटच्या आधी maxheap मध्ये रूपांतरित करणे आवश्यक आहे. प्रत्येक नोडवर अल्गोरिदम वापरणे आवश्यक आहे. हे N/2 नोड्सवर केले जाईल (पाने जास्तीत जास्त ढीग आवश्यकतांचे पालन करतील). हीपची वेळ जटिलता O(NlogN) आहे आणि X उंचीवरील एका नोडसाठी, वेळेची जटिलता O(X) आहे. खालील कोड ट्री (अॅरे) कसे जास्तीत जास्त हेप करायचे ते दाखवते.

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();
       }
  }
}
आउटपुट देणे:
नवीन अॅरे:99 51 19 10 3 13 65 9 रूट : 99 पालक नोड : 99 डावे मूल : 51 उजवे मूल : 19 पालक नोड : 51 डावे मूल : 10 उजवे मूल : 3 पालक नोड : 19 डावे मूल : 13 उजवे मूल : 6 पालक नोड : 10 डावे मूल : 5 उजवे मूल :9९९९९९९99 पालक नोड : 99 डावे मूल : 51 उजवे मूल : 19 पालक नोड : 51 डावे मूल : 10 उजवे मूल : 3 पालक नोड : 19 डावे मूल : 13 उजवे मूल : 6 पालक नोड : 10 डावे मूल : 5 उजवे मूल : 999 पालक नोड : 99 डावे मूल : 51 उजवे मूल : 19 पालक नोड : 51 डावे मूल : 10 उजवे मूल : 3 पालक नोड : 19 डावे मूल : 13 उजवे मूल : 6 पालक नोड : 10 डावे मूल : 5 उजवे मूल : 96 पालक नोड : 10 डावे मूल : 5 उजवे मूल :96 पालक नोड : 10 डावे मूल : 5 उजवे मूल :9
या कोडमध्ये, Array तयार केला जातो आणि संख्यांनी भरलेला असतो. दुसरा अ‍ॅरे, newArray , तयार केला आहे आणि यावेळी त्यात पद्धतीचा परिणाम असेल, maxheapCreate , कमाल हीप अ‍ॅरे. मेथड maxHeapCreate मुख्य वरून कॉल केली जाते , आणि येथे नवीन अॅरे, theNewArr , तयार केली जाते आणि maxHeapify परिणामांनी भरली जाते. हे इनपुट अॅरेच्या अर्ध्या आकारापेक्षा जास्त लूप करून केले जाते. लूपच्या प्रत्येक पाससाठी, पद्धत maxHeapify , ज्याला अॅरेच्या मध्यभागी असलेल्या घटकापासून प्रारंभ करणे आणि पहिल्यासह समाप्त करणे असे म्हणतात. maxHeapify च्या प्रत्येक कॉलसाठी, पॅरेंट नोड, i, चे डावे मूल आणि उजवे मूल आढळले आणि maxVal म्हणून परिभाषित करून, तीनपैकी सर्वात मोठे कोणते आहे हे शोधण्यासाठी तपासले जातात . जर maxVal हे पॅरेंट नोडच्या बरोबरीचे नसेल तर स्वॅप केले जाते जेणेकरून पॅरेंट नोड आणि maxVal स्वॅप केले जातील आणि नंतर maxHeapify या वेळी maxVal वर पुन्हा कॉल केला जाईल आणि पूर्वीप्रमाणेच स्टेप्स केल्या जातील. अखेरीस जास्तीत जास्त ढीग तयार केला जाईल आणि पुढे जाण्यासाठी कोणतीही पुनरावृत्ती होणार नाही. अपडेट केलेला अॅरे, अॅरे , आता नवीन अॅरे म्हणून मुख्यवर परत केला जातो आणि नंतर प्रत्येक सलग घटक कन्सोलवर छापला जातो. नवीन अॅरेआता कमाल ढीग आहे. लक्षात घ्या, की प्राधान्यक्रम वापरून मागील उदाहरणाप्रमाणे संख्या लिहिल्या आहेत: मूळ, मूळचे उजवे मूल पालक म्हणून, मूळचे डावे-मुलाचे पालक म्हणून, उजवे-मुलाचे पहिले उजवे-मुलाचे पालक म्हणून, पहिल्याचे डावे मूल पालक म्हणून डावे-मुल, पालक म्हणून पहिल्या डाव्या-मुलाचे उजवे-मुल, पालक म्हणून पहिल्या उजव्या-मुलाचे डावे-मुल, इ. ते PriorityQueue वापरताना त्यांच्यापेक्षा थोड्या वेगळ्या क्रमाने असतात कारण तुलना सलग घटकांमध्ये केली जाते तर maxheapify उदाहरणामध्ये, नोडची अॅरेमधील पुढील दोन सलग घटकांशी तुलना केली जाते आणि सर्वात मोठ्या मूल्यासाठी स्वॅप केले जाते. थोडक्यात, दोन भिन्न अल्गोरिदम वापरले जातात. दोन्ही कमाल ढीग तयार करतात.

निष्कर्ष

म्हणून येथे आपण max heap आणि ते PriorityQueue किंवा Max Heapify अल्गोरिदमसह कसे तयार केले जाऊ शकते ते पाहिले आहे . रिव्हर्सऑर्डर() सह PriorityQueue वापरणे हा हे करण्याचा एक व्यवस्थित मार्ग आहे आणि शिफारस केलेली पद्धत आहे. तथापि, तुम्ही या उदाहरणांचा अभ्यास करू शकता आणि तुमच्या स्वतःच्या पद्धती लिहू शकता कारण हा एक चांगला कोडिंग व्यायाम असेल जो तुम्हाला जावा ज्युनियरसाठी तुमच्या मुलाखतीत यशस्वी होण्यास मदत करेल.
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION