হ্যাশেট বনাম ট্রিসেট


495

আমি সবসময় গাছ পছন্দ করেছি, দুর্দান্ত O(n*log(n)) এবং পরিপাটি। যাইহোক, আমি পরিচিত প্রতিটি সফ্টওয়্যার ইঞ্জিনিয়ার আমাকে কেন আমি এটি ব্যবহার করব তা উল্লেখ করে জিজ্ঞাসা করেছি TreeSet। সিএস ব্যাকগ্রাউন্ড থেকে, আমি মনে করি না যে আপনি যা ব্যবহার করেন তা এতটাই গুরুত্ব দেয় এবং আমি হ্যাশ ফাংশন এবং বালতিগুলি (তবে এর ক্ষেত্রে Java) নিয়ে গণ্ডগোলের যত্ন করি না ।

কোন ক্ষেত্রে আমার একটি HashSetওভার ব্যবহার করা উচিত TreeSet?

উত্তর:


859

হ্যাশসেট ট্রিসেটের তুলনায় অনেক দ্রুত (অ্যাড, রিমুভ এবং এতে থাকা বেশিরভাগ ক্রিয়াকলাপের জন্য ধ্রুবক-সময় বনাম লগ-টাইম) তবে ট্রিসেটের মতো কোনও অর্ডারিং গ্যারান্টি দেয় না।

HashSet

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

TreeSet

  • মৌলিক ক্রিয়াকলাপের জন্য লগ (এন) সময় ব্যয় গ্যারান্টি দেয় (যোগ করুন, সরান এবং এতে অন্তর্ভুক্ত)
  • গ্যারান্টি দেয় যে সেটগুলির উপাদানগুলি বাছাই করা হবে (আরোহী, প্রাকৃতিক, বা এর নির্মাতার মাধ্যমে আপনার দ্বারা নির্দিষ্ট করা) (প্রয়োগসমূহ SortedSet )
  • পুনরাবৃত্তি পারফরম্যান্সের জন্য কোনও টিউনিং পরামিতি সরবরাহ করে না
  • অফার কয়েক কুশলী পদ্ধতি আদেশ সেট দিয়ে মত মোকাবেলা করতে first(), last(), headSet(), এবং tailSet()ইত্যাদি

গুরুত্বপূর্ণ বিষয়:

  • উভয়ই উপাদানগুলির সদৃশ-মুক্ত সংগ্রহের গ্যারান্টি দেয়
  • হ্যাশসেটে উপাদান যুক্ত করা এবং তারপরে অনুলিপি-মুক্ত বাছাই করা ট্র্যাভারসালের জন্য সংগ্রহটিকে একটি ট্রিসেটে রূপান্তর করা সাধারণত দ্রুত হয়।
  • এর বাস্তবায়নগুলির কোনওটিই সিঙ্ক্রোনাইজ করা হয়নি। এটি হ'ল যদি একাধিক থ্রেড একই সাথে একটি সেট অ্যাক্সেস করে এবং কমপক্ষে একটি থ্রেড সেট পরিবর্তন করে তবে অবশ্যই এটি বাহ্যিকভাবে সিঙ্ক্রোনাইজ করা উচিত।
  • লিঙ্কডহ্যাশসেটটি কিছুটা অর্থে HashSetএবং এর মধ্যে মধ্যবর্তী হয় TreeSet। এর মাধ্যমে চলছে এমন একটি লিঙ্কযুক্ত তালিকা সহ একটি হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয়েছে, তবে এটি সন্নিবেশ-অর্ডারযুক্ত পুনরাবৃত্তি সরবরাহ করে যা ট্রিসেট দ্বারা গ্যারান্টিযুক্ত ট্র্যাভারসাল অনুসারে নয় ।

সুতরাং ব্যবহারের পছন্দটি পুরোপুরি আপনার প্রয়োজনের উপর নির্ভর করে তবে আমি অনুভব করি যে আপনার যদি অর্ডার করা সংগ্রহের প্রয়োজন হয় তবে আপনার এখনও সেটটি তৈরি করতে হ্যাশসেটকে পছন্দ করা উচিত এবং তারপরে এটিকে ট্রিসেটে রূপান্তর করতে হবে।

  • যেমন SortedSet<String> s = new TreeSet<String>(hashSet);

38
এটি কেবলমাত্র আমিই নিশ্চিত হয়েছি যে "হ্যাশসেটটি ট্রিসেটের চেয়ে অনেক দ্রুত (লগ-সময় বনাম ধ্রুবক সময় ...)" স্পষ্টতই ভুল? প্রথম যে এটি সময়-জটিলতা সম্পর্কিত, পরম সময় নয় এবং ও (1) অনেক ক্ষেত্রে ও (এফ (এন)) এর চেয়ে ধীর হতে পারে। দ্বিতীয় যে ও (লগএন) হ'ল "প্রায়" ও (1)। অনেক সাধারণ ক্ষেত্রে যদি ট্রিসেট একটি হ্যাশসেটকে ছাড়িয়ে যায় তবে আমি অবাক হব না।
— লভেলা

22
আমি কেবল ইভেলার মন্তব্যটি দ্বিতীয় করতে চাই। সময়-জটিলতা চলমান সময় হিসাবে একই জিনিস নয় এবং ও (1) সর্বদা ও (2 ^ n) এর চেয়ে ভাল হয় না। একটি বিকৃত উদাহরণ পয়েন্টটি ব্যাখ্যা করে: একটি হ্যাশ সেটটি হ্যাশ অ্যালগরিদম ব্যবহার করে বিবেচনা করুন যা 10 টি উপাদানের জন্য বুদ্বুদ সাজানোর (ও (এন ^ 2) গড় / সবচেয়ে খারাপ) বনাম কার্যকর করতে 1 ট্রিলিয়ন মেশিনের নির্দেশনা নিয়েছিল । বুদবুদ সাজানোর সময় প্রতিবারই জিতবে। মুল বক্তব্যটি হল অ্যালগোরিদম ক্লাসগুলি প্রত্যেককে সময়-জটিলতা ব্যবহার করে প্রায় অনুমান সম্পর্কে চিন্তা করতে শেখায় তবে বাস্তব বিশ্বে ধ্রুবক বিষয়গুলি প্রায়শই ম্যাটার হয়।
— পিটার ওহেলার্ট

17
সম্ভবত এটি কেবল আমিই, তবে প্রথমে হ্যাশসেটে সমস্ত কিছু যুক্ত করার পরামর্শ নেই এবং তারপরে গাছের গোড়ায় এটি একটি ভয়াবহ রূপান্তরিত করা উচিত? 1) হ্যাশসেটে সন্নিবেশ কেবলমাত্র দ্রুত হয় যদি আপনি আপনার ডেটাসেটের আকার আগেই জানেন তবে অন্যথায় আপনি একটি ও (এন) পুনরায় হ্যাশিং প্রদান করবেন, সম্ভবত একাধিকবার। এবং 2) সেটটি রূপান্তর করার সময় আপনি ট্রিসেট সন্নিবেশটির জন্য অর্থ প্রদান করেন। (প্রতিহিংসার সাথে, কারণ একটি হ্যাশসেটের মাধ্যমে পুনরাবৃত্তি মারাত্মকভাবে দক্ষ নয়)
— টিঙ্কারট্যাঙ্ক

5
এই পরামর্শটি একটি সেট জন্য, আপনি কোনও আইটেম যুক্ত করার আগে এটির সদৃশ কিনা তা দেখতে অবশ্যই পরীক্ষা করা উচিত; অতএব আপনি যদি ট্রিপসেটের উপর কোনও হ্যাশসেট ব্যবহার করছেন তবে নকলগুলি সরিয়ে আপনি সময় সাশ্রয় করবেন। যাইহোক, নন-অনুলিপিগুলির জন্য দ্বিতীয় সেট তৈরি করার জন্য মূল্য দেওয়ার জন্য বিবেচনা করে, ডুপ্লিকেটগুলির শতাংশটি এই দামটি অতিক্রম করতে এবং এটি একটি সময় বাঁচানোর জন্য সত্যই দুর্দান্ত হওয়া উচিত। এবং অবশ্যই, এটি মাঝারি এবং বড় সেটগুলির জন্য কারণ একটি ছোট সেটের জন্য, ট্রিট সম্ভবত হ্যাশসেটের চেয়ে দ্রুত।
— সিলেভেনএল

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

38

একটিটির এখনও উল্লেখ না করা একটি সুবিধা TreeSetহ'ল এর বৃহত্তর "লোকালটি" রয়েছে, যা বলার জন্য সংক্ষিপ্ততা রয়েছে (1) যদি দুটি এন্ট্রি ক্রমের TreeSetনিকটে থাকে , এটি একটি ডেটা কাঠামোতে একে অপরের নিকটে রাখে এবং তাই স্মৃতিতে; এবং (2) এই অবস্থানটি স্থানীয়তার নীতিটির সুবিধা গ্রহণ করে, যা বলে যে অনুরূপ ডেটা প্রায়শই অনুরূপ ফ্রিকোয়েন্সি সহ একটি অ্যাপ্লিকেশন দ্বারা অ্যাক্সেস করা হয়।

এটি কোনও এর বিপরীতে HashSet, যা এন্ট্রিগুলিকে সমস্ত স্মৃতিতে ছড়িয়ে দেয়, কীগুলি সেগুলিই নয়।

যখন হার্ড ড্রাইভ থেকে পড়ার বিলম্বিত ব্যয় ক্যাশে বা র‌্যাম থেকে পড়ার ব্যয় থেকে কয়েকগুণ বেশি হয় এবং যখন ডেটাটি লোকাল দিয়ে অ্যাক্সেস করা হয় তখন এটি TreeSetআরও ভাল পছন্দ হতে পারে।


3
আপনি কি প্রদর্শিততে পারেন যে দুটি প্রবেশিকা ক্রমের নিকটে থাকলে, একটি ট্রিসেট এগুলি একে অপরের কাছে ডেটা স্ট্রাকচারে রাখে এবং সেইজন্য মেমরিতে ?
— ডেভিড সোরোকো

6
জাভা জন্য যথেষ্ট অপ্রাসঙ্গিক। সেটটির উপাদানগুলি যেকোনো উপায়ে অবজেক্টস এবং অন্য কোথাও নির্দেশ করুন, যাতে আপনি অনেক কিছুই সঞ্চয় করছেন না।
— অ্যান্ড্রু গ্যাল্যাশ

জাভাতে সাধারণত স্থানীয়তার অভাব সম্পর্কে করা অন্যান্য মন্তব্য ছাড়াও ওপেনজেডিকে স্থানীয়ভাবে প্রয়োগ TreeSet/ কার্যকর TreeMapকরা যায় না। যদিও একটি লাল-কালো গাছ উপস্থাপন করতে 4 আদেশের একটি বি-ট্রি ব্যবহার করা সম্ভব হবে এবং এইভাবে লোকাল এবং ক্যাশে কার্যকারিতা উন্নত করা সম্ভব হবে না, বাস্তবায়নটি কীভাবে কাজ করে তা নয়। পরিবর্তে, প্রতিটি নোড তার নিজস্ব কী, তার নিজস্ব মান, তার পিতামাতা এবং তার বাম এবং ডান চাইল্ড নোডগুলিতে একটি পয়েন্টার সঞ্চয় করে, যা TreeMap.Entry এর JDK 8 উত্স কোডে প্রমাণিত ।
— kbolino

25

HashSetউপাদানগুলিতে অ্যাক্সেস করার জন্য ও (1), তাই এটি অবশ্যই গুরুত্বপূর্ণ। তবে সেটে বস্তুর ক্রম বজায় রাখা সম্ভব নয়।

TreeSetযদি আপনার কাছে কোনও অর্ডার (সন্নিবেশকরণ আদেশের পরিবর্তে নয় তবে মূল্যবোধের শর্তাবলী) বজায় রাখা কার্যকর হয়। তবে, যেমন আপনি উল্লেখ করেছেন, আপনি কোনও উপাদান অ্যাক্সেস করার জন্য ধীর সময়ের জন্য অর্ডার ট্রেড করছেন: বুনিয়াদি ক্রিয়াকলাপের জন্য ও (লগ এন)।

থেকে জন্য javadocsTreeSet :

এই বাস্তবায়ন মৌলিক অপারেশন জন্য নিশ্চিত লগ (ঢ) সময় খরচ প্রদান ( add, removeএবং contains)।


22

1. হ্যাশসেট নাল বস্তুর অনুমতি দেয়।

2.TreeSet নাল বস্তু অনুমতি দেবে না। আপনি যদি নাল মান যুক্ত করার চেষ্টা করেন এটি একটি নালপয়েন্টারএক্সসেপশন নিক্ষেপ করবে।

৩.হ্যাশসেটটি ট্রিসেটের থেকে অনেক দ্রুত।

যেমন

 TreeSet<String> ts = new TreeSet<String>();
 ts.add(null); // throws NullPointerException

 HashSet<String> hs = new HashSet<String>();
 hs.add(null); // runs fine

3
ts.add (নাল) ট্রিসেটের ক্ষেত্রে নালকে প্রথম অবজেক্ট হিসাবে যুক্ত করা হলে এটি ট্রিসেটের ক্ষেত্রে ঠিকঠাক কাজ করবে। এবং তারপরে যুক্ত হওয়া যে কোনও বস্তু তুলকের তুলনামূলক পদ্ধতিতে নলপয়েন্টারএক্সসেপশন দেবে।
— শোয়েব চিকাতে

2
আপনার সত্যিই nullআপনার সেটটিতে কোনওভাবেই যুক্ত করা উচিত নয় ।
— ফ্লফি

TreeSet<String> badassTreeSet = new TreeSet<String>(new Comparator<String>() { public int compare(String string1, String string2) { if (string1 == null) { return (string2 == null) ? 0 : -1; } else if (string2 == null) { return 1; } else { return string1.compareTo(string2); } } }); badassTreeSet.add("tree"); badassTreeSet.add("asdf"); badassTreeSet.add(null); badassTreeSet.add(null); badassTreeSet.add("set"); badassTreeSet.add("tree"); System.out.println(badassTreeSet);
— ডেভিড হোর্ভাথ

21

@ শেভচাইক দ্বারা মানচিত্রে মনোরম ভিজ্যুয়াল উত্তরের উপর ঝাঁকুনি দেওয়া আমার গ্রহণযোগ্যতা:

╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
║   Property   ║       HashSet       ║      TreeSet      ║     LinkedHashSet   ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║  no guarantee order ║ sorted according  ║                     ║
║   Order      ║ will remain constant║ to the natural    ║    insertion-order  ║
║              ║      over time      ║    ordering       ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Add/remove   ║        O(1)         ║     O(log(n))     ║        O(1)         ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║   NavigableSet    ║                     ║
║  Interfaces  ║         Set         ║       Set         ║         Set         ║
║              ║                     ║    SortedSet      ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║    not allowed    ║                     ║
║  Null values ║       allowed       ║ 1st element only  ║      allowed        ║
║              ║                     ║     in Java 7     ║                     ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║              ║   Fail-fast behavior of an iterator cannot be guaranteed      ║
║   Fail-fast  ║ impossible to make any hard guarantees in the presence of     ║
║   behavior   ║           unsynchronized concurrent modification              ║
╠══════════════╬═══════════════════════════════════════════════════════════════╣
║      Is      ║                                                               ║
║ synchronized ║              implementation is not synchronized               ║
╚══════════════╩═══════════════════════════════════════════════════════════════╝

13

সর্বাধিক ব্যবহারের কারণটি HashSetহ'ল অপারেশনগুলি ও (লগ এন) এর পরিবর্তে (গড়ে) ও (1) হয়। যদি সেটটিতে স্ট্যান্ডার্ড আইটেম থাকে তবে আপনি "হ্যাশ ফাংশনগুলির সাথে মেসেজ করবেন না" যেমনটি আপনার জন্য করা হয়েছে। যদি সেটটিতে কাস্টম ক্লাস থাকে তবে hashCodeআপনাকে ব্যবহারের জন্য প্রয়োগ করতে হবে HashSet(যদিও কার্যকর জাভা কীভাবে তা দেখায়) তবে আপনি যদি এটি ব্যবহার করেন তবে TreeSetএটি তৈরি করতে হবে Comparableবা সরবরাহ করতে হবে Comparator। ক্লাসের একটি নির্দিষ্ট অর্ডার না থাকলে এটি সমস্যা হতে পারে।

আমি মাঝে মাঝে ব্যবহার করেছি TreeSet(বা বাস্তবে)TreeMap খুব ছোট সেট / মানচিত্রের জন্য ) (<10 আইটেম) যদিও আমি এটি করার কোনও সত্যিকারের লাভ আছে কিনা তা পরীক্ষা করে দেখিনি। বড় সেটগুলির জন্য পার্থক্যটি যথেষ্ট বিবেচ্য হতে পারে।

এখন যদি আপনার বাছাই করা প্রয়োজন, তবে TreeSetএটি যথাযথ, যদিও আপডেটগুলি ঘন ঘন হয় এবং বাছাই করা ফলাফলের প্রয়োজন খুব কম হয়, কখনও কখনও সামগ্রীগুলি একটি তালিকা বা একটি অ্যারে অনুলিপি করে বাছাই করা দ্রুততর হতে পারে।


এই বড় উপাদান যেমন 10 কে বা আরও বেশি হিসাবে কোনও ডেটা পয়েন্ট করে
— কুহাজায়ান

11

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

স্মৃতি যদি আমাকে পরিবেশন করে তবে ইমোরিটিজড সময়টি কার্যকরী লাল-কালো গাছের সাথে ও (1) এর কাছাকাছি হতে পারে। ওকাসাকির বইয়ের চেয়ে আরও ভাল ব্যাখ্যা হবে যা আমি তুলতে পারি না। (বা তার প্রকাশনা তালিকা দেখুন )


7

হ্যাশসেট বাস্তবায়নগুলি অবশ্যই অনেক বেশি দ্রুত - কম ওভারহেড কারণ কোনও অর্ডার নেই। জাভাতে বিভিন্ন সেট বাস্তবায়নের একটি ভাল বিশ্লেষণ http://java.sun.com/docs/books/tutorial/collections/implementations/set.html এ সরবরাহ করা হয়েছে ।

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


4

TreeSet দুই সাজানো সংগ্রহের (অন্যান্য হচ্ছে TreeMap) অন্যতম। এটি একটি লাল-কালো গাছের কাঠামো ব্যবহার করে (তবে আপনি এটি জানতেন) এবং গ্যারান্টি দেয় যে উপাদানগুলি প্রাকৃতিক ক্রম অনুসারে আরোহণের ক্রমে থাকবে। Allyচ্ছিকভাবে, আপনি একটি কনস্ট্রাক্টরের সাথে একটি ট্রিসেট তৈরি করতে পারেন যা তুলনামূলক বা তুলনামূলক ব্যবহার করে আদেশটি কী হতে হবে (উপাদানগুলির শ্রেণীর দ্বারা সংজ্ঞায়িত ক্রমান্বয়ে নির্ভর করার চেয়ে) সংগ্রহের জন্য আপনার নিজস্ব নিয়ম দেয় give

এবং একটি লিঙ্কডহ্যাশসেট হ্যাশসেটের একটি আদেশযুক্ত সংস্করণ যা সমস্ত উপাদানগুলির মধ্যে দ্বিগুণ-লিঙ্কযুক্ত তালিকা বজায় রাখে। যখন আপনি পুনরাবৃত্তি আদেশের বিষয়ে যত্নশীল হ্যাশসেটের পরিবর্তে এই শ্রেণিটি ব্যবহার করুন। যখন আপনি একটি হ্যাশসেটের মাধ্যমে পুনরাবৃত্তি করবেন তখন আদেশটি অনির্দেশ্য, যখন কোনও লিংকডহ্যাশসেট আপনাকে যে উপাদানগুলিতে wereোকানো হয়েছিল সেগুলি অনুসারে উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করতে দেয়


3

প্রযুক্তিগত বিবেচনার ভিত্তিতে, বিশেষত পারফরম্যান্সের ভিত্তিতে প্রচুর উত্তর দেওয়া হয়েছে। আমার মতে, পছন্দ TreeSetএবং HashSetবিষয়গুলির মধ্যে পছন্দ করুন ।

তবে আমি বরং বলব পছন্দটি প্রথমে ধারণাগত বিবেচনার দ্বারা চালিত হওয়া উচিত ।

যদি, আপনার প্রয়োজনীয় জিনিসগুলি হস্তক্ষেপ করার প্রয়োজন হয়, তবে একটি প্রাকৃতিক ক্রমটি অর্থে আসে না, তবে ব্যবহার করবেন না TreeSet।
এটি একটি সাজানো সেট, যেহেতু এটি প্রয়োগ করে SortedSet। সুতরাং এর অর্থ এটি হল যে আপনাকে ফাংশনটি ওভাররাইড করতে হবে যা শিক্ষার্থীদের মধ্যে কোনও প্রাকৃতিক ক্রম নেই বলে compareToরিটার্ন ফাংশনটি কী বোঝাতে পারে তার সাথে সামঞ্জস্য হওয়া উচিত । আপনি তাদের গড় গ্রেড দিয়ে তাদের অর্ডার করতে পারেন, ঠিক আছে, তবে এটি কোনও "প্রাকৃতিক ক্রম" নয়। ক্রিয়াequals । উদাহরণস্বরূপ, যদি আপনার কাছে স্টুডেন্ট নামে একটি শ্রেণীর অবজেক্টের সেট থাকে তবে আমি এটিকে ভাবি নাTreeSetcompareToযখন দুটি বস্তু একই শিক্ষার্থীকে উপস্থাপন করে কেবল তখনই 0 ফেরত আসে না, তবে যখন দুটি পৃথক শিক্ষার্থীর সমান গ্রেড থাকে। দ্বিতীয় ক্ষেত্রে, equalsমিথ্যা প্রত্যাবর্তন করবে (যদি না আপনি যদি দুটি ভিন্ন শিক্ষার্থীর একই গ্রেড থাকে তবে দ্বিতীয়টি সঠিক বলে সিদ্ধান্ত না নেন যা equalsফাংশনটির একটি বিভ্রান্তিমূলক অর্থ রাখে, ভুল অর্থ না বলে))
দয়া করে equalsএবং এর মধ্যে এই ধারাবাহিকতাটি লক্ষ্য করুন compareToalচ্ছিক, তবে দৃ strongly়ভাবে প্রস্তাবিত। অন্যথায় ইন্টারফেসের চুক্তিটি Setভঙ্গ হয়ে গেছে, আপনার কোডটিকে অন্য ব্যক্তির কাছে বিভ্রান্ত করছে, সুতরাং এটি সম্ভবত অপ্রত্যাশিত আচরণের দিকে পরিচালিত করে।

এই লিঙ্কটি এই প্রশ্নটি সম্পর্কিত তথ্যের একটি ভাল উত্স হতে পারে।


3

আপেল কেন কমলা থাকতে পারে?

গুরুতরভাবে ছেলেরা এবং গালগুলি - যদি আপনার সংগ্রহটি বড় হয়, পড়ুন এবং গাজিলিয়ন সময়গুলিতে লিখিত হয়েছে এবং আপনি সিপিইউ চক্রের জন্য অর্থ প্রদান করছেন, তবে সংগ্রহের পছন্দটি কেবলমাত্র প্রাসঙ্গিক যদি আপনি এটি আরও ভাল সঞ্চালনের জন্য প্রয়োজন হয়। তবে, বেশিরভাগ ক্ষেত্রে, এটি সত্যিকার অর্থে কিছু যায় আসে না - এখানে কয়েক মিলিসেকেন্ড এবং সেখানে মানবিক বিবেচনায় নজর নেই। যদি এটি সত্যিই এতটা গুরুত্বপূর্ণ হয় তবে আপনি এসেম্ব্লার বা সি-তে কোড লিখছেন না কেন? [আরেকটি আলোচনা কিউ]। সুতরাং মুল বক্তব্যটি হ'ল আপনি যদি পছন্দ করেন তবে যে কোনও সংগ্রহ ব্যবহার করে আপনি খুশি হন এবং এটি আপনার সমস্যার সমাধান করে [এমনকি যদি এটি বিশেষত টাস্কের জন্য সেরা ধরণের সংগ্রহ নাও হয় তবে] নিজেকে ছিটকে যান। সফ্টওয়্যারটি মলিনযোগ্য। প্রয়োজনে আপনার কোডটি অনুকূলিত করুন। চাচা বব বলেছেন অকালীন অপটিমাইজেশন হ'ল সমস্ত কুফলের মূল। চাচা বব তাই বলেন


1

বার্তা সম্পাদনা ( সম্পূর্ণ পুনর্লিখন ) যখন অর্ডারটি কোনও ব্যাপার না, তখনই। উভয়েরই লগ (এন) দেওয়া উচিত - এটি উভয়ের তুলনায় পাঁচ শতাংশেরও বেশি দ্রুত কিনা তা দেখার সুবিধা হবে util হ্যাশসেট একটি লুপে ও (1) পরীক্ষা দিতে পারে তা প্রকাশ করা উচিত।


-3
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class HashTreeSetCompare {

    //It is generally faster to add elements to the HashSet and then
    //convert the collection to a TreeSet for a duplicate-free sorted
    //Traversal.

    //really? 
    O(Hash + tree set) > O(tree set) ??
    Really???? Why?



    public static void main(String args[]) {

        int size = 80000;
        useHashThenTreeSet(size);
        useTreeSetOnly(size);

    }

    private static void useTreeSetOnly(int size) {

        System.out.println("useTreeSetOnly: ");
        long start = System.currentTimeMillis();
        Set<String> sortedSet = new TreeSet<String>();

        for (int i = 0; i < size; i++) {
            sortedSet.add(i + "");
        }

        //System.out.println(sortedSet);
        long end = System.currentTimeMillis();

        System.out.println("useTreeSetOnly: " + (end - start));
    }

    private static void useHashThenTreeSet(int size) {

        System.out.println("useHashThenTreeSet: ");
        long start = System.currentTimeMillis();
        Set<String> set = new HashSet<String>();

        for (int i = 0; i < size; i++) {
            set.add(i + "");
        }

        Set<String> sortedSet = new TreeSet<String>(set);
        //System.out.println(sortedSet);
        long end = System.currentTimeMillis();

        System.out.println("useHashThenTreeSet: " + (end - start));
    }
}

1
পোস্টটি বলেছে যে হ্যাশসেটে উপাদান যুক্ত করা এবং তারপরে অনুলিপি-মুক্ত বাছাই করা ট্র্যাভারসালের জন্য সংগ্রহটি একটি ট্রিসেটে রূপান্তর করা সাধারণত দ্রুত হয়। <স্ট্রিং> এস = নতুন ট্রিসেট <স্ট্রিং> (হ্যাশসেট) সেট করুন; আমি ভাবছি কেন <স্ট্রিং> এস = নতুন ট্রিসেট <স্ট্রিং> () সরাসরি সেট করুন না যদি আমরা জানি যদি এটি সাজানো পুনরাবৃত্তির জন্য ব্যবহৃত হবে, তাই আমি এই তুলনা করেছি এবং ফলাফলটি দেখিয়েছে যে দ্রুততর।
— gli00001

"কোন ক্ষেত্রে আমি একটি ট্রিসেটের উপর একটি হ্যাশসেট ব্যবহার করতে চাই?"
— অস্টিন হেনলি

1
আমার বক্তব্যটি হ'ল, যদি আপনাকে অর্ডার দেওয়ার দরকার হয় তবে হ্যাশসেটে সমস্ত কিছু রাখার চেয়ে একা ট্রিসেট ব্যবহার করা ভাল that সেই হ্যাশসেটের উপর ভিত্তি করে একটি ট্রিসেট তৈরি করা। আমি আসল পোস্ট থেকে হ্যাশসেট + ট্রিসেটের মান মোটেও দেখছি না।
— gli00001

@ gli00001: আপনি পয়েন্টটি মিস করেছেন। আপনার যদি সবসময় আপনার উপাদানগুলির সেট বাছাই করার প্রয়োজন হয় না, তবে এটি প্রায়শই হেরফের করতে চলেছে, তবে বেশিরভাগ সময় দ্রুত অপারেশনগুলি থেকে উপকার পেতে আপনি একটি হ্যাশসেট ব্যবহার করা আপনার পক্ষে উপযুক্ত। জন্য অনিয়মিত বার যেখানে আপনি অনুক্রমে উপাদানের প্রক্রিয়া করতে প্রয়োজন হয় তাহলে, শুধুমাত্র একটি treeset সঙ্গে মোড়ানো। এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে, তবে এটি অতুলনীয় ব্যবহারের ক্ষেত্রে খুব বেশি কিছু নয় (এবং এটি সম্ভবত এমন একটি সেট ধরে নিয়েছে যা খুব বেশি উপাদান এবং জটিল ক্রমবিধি বিধি সহ না করে)।
— হাইলেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.