CodeGym /Java Blog /यादृच्छिक /उदाहरणांसह Java मधील किमान ढीग
John Squirrels
पातळी 41
San Francisco

उदाहरणांसह Java मधील किमान ढीग

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
आम्ही प्रारंभ करण्यापूर्वी, असे गृहीत धरले जाते की तुम्हाला बायनरी ट्रीबद्दल माहिती आहे (बायनरी ट्रीमध्ये, प्रत्येक नोड त्याच्या डाव्या सबट्रीमधील सर्व कींपेक्षा मोठी आणि उजव्या सबट्रीमधील सर्व कींपेक्षा कमी की संग्रहित करते ) . तर, बायनरी हीप हे संपूर्ण बायनरी ट्री आहे जे मिन-हिप किंवा कमाल-हेप ऑर्डरिंग प्रॉपर्टीचे समाधान करते.. जर तुम्हाला या संकल्पनांची माहिती नसेल, तर आम्ही तुम्हाला या एक पूर्व शर्त म्हणून समजून घेण्याची शिफारस करतो. अनेक नवशिक्या प्रोग्रामर Heaps, Min Heaps आणि Priority Quues या संकल्पनेशी संघर्ष करू शकतात. या पोस्टमध्ये आम्ही ढीग Min-Heaps पेक्षा कसे वेगळे आहेत आणि किमान ढीग कार्यान्वित करण्यासाठी आम्ही प्राधान्य रांग कसे वापरू शकतो हे पाहण्यासाठी सखोल माहिती घेऊ.

मिन हीप म्हणजे काय?

मिन-हिपमध्ये असा गुणधर्म असतो की लेव्हल 'n' वरील प्रत्येक नोडमध्ये 'n+1' लेव्हलवरील मुलांपेक्षा कमी किंवा समान मूल्य साठवले जाते. कारण मुळाचे मूल्य त्याच्या मुलांपेक्षा कमी किंवा समान असते, ज्याची मूल्ये त्यांच्या मुलांपेक्षा कमी किंवा समान असतात, रूट सर्व मूल्यांची किमान झाडामध्ये साठवणूक करते.

उदाहरण

जावा मधील किमान ढीग उदाहरणांसह - 2
आकृती 1: एक साधा मिन हीप
लक्षात घ्या की मिन-हिप किंवा कमाल-हिपमध्ये नोडचे मूल्य आणि त्याच्या भावामधील कोणतेही आवश्यक संबंध नाहीत. उदाहरणार्थ, हे शक्य आहे की रूटच्या डाव्या सबट्रीमधील सर्व नोड्सची मूल्ये उजव्या सबट्रीच्या प्रत्येक नोडच्या मूल्यांपेक्षा जास्त आहेत.जावा मधील किमान ढीग उदाहरणांसह - 3
आकृती 2: डाव्या चाइल्ड नोड्स > उजव्या चाइल्ड नोड्ससह किमान ढीग

Java मध्ये मिन हीपचे प्रतिनिधित्व

मिन हीपचे प्रतिनिधित्व करण्यासाठी सर्वात सामान्यपणे वापरली जाणारी डेटा रचना एक साधी अॅरे आहे. नवशिक्या म्हणून तुम्हाला "अॅरे" ला "मिन-हेप" सह गोंधळात टाकण्याची गरज नाही. मिन-हेपच्या नोड्स / एलिमेंट्सची व्हॅल्यू अ‍ॅरेमध्ये साठवली जातात म्हणून तुम्ही ते पाहू शकता . जसे आमच्याकडे Java मध्ये “ ट्री ” संग्रहित करण्यासाठी कोणतीही डेटा संरचना नाही आणि आम्ही त्यासाठी “नोड” तयार करतो किंवा “ग्राफ” संग्रहित करण्यासाठी “नकाशा” वापरतो .उदाहरणांसह Java मधील किमान ढीग - 4
आकृती 3: आकृती 2 मधील ढिगाचे अॅरे प्रतिनिधित्व
खालील सूत्रांचा वापर करून तुम्ही पालक, उजव्या किंवा डाव्या चाइल्ड नोड्समध्ये कसे प्रवेश करू शकता हे आम्ही दाखवून देणार आहोत.
  • चला minHeap[] हा एक पूर्णांक अ‍ॅरे आहे ज्यात इंडेक्स “ i = 0; "
  • minHeap[(i - 1) / 2] मूळ नोड परत करते.
  • minHeap[(i*2) + 2] उजवा चाइल्ड नोड परत करतो.
  • minHeap[(i * 2) + 1] डावा चाइल्ड नोड परत करतो.
वर दिलेल्या आकृती # 2 चा विचार केल्यास, रूट (पालक) = 3 चे मूल्य, डावे चाइल्ड नोड 13 आणि उजवे चाइल्ड नोड = 7 आहे.

Java मध्ये मिन हीपची अंमलबजावणी - अॅरे वापरणे

अ‍ॅरे वापरून Heaps ची मूलभूत अंमलबजावणी पाहू या, ज्यामध्ये घटकाची सध्याची स्थिती म्हणून अनुक्रमणिका आणि आकार अ‍ॅरेच्या एकूण आकाराप्रमाणे आहे.

import java.util.Arrays;
public class MinHeap 
{
	private int[] Heap;
	private int index;
	private int size;

	public MinHeap(int size) {
		this.size = size;
		this.index = 0;
		Heap = new int[size];
	}

	private int parent(int i) {
		return (i - 1) / 2;
	}

	private int leftChild(int i) {
		return (i * 2) + 1;
	}

	private int rightChild(int i) {
		return (i * 2) + 2;
	}

	private boolean isLeaf(int i) {
		if (rightChild(i) >= size || leftChild(i) >= size) {
			return true;
		}
		return false;
	}

	public void insert(int element) {
		if (index >= size) {
			return;
		}
		Heap[index] = element;
		int current = index;

		while (Heap[current] < Heap[parent(current)]) {
			swap(current, parent(current));
			current = parent(current);
		}
		index++;
	}

	// removes and returns the minimum element from the heap
	public int remove() {
     // since its a min heap, so root = minimum
		int popped = Heap[0]; 
		Heap[0] = Heap[--index];
		minHeapify(0);
		return popped;
	}

	// heapify the node at i
	private void minHeapify(int i) {
	// If the node is a non-leaf node and any of its child is smaller
		if (!isLeaf(i)) {
			if (Heap[i] > Heap[leftChild(i)] || 
                  Heap[i] > Heap[rightChild(i)]) {
				if (Heap[leftChild(i)] < Heap[rightChild(i)]) {
					swap(i, leftChild(i));
					minHeapify(leftChild(i));
				} else {
					swap(i, rightChild(i));
					minHeapify(rightChild(i));
				}
			}
		}
	}

	// builds the min-heap using the minHeapify
	public void minHeap() {
		for (int i = (index - 1 / 2); i >= 1; i--) {
			minHeapify(i);
		}
	}

     // Function to print the contents of the heap
	public void printHeap() {
		for (int i = 0; i < (index / 2); i++) {
			System.out.print("Parent : " + Heap[i]);
			if (leftChild(i) < index)
				System.out.print(" Left : " + Heap[leftChild(i)]);
			if (rightChild(i) < index)
				System.out.print(" Right :" + Heap[rightChild(i)]);
			System.out.println();
		}
	}
	// swaps two nodes of the heap
	private void swap(int x, int y) {
		int tmp;
		tmp = Heap[x];
		Heap[x] = Heap[y];
		Heap[y] = tmp;
	}
	public static void main(String[] arg) 
      {
	    MinHeap minHeap = new MinHeap(7);
	    minHeap.insert(3);
	    minHeap.insert(13);
	    minHeap.insert(7);
          minHeap.insert(16);
	    minHeap.insert(21);
	    minHeap.insert(12);
	    minHeap.insert(9);
	    minHeap.minHeap();

	   System.out.println("The Min Heap is : " + Arrays.toString(minHeap.Heap);
	   minHeap.printHeap();
	   System.out.println("\nThe Min Value is : " + minHeap.remove());
	   System.out.println("\nThe Min Heap is :"+ Arrays.toString(minHeap.Heap));
	   minHeap.printHeap();
	}
}
आउटपुट
किमान ढीग आहे : [३, १३, ७, १६, २१, १२, ९] पालक : ३ डावीकडे : १३ उजवीकडे : ७ पालक : १३ डावीकडे : १६ उजवी : २१ पालक : ७ डावीकडे : १२ उजवी : ९ किमान मूल्य आहे : 3 किमान ढीग आहे : [7, 13, 9, 16, 21, 12, 9] // मूळ मूळ काढून टाकल्यानंतर : 7 डावीकडे : 13 उजवीकडे :9 पालक : 13 डावीकडे : 16 उजवीकडे : 21 पालक : 9 डावीकडे: १२

प्राधान्य रांगा

प्राधान्य रांग ही एक विशेष प्रकारची रांग आहे ज्यामध्ये प्रत्येक घटक प्राधान्याशी संबंधित असतो आणि त्याच्या प्राधान्यानुसार ठेवला जातो. मिन हीपच्या सुलभ अंमलबजावणीसाठी, आम्ही Java.util.PriorityQueue हा वर्ग वापरतो . जर दिलेले घटक प्राधान्यक्रमात क्रमवारी लावायचे/ ठेवायचे असतील तर प्राधान्य रांग वापरली जाते. प्राधान्य रांग ही साध्या रांगेपेक्षा वेगळी असते कारण मानक रांग फर्स्ट-इन-फर्स्ट-आउट ( FIFO ) अल्गोरिदमचे अनुसरण करतात, परंतु काहीवेळा रांगेतील घटकांवर प्राधान्यक्रमानुसार प्रक्रिया करणे आवश्यक आहे, म्हणूनच प्राधान्य रांगेची रचना केली जाते. जेव्हा तुम्ही प्राधान्य रांगेत घटक जोडता, तेव्हा डीफॉल्टनुसार एक मिनिट हीप तयार केली जाते.

सामान्य ऑपरेशन्स

आम्ही अंमलबजावणीकडे जाण्यापूर्वी येथे java.util.PriorityQueue मधील काही सामान्य ऑपरेशन्स आहेत ज्या तुम्हाला माहित असणे आवश्यक आहे.
  • add(int element) प्राधान्य रांगेत निर्दिष्ट घटक समाविष्ट करते.
  • remove(int element) या रांगेतून निर्दिष्ट घटकाचा एकच प्रसंग काढून टाकतो, जर तो उपस्थित असेल.
  • peek() या रांगेचे प्रमुख पुनर्प्राप्त करते, परंतु काढत नाही, किंवा रांग रिकामी असल्यास शून्य परत करते.
  • poll() या रांगेचे प्रमुख पुनर्प्राप्त करते आणि काढून टाकते, किंवा ही रांग रिकामी असल्यास शून्य परत करते.
  • या रांगेत निर्दिष्ट घटक असल्यास contains() "true" मिळवते.
  • size() या प्राधान्य रांगेत/मिनहेपमधील घटकांची संख्या परत करते.

प्राधान्य रांग वापरून Java मध्ये मिन हीपची अंमलबजावणी

java द्वारे प्राधान्य क्यू क्लास वापरून तुम्ही min heap कसे अंमलात आणू शकता ते येथे आहे.

import java.util.*;

class MinHeapPriorityQueue {

	static PriorityQueue minHeap = new PriorityQueue();

	public static void view() {
		for (Integer x : minHeap) {
			System.out.print(x + " ");
		}
		System.out.println();
	}

	public static void main(String args[]) {
		// using "add" operation to insert elements
		minHeap.add(3);
		System.out.print("minHeap.add(3) = ");
		view();
		minHeap.add(13);
		minHeap.add(7);
		minHeap.add(16);
		minHeap.add(21);
		minHeap.add(12);
		minHeap.add(9);

		// printing Min-Heap
		System.out.print("minHeap.view() = ");
		view();

		// using "peek" method to view the head
		System.out.println("minHeap.peek() = " + minHeap.peek());

		// using "poll" method to remove and retrieve the head
		minHeap.poll();
		System.out.print("minHeap.poll() = ");
		view();

		// using "remove" method to remove specified element
		minHeap.remove(7);
		System.out.print("minHeap.remove(7) = ");
		view();

		// Check if an element is present using contains()
		boolean elementFound = minHeap.contains(11);
		System.out.println("minHeap.contains(11) = " + elementFound);
		elementFound = minHeap.contains(16);
		System.out.println("minHeap.contains(16) = " + elementFound);
	}
}
आउटपुट
minHeap.add(3) = 3 minHeap.view() = 3 13 7 16 21 12 9 minHeap.peek() = 3 minHeap.poll() = 7 13 9 16 21 12 minHeap.remove(7) = 129 16 21 minHeap.contains(11) = असत्य minHeap.contains(16) = खरे

निष्कर्ष

घटकांच्या पूलमधील सर्वात लहान घटक सतत वेळेत पुनर्प्राप्त करण्यासाठी किमान ढीग मोठ्या प्रमाणावर वापरले जातात. या डेटा स्ट्रक्चरचे इतर अनेक ऍप्लिकेशन्स आहेत, तथापि तुम्ही हे अंमलात आणण्यासाठी कोणतीही पद्धत निवडू शकता. यात चांगले होण्यासाठी तुम्हाला संयमाने सराव करावा लागेल, हे वेगळे सांगण्याची गरज नाही. चला तर मग आपले स्नायू हलवूया आणि कामाला लागा!
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION