CodeGym /Java Blog /এলোমেলো /জাভাতে ট্রিম্যাপ
John Squirrels
লেভেল 41
San Francisco

জাভাতে ট্রিম্যাপ

এলোমেলো দলে প্রকাশিত
আপনি যদি এই নিবন্ধটি পড়ছেন, আপনি সম্ভবত মানচিত্র ইন্টারফেসের সাথে পরিচিত এবং যেখানে যথাযথভাবে প্রয়োগ করা যেতে পারে। না হলে এখানে আসুন । আজ আমরা জাভা ট্রিম্যাপের বাস্তবায়নের বৈশিষ্ট্যগুলি সম্পর্কে কথা বলব, এবং আরও নির্দিষ্টভাবে, এটি কীভাবে হ্যাশম্যাপ থেকে আলাদা এবং কীভাবে এটি সঠিকভাবে ব্যবহার করা যায়।

TreeMap, HashMap, এবং LinkedHashMap তুলনা করা হচ্ছে

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

লাল-কালো গাছ

আপনি সম্ভবত লক্ষ্য করেছেন যে, হুডের নীচে, ট্রিম্যাপ একটি লাল-কালো গাছ নামে একটি ডেটা কাঠামো ব্যবহার করে। এই স্ট্রাকচারে ডেটা স্টোর করাই ডাটা অর্ডারিং প্রদান করে। তাহলে এটা কি ধরনের গাছ? এর এটা বের করা যাক! কল্পনা করুন যে আপনাকে সংখ্যা-স্ট্রিং জোড়া সংরক্ষণ করতে হবে। সংখ্যা 16, 20, 52, 55, 61, 65, 71, 76, 81, 85, 90, 93, এবং 101 কী হবে। আপনি যদি একটি ঐতিহ্যগত তালিকায় ডেটা সঞ্চয় করেন এবং আপনাকে কী 101-এর সাহায্যে উপাদানটি খুঁজে বের করতে হয়, তাহলে আপনাকে এটি খুঁজে পেতে 13টি উপাদানের মধ্য দিয়ে যেতে হবে। 13 টি উপাদানের জন্য, এটি একটি বড় বিষয় নয়, কিন্তু যখন এক মিলিয়নের সাথে কাজ করা হয়, তখন আমাদের বড় সমস্যা হবে। এই সমস্যাগুলি সমাধান করার জন্য, প্রোগ্রামাররা কিছুটা জটিল ডেটা স্ট্রাকচার ব্যবহার করে। এখানেই মঞ্চে প্রবেশ করে লাল-কালো গাছ!ট্রিম্যাপের বৈশিষ্ট্য - 3একটি উপাদানের জন্য অনুসন্ধান গাছের মূল থেকে শুরু হয়, যা আমাদের ক্ষেত্রে 61। তারপর আমরা নোডের মানগুলিকে আমরা যে মান খুঁজছি তার সাথে তুলনা করি। যদি আমাদের মান কম হয়, তবে আমরা বামদিকে যাই; যদি এটি বড় হয়, তাহলে আমরা ডানদিকে যাই। এই প্রক্রিয়াটি পুনরাবৃত্তি হয় যতক্ষণ না আমরা পছন্দসই মান খুঁজে পাই বা এমন একটি উপাদানের সম্মুখীন হই যার মান শূন্য (গাছের একটি পাতা)। লাল এবং কালো রঙগুলি গাছে নেভিগেট এবং ভারসাম্য বজায় রাখার জন্য ব্যবহার করা হয়। একটি লাল-কালো গাছ তৈরি করার সময় সর্বদা পালন করা উচিত এমন নিয়ম রয়েছে:
  • মূল অবশ্যই কালো হতে হবে।
  • গাছের পাতা কালো হতে হবে।
  • একটি লাল নোডে দুটি কালো চাইল্ড নোড থাকতে হবে।
  • একটি কালো নোডে যেকোনো রঙের চাইল্ড নোড থাকতে পারে।
  • একটি নোড থেকে এর পাতা পর্যন্ত একটি পাথে অবশ্যই একই সংখ্যক কালো নোড থাকতে হবে।
  • পাতায় নতুন নোড যোগ করা হয়।
আপনি যদি নিয়ম 3, 4 এবং 5 একসাথে বিবেচনা করেন, তাহলে আপনি বুঝতে পারবেন কীভাবে নোডের রঙ আমাদের গাছটিকে আরও দ্রুত নেভিগেট করতে দেয়: কালো নোডের মধ্য দিয়ে একটি পথ সবসময় লাল নোডের মধ্য দিয়ে একটির চেয়ে ছোট হয়। তদনুসারে, গাছের মোট আকার কালো নোডের সংখ্যা দ্বারা নির্ধারিত হয়, যাকে "কালো উচ্চতা" বলা হয়। লাল-কালো গাছের ডাটা স্ট্রাকচার বিভিন্ন প্রোগ্রামিং ভাষায় প্রয়োগ করা হয়। ইন্টারনেটে প্রচুর জাভা বাস্তবায়ন রয়েছে, তাই আমরা এখানে দেরি করব না। পরিবর্তে, চলুন TreeMap এর কার্যকারিতা জেনে নেওয়া যাক।

SortedMap এবং NavigableMap ইন্টারফেস থেকে আসা পদ্ধতি

হ্যাশম্যাপের মতো, ট্রিম্যাপ ম্যাপ ইন্টারফেস প্রয়োগ করে, যার মানে ট্রিম্যাপে হ্যাশম্যাপে বিদ্যমান সমস্ত পদ্ধতি রয়েছে। কিন্তু TreeMap এছাড়াও SortedMap এবং NavigableMap ইন্টারফেস প্রয়োগ করে, এবং এইভাবে তাদের থেকে অতিরিক্ত কার্যকারিতা লাভ করে। SortedMap হল একটি ইন্টারফেস যা মানচিত্রকে প্রসারিত করে এবং একটি সাজানো ডেটাসেটের সাথে প্রাসঙ্গিক পদ্ধতি যোগ করে:
  • firstKey() : মানচিত্রের প্রথম উপাদানের কী ফেরত দেয়
  • lastKey() : শেষ উপাদানের কী ফেরত দেয়
  • headMap(K end) : একটি মানচিত্র ফেরত দেয় যাতে বর্তমান মানচিত্রের সমস্ত উপাদান রয়েছে, শুরু থেকে এলিমেন্ট পর্যন্ত কী শেষ
  • tailMap(K start) : একটি মানচিত্র প্রদান করে যাতে বর্তমান মানচিত্রের সমস্ত উপাদান রয়েছে, শুরুর উপাদান থেকে শেষ পর্যন্ত
  • subMap(K start, K ​​end) : একটি মানচিত্র ফেরত দেয় যাতে বর্তমান মানচিত্রের সমস্ত উপাদান রয়েছে, শুরুর উপাদান থেকে কী প্রান্তের উপাদান পর্যন্ত।
NavigableMap হল একটি ইন্টারফেস যা SortedMap প্রসারিত করে এবং একটি মানচিত্রের উপাদানগুলির মধ্যে নেভিগেট করার পদ্ধতি যোগ করে:
  • firstEntry() : প্রথম কী-মান জোড়া প্রদান করে
  • lastEntry() : শেষ কী-মান জোড়া প্রদান করে
  • pollFirstEntry() : প্রথম জোড়া ফিরিয়ে দেয় এবং মুছে দেয়
  • pollLastEntry() : শেষ জোড়া ফিরিয়ে দেয় এবং মুছে দেয়
  • ceilingKey(K obj) : ক্ষুদ্রতম কী k প্রদান করে যা কী বস্তুর চেয়ে বড় বা সমান। যদি এই ধরনের কোন কী না থাকে, তাহলে শূন্য প্রদান করে
  • floorKey(K obj) : সবচেয়ে বড় কী k প্রদান করে যা কী অবজেক্টের থেকে কম বা সমান। যদি এই ধরনের কোন কী না থাকে, তাহলে শূন্য প্রদান করে
  • LowerKey(K obj) : সবচেয়ে বড় কী k প্রদান করে যা কী অবজেক্টের চেয়ে কম। যদি এই ধরনের কোন কী না থাকে, তাহলে শূন্য প্রদান করে
  • highKey(K obj) : ক্ষুদ্রতম কী k প্রদান করে যা কী অবজেক্টের চেয়ে বড়। যদি এই ধরনের কোন কী না থাকে, তাহলে শূন্য প্রদান করে
  • ceilingEntry(K obj) : ceilingKey(K obj) পদ্ধতির অনুরূপ, শুধুমাত্র একটি কী-মানের জোড়া (বা নাল) প্রদান করে
  • floorEntry(K obj) : floorKey(K obj) পদ্ধতির অনুরূপ, শুধুমাত্র একটি কী-মান জোড়া (বা নাল) প্রদান করে
  • LowerEntry(K obj) : LowerKey(K obj) পদ্ধতির অনুরূপ, শুধুমাত্র একটি কী-মান জোড়া (বা নাল) প্রদান করে
  • highEntry(K obj) : HigherKey(K obj) পদ্ধতির অনুরূপ, শুধুমাত্র একটি কী-মানের জোড়া (বা শূন্য) প্রদান করে
  • descendingKeySet() : বিপরীত ক্রমে সাজানো সমস্ত কী ধারণকারী একটি NavigableSet ফেরত দেয়
  • descendingMap() : বিপরীত ক্রমে সাজানো সমস্ত জোড়া সমন্বিত একটি NavigableMap প্রদান করে
  • navigableKeySet() : একটি NavigableSet অবজেক্ট ফেরত দেয় যাতে সেগুলি সংরক্ষণ করা হয় সেই ক্রমে সমস্ত কী রয়েছে
  • headMap(K upperBound, boolean incl) : একটি মানচিত্র ফেরত দেয় যেখানে শুরু থেকে উপরের দিকের উপাদান পর্যন্ত জোড়া রয়েছে। ইনক্ল প্যারামিটারটি নির্দেশ করে যে প্রত্যাবর্তিত মানচিত্রে উপরের বাউন্ড উপাদানটি অন্তর্ভুক্ত করতে হবে কিনা
  • tailMap(K LowerBound, boolean incl) : পূর্ববর্তী পদ্ধতির মতো কার্যকারিতা, নিম্নবাউন্ড থেকে শেষ পর্যন্ত শুধুমাত্র জোড়া প্রদান করে
  • সাবম্যাপ(K LowerBound, boolean lowIncl, K upperBound, বুলিয়ান highIncl) : পূর্ববর্তী পদ্ধতিগুলির মতো, নিম্নবাউন্ড থেকে আপারবাউন্ডে জোড়া ফেরত দেয়; আর্গুমেন্ট lowIncl এবং highIncl নির্দেশ করে যে নতুন মানচিত্রে সীমানা উপাদান অন্তর্ভুক্ত করা হবে কিনা।
সাধারণ কনস্ট্রাক্টর ছাড়াও, ট্রিম্যাপের আরেকটি কনস্ট্রাক্টর রয়েছে যা তুলনাকারীর একটি উদাহরণ গ্রহণ করে। উপাদানগুলি যে ক্রমানুসারে সংরক্ষণ করা হয় তার জন্য এই তুলনাকারী দায়ী।

ট্রিম্যাপের উদাহরণ

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

public class Person {
   public String firstName;
   public String lastName;
   public int age;

   public Person(String firstName, String lastName, int age) {
       this.firstName = firstName;
       this.lastName = lastName;
       this.age = age;
   }
}
আমরা মূল ক্লাসে যুক্তি প্রয়োগ করি :

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class Main {
   public static void main(String[] args) {
      TreeMap<Person, Integer> map = new TreeMap<>(Comparator.comparingInt(o -> o.age));
      map.put(new Person("John", "Smith", 17), 0);
      map.put(new Person("Ivan", "Petrenko", 65), 0);
      map.put(new Person("Pedro", "Escobar", 32), 0);
      map.put(new Person("Shirley", "Hatfield", 14), 0);
      map.put(new Person("Abby", "Parsons", 19), 0);

      Person firstAdultPerson = map.navigableKeySet().stream().filter(person -> person.age>18).findFirst().get();

       Map<Person, Integer> youngPeopleMap = map.headMap(firstAdultPerson, false);
       Map<Person, Integer> adultPeopleMap = map.tailMap(firstAdultPerson, true);
       showAdvertisementToYoung(youngPeopleMap);
       showAdvertisementToAdult(adultPeopleMap);
   }

   public static void showAdvertisementToYoung(Map map) {}
   public static void showAdvertisementToAdult(Map map) {}
}
প্রধান শ্রেণীতে, একটি ট্রিম্যাপ তৈরি করুন, যেখানে প্রতিটি কী একটি নির্দিষ্ট ব্যক্তির প্রতিনিধিত্ব করে এবং প্রতিটি মান হল এই মাসে বিজ্ঞাপনের ইম্প্রেশনের সংখ্যা। আমরা কন্সট্রাকটরকে একটি তুলনাকারী পাস করি যা বয়স অনুসারে লোকেদের সাজায়। আমরা নির্বিচারে মান দিয়ে মানচিত্র পূরণ করি। এখন আমরা আমাদের ছোট্ট ডেটা ভান্ডারে প্রথম প্রাপ্তবয়স্কের একটি রেফারেন্স পেতে চাই। আমরা স্ট্রিম API ব্যবহার করে এটি করি। তারপরে আমরা দুটি পৃথক মানচিত্র পাই, যা আমরা বিজ্ঞাপনগুলি দেখানো পদ্ধতিতে পাস করি। অনেক, অনেক উপায় আছে যে আমরা এই কাজটি সম্পন্ন করতে পারতাম। TreeMap ক্লাসের পদ্ধতির অস্ত্রাগার আমাদের প্রতিটি প্রয়োজনের জন্য কাস্টম সমাধান তৈরি করতে দেয়। আপনাকে সেগুলি মনে রাখার দরকার নেই, কারণ আপনি সর্বদা আপনার IDE থেকে ডকুমেন্টেশন বা টিপস ব্যবহার করতে পারেন। আপনি যা শিখেছেন তা শক্তিশালী করার জন্য, আমরা আপনাকে আমাদের জাভা কোর্স থেকে একটি ভিডিও পাঠ দেখার পরামর্শ দিই
এখন এ পর্যন্তই! আমি আশা করি যে TreeMap ক্লাসটি এখন আপনার কাছে পরিষ্কার, এবং আপনি ব্যবহারিক কোডিং কাজগুলি সমাধান করার জন্য এটি সঠিকভাবে প্রয়োগ করবেন।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION