CodeGym /Java Blog /এলোমেলো /জাভা অগ্রাধিকার সারি: ক্লাসিক্যাল সারি নয়
John Squirrels
লেভেল 41
San Francisco

জাভা অগ্রাধিকার সারি: ক্লাসিক্যাল সারি নয়

এলোমেলো দলে প্রকাশিত
এই নিবন্ধে আমরা একটি অগ্রাধিকার সারি শিখি, জাভা ক্লাস, যা সারি ইন্টারফেস প্রয়োগ করে। একজন প্রোগ্রামার নিয়মিত সারি ইন্টারফেস সম্পর্কে কী জানেন? প্রথমত, এই ইন্টারফেসটি FIFO নীতি বা "ফার্স্ট ইন ফার্স্ট আউট" এর উপর ভিত্তি করে। এটি তার সাধারণ অর্থে একটি নিয়মিত সারি মনে করিয়ে দেয়। আপনি McDrive থেকে কফি পেতে চান? যদি আপনার গাড়িটি জানালার কাছে প্রথম হয়, তাহলে পাশের ড্রাইভারের আগে আপনি আপনার কফি পাবেন।

সারি ইন্টারফেস ঘোষণা


public interface Queue<E> extends Collection<E>

একটি অগ্রাধিকার সারি কি

জাভা অগ্রাধিকার সারি: ক্লাসিক্যাল সারি নয় - 2একটি অগ্রাধিকার সারি কি? প্রথমত, এটি একটি ক্লাস যা পিছনে থেকে একটি উপাদান সন্নিবেশ করা এবং মাথা থেকে একটি উপাদান সরানোর ক্ষেত্রে সারি ইন্টারফেস প্রয়োগ করে। তবে এটি ভিতরে একটি সাধারণ সারি নয়। জাভা অগ্রাধিকার সারির উপাদানগুলির ক্রম উপাদানগুলির অগ্রাধিকারের উপর নির্ভর করে। সর্বোচ্চ অগ্রাধিকার সহ উপাদানটি সারির মাথায় সরানো হবে৷ আপনি যদি সর্বোচ্চ র‌্যাঙ্ক করা উপাদানটি মুছে দেন (পরিষেবা) তবে দ্বিতীয়টি তার কফি পেতে মাথায় যায়। কিভাবে অগ্রাধিকার নির্ধারণ করা হয়? ডকুমেন্টেশন অনুসারে, অগ্রাধিকার সারির উপাদানগুলি তাদের স্বাভাবিক ক্রম অনুসারে বা সারি নির্মাণের সময় সরবরাহকারী তুলনাকারীর দ্বারা অর্ডার করা হয়, কোন কনস্ট্রাক্টর ব্যবহার করা হয় তার উপর নির্ভর করে। একটি অগ্রাধিকার সারি একটি অগ্রাধিকার মিন হিপের উপর ভিত্তি করে৷ এর মানে, সংখ্যা সারির উপাদানের ক্ষেত্রে, সারির প্রথম উপাদানটি এই সংখ্যাগুলির সর্বনিম্ন হবে। প্রায়শই এই সংজ্ঞাটি পড়ার পর রুকি শিক্ষার্থীরা ভাবতে শুরু করে যে অগ্রাধিকার সারিতে একটি রৈখিক অর্থে সাজানো হয়েছে। অর্থাৎ, যদি বলি, আমরা এমন একটি সারি ব্যবহার করি যার উপাদানগুলি প্রাকৃতিক সংখ্যা, তাহলে প্রথম উপাদানটি হবে ক্ষুদ্রতম, এবং শেষটি হবে - বৃহত্তম। এই সম্পূর্ণ সত্য নয়। অগ্রাধিকার সারি আসলে কীভাবে কাজ করে এবং এটি কী দেয় তা বোঝার জন্য, আপনাকে হিপটি কীভাবে কাজ করে তা খুঁজে বের করতে হবে। আমরা একটু পরে একটি উদাহরণ ব্যবহার করে অগ্রাধিকার সারির অভ্যন্তরীণ কাঠামো বিবেচনা করি। এখন এর বাহ্যিক গুণাবলী নিয়ে চিন্তা করা যাক। তারপর প্রথম উপাদানটি হবে সবচেয়ে ছোট, এবং শেষটি হবে সবচেয়ে বড়। এই সম্পূর্ণ সত্য নয়। অগ্রাধিকার সারি আসলে কীভাবে কাজ করে এবং এটি কী দেয় তা বোঝার জন্য, আপনাকে হিপটি কীভাবে কাজ করে তা খুঁজে বের করতে হবে। আমরা একটু পরে একটি উদাহরণ ব্যবহার করে অগ্রাধিকার সারির অভ্যন্তরীণ কাঠামো বিবেচনা করি। এখন এর বাহ্যিক গুণাবলী নিয়ে চিন্তা করা যাক। তারপর প্রথম উপাদানটি হবে সবচেয়ে ছোট, এবং শেষটি হবে সবচেয়ে বড়। এই সম্পূর্ণ সত্য নয়। অগ্রাধিকার সারি আসলে কীভাবে কাজ করে এবং এটি কী দেয় তা বোঝার জন্য, আপনাকে হিপটি কীভাবে কাজ করে তা খুঁজে বের করতে হবে। আমরা একটু পরে একটি উদাহরণ ব্যবহার করে অগ্রাধিকার সারির অভ্যন্তরীণ কাঠামো বিবেচনা করি। এখন এর বাহ্যিক গুণাবলী নিয়ে চিন্তা করা যাক।

অগ্রাধিকার সারি শ্রেণী নির্মাণকারী এবং ঘোষণা

PriorityQueue ক্লাস জাভাতে একটি অগ্রাধিকার সারি তৈরি করার জন্য 6টি ভিন্ন উপায় প্রদান করে।
  • PriorityQueue() - ডিফল্ট প্রারম্ভিক ক্ষমতা (11) সহ খালি সারি যা এর উপাদানগুলিকে তাদের স্বাভাবিক ক্রম অনুসারে অর্ডার করে।
  • PriorityQueue(সংগ্রহ গ) - নির্দিষ্ট সংগ্রহের উপাদান ধারণ করে খালি সারি।
  • PriorityQueue(int initialCapacity) - নির্দিষ্ট প্রারম্ভিক ক্ষমতা সহ খালি সারি যা এর উপাদানগুলিকে তাদের স্বাভাবিক ক্রম অনুসারে অর্ডার করে।
  • PriorityQueue(int initialCapacity, Comparator comparator) - নির্দিষ্ট প্রারম্ভিক ক্ষমতা সহ খালি সারি যা নির্দিষ্ট তুলনাকারী অনুসারে এর উপাদানগুলিকে অর্ডার করে।
  • PriorityQueue(PriorityQueue c) - নির্দিষ্ট অগ্রাধিকার সারিতে থাকা উপাদানগুলি ধারণ করে খালি সারি৷
  • PriorityQueue(SortedSet c) - নির্দিষ্ট সাজানো সেটের উপাদান ধারণ করে খালি সারি।
জাভাতে অগ্রাধিকার সারি পরবর্তী উপায় ঘোষণা করা হয়:

public class PriorityQueue<E> extends AbstractQueue<E> implements Serializable

অগ্রাধিকার সারি তৈরি করা হচ্ছে

পূর্ণসংখ্যার একটি অগ্রাধিকার সারি তৈরি করা যাক। অগ্রাধিকার সারি বাস্তবায়ন, জাভা কোড:

PriorityQueue<Integer> numbers = new PriorityQueue<>();
আমরা যুক্তি ছাড়াই একটি অগ্রাধিকার সারি তৈরি করেছি। এই ক্ষেত্রে, অগ্রাধিকার সারির প্রধান হল সারির সর্বনিম্ন সংখ্যা। আপনি মাথা অপসারণ, পরবর্তী ক্ষুদ্রতম উপাদান এই জায়গা নিতে হবে. তাই আপনি সারি থেকে উপাদানগুলিকে আরোহী ক্রমে সরাতে পারেন। প্রয়োজনে আপনি তুলনাকারী ইন্টারফেস ব্যবহার করে অর্ডার করার নীতি পরিবর্তন করতে পারেন।

জাভা অগ্রাধিকার সারি পদ্ধতি

PriorityQueue Java ক্লাসে উপাদান যোগ, অপসারণ এবং পরীক্ষা করার গুরুত্বপূর্ণ পদ্ধতি রয়েছে।

অগ্রাধিকার সারিতে উপাদান সন্নিবেশ করান

  • বুলিয়ান অ্যাড(অবজেক্ট) অগ্রাধিকার সারিতে নির্দিষ্ট উপাদান সন্নিবেশ করায়। সাফল্যের ক্ষেত্রে সত্য ফিরে আসে। সারি পূর্ণ হলে, পদ্ধতি একটি ব্যতিক্রম নিক্ষেপ করে।
  • বুলিয়ান অফার(অবজেক্ট) এই অগ্রাধিকার সারিতে নির্দিষ্ট উপাদান সন্নিবেশ করায়। সারি পূর্ণ হলে, পদ্ধতি মিথ্যা ফেরত দেয়।
আপনি উভয় যোগ করার ক্রিয়াকলাপ ব্যবহার করতে পারেন, বেশিরভাগ ক্ষেত্রে কোন পার্থক্য নেই। এখানে সূচনা এবং অগ্রাধিকার সারিতে উপাদান যোগ করার একটি ছোট উদাহরণ।

import java.util.PriorityQueue;
import java.util.Queue;
public class Priority2 {
    public static void main(String[] args) {
        Queue<Integer> priorityQueue1 = new PriorityQueue<>();
        for (int i = 5; i > 0; i--) {
            priorityQueue1.add(i);
        }
        System.out.println(priorityQueue1);
    priorityQueue1.offer(0);
        System.out.println(priorityQueue1);
    }
}
আউটপুট হল:

[1, 2, 4, 5, 3]
[0, 2, 1, 5, 3, 4]
উপাদানগুলির ক্রম অদ্ভুত বলে মনে হচ্ছে, আমরা এটি পরে ব্যাখ্যা করব।

অগ্রাধিকার সারি থেকে উপাদান পুনরুদ্ধার এবং অপসারণ করা হচ্ছে

  • বুলিয়ান রিমুভ(অবজেক্ট) এই সারি থেকে নির্দিষ্ট উপাদানের একটি একক উদাহরণ সরিয়ে দেয়, যদি এটি উপস্থিত থাকে।
  • অবজেক্ট পোল() এই সারির মাথাটি পুনরুদ্ধার করে এবং সরিয়ে দেয়। সারি খালি থাকলে শূন্য দেয়।
  • void clear() অগ্রাধিকার সারি থেকে সমস্ত উপাদান সরিয়ে দেয়।
  • অবজেক্ট উপাদান() এটি অপসারণ না করে এই সারির মাথাটি পুনরুদ্ধার করে। সারি খালি থাকলে NoSuchElementException নিক্ষেপ করে ।
  • অবজেক্ট পিক() সারির মাথাটি অপসারণ না করেই পুনরুদ্ধার করে। সারি খালি থাকলে শূন্য দেয়।

import java.util.PriorityQueue;
import java.util.Queue;
 
public class Priority2 {
    public static void main(String[] args) {
        Queue<Integer> priorityQueue = new PriorityQueue<>();
        //put 5 elements to the queue using add
        for (int i = 5; i > 0; i--) {
            priorityQueue.add(i);
        }
        System.out.println("the head of the queue = " + priorityQueue.peek());
        //removing element by element from the queue using poll and print it out
        while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.poll());
        }
        //put 5 new elements into the empty queue using offer
        for (int i = 10; i > 5; i--) {
            priorityQueue.offer(i);
        }
        System.out.println("now the head of the queue = " + priorityQueue.peek());
        System.out.println("the queue before removing 9:");
        System.out.println(priorityQueue);
        priorityQueue.remove(9);
        System.out.println("the queue after removing 9:");
        System.out.println(priorityQueue);
        //removing all the elements from the queue
        priorityQueue.clear();
        System.out.println(priorityQueue);
        //trying to print out the head of the empty Queue using peek - we'll get null
        System.out.println(priorityQueue.peek());
        //trying to print out the head of the empty Queue using element - we'll get the exception
        System.out.println(priorityQueue.element());
    }
}
আউটপুট:

the head of the queue = 1
1
2
3
4
5
now the head of the queue = 6
the queue before removing 9:
[6, 7, 9, 10, 8]
the queue after removing 9:
[6, 7, 8, 10]
[]
null
Exception in thread "main" java.util.NoSuchElementException
  at java.base/java.util.AbstractQueue.element(AbstractQueue.java:136)
  at Priority2.main(Priority2.java:32)
আপনি দেখতে পাচ্ছেন, element() পদ্ধতি ব্যবহার করে খালি সারির মাথাটি প্রিন্ট করার চেষ্টা করা NoSuchElementexception- এর দিকে নিয়ে যায় ।

অগ্রাধিকার সারি তুলনাকারী

  • Comparator comparator() সেই তুলনাকারীকে ফেরত দেয় যা সারিতে থাকা উপাদানগুলিকে অর্ডার করতে ব্যবহৃত হয়। সারির উপাদানের স্বাভাবিক ক্রম অনুসারে সাজানো হলে শূন্য দেখায়।

জাভা অগ্রাধিকার সারি, তুলনাকারীর সাথে উদাহরণ

আমরা উপরের কোডের উদাহরণগুলিতে প্রাকৃতিক (আরোহী) ক্রম ব্যবহার করেছি, কিন্তু কখনও কখনও আমাদের এটি পরিবর্তন করা উচিত। এখানে জাভা অগ্রাধিকার সারি উদাহরণ, যেখানে আমরা আমাদের নিজস্ব অভ্যন্তরীণ তুলনাকারী ক্লাস তৈরি করি যা তুলনাকারী ইন্টারফেস প্রয়োগ করে। আমাদের তুলনাকারী উপাদানগুলিকে সবচেয়ে বড় থেকে ছোট পর্যন্ত সাজিয়ে দেবে।

import java.util.PriorityQueue;
import java.util.Comparator;
 
class Priority3 {
    public static void main(String[] args) {
        // Creating a priority queue with myComparator
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new MyComparator());
        for (int i = 5; i > 0; i--) {
            priorityQueue.add(i);
        }
        System.out.println("the head of Queue = " + priorityQueue.peek());
        while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.poll());
        }
    }
}
 
class MyComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer number1, Integer number2) {
        int value = number1.compareTo(number2);
        //sorting elements from maximal to minimal
        if (value > 0) {
            return -1;
        } else if (value < 0) {
            return 1;
        } else {
            return 0;
        }
    }
}
আউটপুট:

the head of Queue = 5
5
4
3
2
1
সারির প্রধানটি এখন ন্যূনতম নয়, তবে সর্বাধিক উপাদান, এবং ক্রমটি বিপরীতে পরিবর্তিত হয়েছে।

Iterator ব্যবহার করে PriorityQueue এর উপর পুনরাবৃত্তি করা হচ্ছে

ProrityQueue হল সংগ্রহ কাঠামোর একটি অংশ এবং Iterable<> ইন্টারফেস প্রয়োগ করে। একটি অগ্রাধিকার সারির উপাদানগুলির উপর পুনরাবৃত্তি করতে আপনি iterator() পদ্ধতি ব্যবহার করতে পারেন। এখানে একটি উদাহরণ:

import java.util.PriorityQueue;
import java.util.Iterator;
import java.util.Queue;
 
class Priority4 {
   public static void main(String[] args) {
       // Creating a priority queue
       Queue<Integer> priorityQueue = new PriorityQueue<>();
       //put 5 elements to the queue using add
       for (int i = 5; i > 0; i--) {
           priorityQueue.add(i);
       }
       //Iterating via iterator() method
       Iterator<Integer> iterator = priorityQueue.iterator();
       while (iterate.hasNext()) {
           System.out.print(iterator.next() + " ");
       }
   }
}
আউটপুট:

1 2 4 5 3 

আরও অগ্রাধিকার সারি পদ্ধতি

  • বুলিয়ান ধারণ করে (অবজেক্ট o) সারিতে o উপাদান থাকলে সত্য ফেরত দেয়।
  • int size() এই সারিতে থাকা উপাদানের সংখ্যা প্রদান করে।
  • Object[] toArray() এই সারির সমস্ত উপাদান সম্বলিত একটি অ্যারে প্রদান করে।
এখানে একটি উদাহরণ:

import java.util.PriorityQueue;
import java.util.Queue;
 
public class Priority5 {
   public static void main(String[] args) {
       Queue<Integer> priorityQueue = new PriorityQueue<>();
       for (int i = 5; i > 0; i--) {
           priorityQueue.offer(i);
       }
 
       System.out.println("our queue: " + priorityQueue);
 
       System.out.println("Does our queue contain 8?  " + priorityQueue.contains(8));
       System.out.println("Does queue contain 5?  " + priorityQueue.contains(5));
 
       System.out.println("The quantity of queue elements: " + priorityQueue.size());
       Object[] myArray = priorityQueue.toArray();
       System.out.println("print out our array:");
       for (Object name : myArray) {
           System.out.println(name);
       }
   }
}
আউটপুট:

our queue: [1, 2, 4, 5, 3]
Does our queue contain 8?  false
Does our queue contain 5?  true
The quantity of queue elements: 5
print out our array:
1
2
4
5
3

অগ্রাধিকার সারি জাভা 8 সংজ্ঞা

আপনি যদি অগ্রাধিকার সারি জাভা 8 ডকুমেন্টেশনটি খোলেন, আপনি সেখানে পরবর্তী সংজ্ঞাটি পাবেন: একটি অগ্রাধিকারের স্তূপের উপর ভিত্তি করে একটি সীমাহীন অগ্রাধিকার সারি। অগ্রাধিকার সারির উপাদানগুলি তাদের স্বাভাবিক ক্রম অনুসারে বা সারি নির্মাণের সময় সরবরাহকারী তুলনাকারীর দ্বারা অর্ডার করা হয়, কোন কনস্ট্রাক্টর ব্যবহার করা হয় তার উপর নির্ভর করে। একটি অগ্রাধিকার সারি শূন্য উপাদানের অনুমতি দেয় না। একটি অগ্রাধিকার সারি প্রাকৃতিক ক্রম উপর নির্ভর করে অ-তুলনীয় বস্তু সন্নিবেশ করার অনুমতি দেয় না (এটি করার ফলে ClassCastException হতে পারে)। Heap এখানে খুবই গুরুত্বপূর্ণ একটি শব্দ। এটি অগ্রাধিকার সারির উপাদানের ক্রমগত বৈশিষ্ট্য ব্যাখ্যা করে।

অগ্রাধিকার কিউ কাজের নীতি: বাইনারি হিপ

একটি উদাহরণ দিয়ে শুরু করা যাক। কিউ ইন্টারফেস বাস্তবায়ন করে দুটি অবজেক্ট তৈরি করি। তার মধ্যে একটি লিঙ্কডলিস্ট, দ্বিতীয়টি - অগ্রাধিকার সারি। তাদের উভয়েরই পূর্ণসংখ্যার 5টি উপাদান রয়েছে (1,2,3,4 এবং 5) এবং আমরা উপাদানগুলিকে আমাদের সারিতে রাখা শুরু করি সবচেয়ে বড় থেকে ছোট পর্যন্ত। সুতরাং, প্রথমটি 5 আসবে, তারপর 4, 3, 2 এবং শেষটি হবে 1। তারপর অর্ডার চেক করতে উভয় তালিকা প্রিন্ট আউট করুন।

   Queue<Integer> queueL = new LinkedList<>();
       for (int i = 5; i > 0; i--) {
           queueL.add(i);
       }
       System.out.println("LinkedList Queue (FIFO): " + queueL);
       Queue<Integer> priorityQueue = new PriorityQueue<>();
 
       for (int i = 5; i > 0; i--) {
       priorityQueue.offer(i);
       }
       System.out.println("PriorityQueue: " + priorityQueue)
এই কোড কাজ করার ফলাফল হল নিম্নলিখিত:

LinkedList Queue (FIFO): [5, 4, 3, 2, 1]
PriorityQueue: [1, 2, 4, 5, 3]
ওয়েল, লিঙ্কডলিস্ট অর্ডার অনুমানযোগ্য এবং বোধগম্য। এটি FIFO নীতি অনুযায়ী আদেশ করা হয়. আমরা 5 দিয়ে শুরু করেছি, তাই এই উপাদানটি প্রথম লাইনে, তারপর 4 যায় এবং তাই। অগ্রাধিকার সারি অর্ডার সম্পর্কে আমরা কী বলতে পারি? ডক্স বলেছে যে অগ্রাধিকার সারির উপাদানগুলি তাদের স্বাভাবিক ক্রমানুসারে বা সারি নির্মাণের সময় সরবরাহকারী তুলনাকারীর দ্বারা আদেশ করা হয়। তবে এই আদেশটি রৈখিক সাজানোর অর্থে "প্রাকৃতিক" বলে মনে হচ্ছে না। আমরা বরং [1, 2, 3, 4, 5] আশা করব, [1, 2, 4, 5, 3] নয়। কেন পুনরুদ্ধারের ক্রম এটির মত তা বোঝার জন্য, আমাদের একটি স্তূপের উপর ভিত্তি করে অগ্রাধিকারের সারিটি স্মরণ করা উচিত। গাদা কি? এটি বাইনারি গাছের উপর ভিত্তি করে একটি ডেটা কাঠামো. স্তূপের প্রধান সম্পত্তি: প্রতিটি পিতামাতার অগ্রাধিকার তার সন্তানদের অগ্রাধিকারের চেয়ে বেশি। আমি আপনাকে মনে করিয়ে দিই যে একটি গাছকে সম্পূর্ণ বাইনারি বলা হয় যদি প্রতিটি পিতামাতার দুটির বেশি সন্তান না থাকে এবং স্তরগুলি পূরণ করা হয় উপরে থেকে নীচে (একই স্তর থেকে - বাম থেকে ডানে)। বাইনারি স্তূপ প্রতিবার উপাদানগুলি যোগ করা বা সরানো হলে নিজেকে পুনর্গঠিত করে। মিন-হিপের ক্ষেত্রে, ক্ষুদ্রতম উপাদানটি তার সন্নিবেশের ক্রম নির্বিশেষে মূলে যায়। এই মিন-হিপের উপর ভিত্তি করে অগ্রাধিকার সারি। তার মানে, সংখ্যা সারির উপাদানগুলির ক্ষেত্রে, সারির প্রথম উপাদানটি এই সংখ্যাগুলির সর্বনিম্ন হবে। আপনি রুট মুছে ফেললে, পরবর্তী ক্ষুদ্রতম একটি রুট হয়ে যায়।

আমাদের উদাহরণ চালু করা যাক.

ধাপ 1. আমরা '5' কে অগ্রাধিকার সারিতে রাখি। এটি একটি মূলে পরিণত হয়। ধাপ 2. আমরা অগ্রাধিকার সারিতে '4' যোগ করি। 4 <5, তাই নতুন উপাদানটি পুরানোটির চেয়ে বেশি হওয়া উচিত। 4টি একটি মূলে পরিণত হয়, 5টি তার বাম সন্তান। এখন জাভাতে ডেটা স্ট্রাকচার হল [4, 5] ধাপ 3। আমরা '3' যোগ করি। সাময়িকভাবে এটি একটি মূলের সঠিক সন্তান হয়ে যায় (4)। যাইহোক, 3 <4, তাই আমাদের এটি উপরে তোলা উচিত। এক্সচেঞ্জ 3 এবং 4. এখন আমাদের একটি কাঠামো আছে যেমন [3, 5, 4] ধাপ 4. আমরা '2' যোগ করি। এটি 5 এর একটি বাম সন্তান হয়ে যায়। 2<5, তাই তাদের বিনিময় করুন। 2 3, 2 <3 এর বাম সন্তান হয়ে যায়, তাই আরও একটি বিনিময় প্রক্রিয়া। এখন আমাদের একটি কাঠামো আছে [2,3,4,5] ধাপ 5।আমরা '1' যোগ করি। এটি 3-এর ডান সন্তান থেকে 2-এর বাম সন্তানে আসে এবং তারপর মূলে যায়। ফলাফল তথ্য কাঠামো: [1,2,4,5,3] জাভা অগ্রাধিকার সারি: ক্লাসিক্যাল সারি নয় - 3অপসারণ প্রক্রিয়া একটি মূল থেকে শুরু হয়, এবং এটি বিপরীত পদ্ধতিগুলিকে উস্কে দেয়। সুতরাং, প্রথমে আমাদের কাছে রুট হিসাবে 1 আছে, তারপর 2, 3, 4 এবং সর্বশেষে 5। তাই অপারেশন পোল() অপসারণ ব্যবহার করে

while (!priorityQueue.isEmpty()) {
           System.out.println(priorityQueue.poll());
       }
আমরা লিনিয়ার সেন্স আউটপুটে "বাছাই" পেয়েছি:

1
2
3
4
5
তাই কিছু অপারেশনের জন্য অগ্রাধিকার সারি কার্যকর হতে পারে। প্রতিটি উপাদান সন্নিবেশ এবং মুছে ফেলতে O(log N) সময় লাগে এবং আপনি O(1) এ ন্যূনতম উপাদান পেতে পারেন। এখানে সম্পূর্ণ উদাহরণ:

import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
 
public class PriorityQueueExample {
   public static void main(String[] args) {
 
       Queue<Integer> queueL = new LinkedList<>();
       for (int i = 5; i > 0; i--) {
           queueL.add(i);
       }
       System.out.println("Print our LinkedList Queue (FIFO): " + queueL);
       Queue<Integer> priorityQueue = new PriorityQueue<>();
 
       for (int i = 5; i > 0; i--) {
       priorityQueue.offer(i);
       }
 
       System.out.println("PriorityQueue printing (by iterating, no elements removing): " + priorityQueue);
       System.out.println("Print PriorityQueue using poll() (by retrieval): " );
       while (!priorityQueue.isEmpty()) {
           System.out.println(priorityQueue.poll());
       }
}
}
Print our LinkedList Queue (FIFO): [5, 4, 3, 2, 1]
PriorityQueue printing (by iterating, no elements removing): [1, 2, 4, 5, 3]
Print our  PriorityQueue using poll() (by retrieval): 
1
2
3
4
5
এটা বোঝা গুরুত্বপূর্ণ যে অগ্রাধিকার সারিগুলি বাইনারি হিপের উপর ভিত্তি করে, তাই তারা উপাদানগুলিকে রৈখিক সাজানো ক্রমে রাখে না। মূল থেকে পাতা পর্যন্ত প্রতিটি উপায় আদেশ করা হয়, কিন্তু মূল থেকে বিভিন্ন উপায় না. তার মানে আপনি খুব দ্রুত সারির ন্যূনতম উপাদান পেতে পারেন।

অগ্রাধিকার সারি সম্পর্কে আপনার যা জানা উচিত। সংক্ষিপ্ত তালিকা

  • অগ্রাধিকার সারি NULL বস্তুর অনুমতি দেয় না।
  • আপনি PriorityQueue এ শুধুমাত্র তুলনামূলক বস্তু যোগ করতে পারেন।
  • অগ্রাধিকার সারিটি একটি মিন হিপ হিসাবে তৈরি করা হয়, এক ধরণের বাইনারি গাছ। ন্যূনতম উপাদান হল একটি মূল। অগ্রাধিকার সারির বস্তুগুলি স্বাভাবিক ক্রমে ডিফল্টরূপে ক্রমানুসারে সাজানো হয়।
  • আপনার কাস্টম অর্ডারের প্রয়োজন হলে আপনি তুলনাকারী ব্যবহার করতে পারেন।
  • PriorityQueue থ্রেড নিরাপদ নয়, তাই আপনি একটি সমসাময়িক পরিবেশে কাজ করার জন্য PriorityBlockingQueue ব্যবহার করুন।
  • PriorityQueue যোগ এবং পোল পদ্ধতির জন্য O(log(n)) সময় প্রদান করে এবং O(1) ন্যূনতম উপাদান পেতে।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION