এই দুটি খুব অনুরূপ বলে মনে হয় এবং প্রায় একই ধরণের কাঠামো রয়েছে। পার্থক্য কি? প্রতিটি বিভিন্ন অপারেশন জন্য সময় জটিলতা কি?
এই দুটি খুব অনুরূপ বলে মনে হয় এবং প্রায় একই ধরণের কাঠামো রয়েছে। পার্থক্য কি? প্রতিটি বিভিন্ন অপারেশন জন্য সময় জটিলতা কি?
উত্তর:
হিপ কেবল গ্যারান্টি দেয় যে উচ্চ স্তরের উপাদানগুলি নিম্ন স্তরের উপাদানগুলির চেয়ে বেশি (সর্বোচ্চ-হিপ জন্য) বা আরও ছোট (মিনিট-হিপের জন্য), তবে বিএসটি আদেশ দেয় ("বাম" থেকে "ডানদিকে") guaran আপনি যদি সাজানো উপাদান চান তবে বিএসটি দিয়ে যান। দান্তে কোনও গীক নয়
ফাইন্ডমিন / ফাইন্ডম্যাক্স (ও (1)) এ হিপ ভাল, অন্যদিকে বিএসটি সব ফাইন্ডে (ও (লগএন)) ভাল। উভয় কাঠামোর জন্য সন্নিবেশ করা হয় ও (লগএন)। যদি আপনি কেবল ফাইন্ডমিন / ফাইন্ডম্যাক্সের (যেমন অগ্রাধিকার-সম্পর্কিত) যত্নশীল হন তবে গাদা দিয়ে যান। আপনি যদি সাজানো সব কিছু চান তবে বিএসটি দিয়ে যান।
উভয় বাইনারি অনুসন্ধান গাছ এবং বাইনারি গাদা গাছ-ভিত্তিক ডেটা স্ট্রাকচার আছে।
স্তূপগুলির জন্য নোডগুলি তাদের বাচ্চার চেয়ে অগ্রাধিকারের প্রয়োজন। সর্বাধিক স্তূপে প্রতিটি নোডের শিশুদের নিজের থেকে কম হওয়া উচিত। এটি একটি মিনিটের গাদা জন্য বিপরীত:
বাইনারি অনুসন্ধান গাছগুলি (বিএসটি) ভাইবোন নোডগুলির মধ্যে একটি নির্দিষ্ট ক্রম (প্রি-অর্ডার, ইন-অর্ডার, পোস্ট-অর্ডার) অনুসরণ করে। গাছটি অবশ্যই গাদা করা উচিত , গাদা থেকে পৃথক:
সন্নিবেশ, মোছা এবং অনুসন্ধানের জন্য বিএসটি-তে গড় ।
বাইনারি গাদা হতে আপনারটি গড় আছে findMin / findMax এবং জন্য ঢোকানো এবং মুছে ফেলার জন্য।
সারাংশ
Type BST (*) Heap
Insert average log(n) 1
Insert worst log(n) log(n) or n (***)
Find any worst log(n) n
Find max worst 1 (**) 1
Create worst n log(n) n
Delete worst log(n) log(n)
এই টেবিলের সমস্ত গড় সময় সন্নিবেশ করা বাদে তাদের খারাপ সময়গুলির সমান।
*
: এই উত্তরের সর্বত্র, বিএসটি == ভারসাম্য বিএসটি, যেহেতু ভারসাম্যহীন অ্যাসেম্পোটোটিকভাবে সফল হয়**
: এই উত্তরে একটি তুচ্ছ পরিবর্তন ব্যবহার করে ব্যাখ্যা করা হয়েছে***
: log(n)
পয়েন্টার গাছের গাদা n
জন্য, গতিশীল অ্যারে হিপ জন্যএকটি বিএসটি-তে বাইনারি হ্যাপের সুবিধা
বাইনারি হিপগুলিতে গড় সময় সন্নিবেশ হ'ল O(1)
বিএসটি-র জন্য O(log(n))
। এটি স্তূপগুলির হত্যাকারী বৈশিষ্ট্য।
এছাড়াও অন্যান্য হিপগুলি রয়েছে যা ফিবোনাচি হিপগুলিরO(1)
মতো এমোরাইজড (শক্তিশালী) এবং ব্রোডাল কিউয়ের মতো সবচেয়ে খারাপ ক্ষেত্রেও পৌঁছেছে , যদিও অ-অ্যাসিম্পোটিক পারফরম্যান্সের কারণে তারা ব্যবহারিক নাও হতে পারে: https://stackoverflow.com/questions/30782636 / হয়-Fibonacci-হিপস-অর-brodal-সারিগুলি ব্যবহৃত-ইন-অনুশীলন যে কোনো জায়গায়
বাইনারি হ্যাপগুলি গতিশীল অ্যারে বা পয়েন্টার ভিত্তিক গাছগুলির উপরে দক্ষতার সাথে প্রয়োগ করা যেতে পারে , বিএসটি কেবলমাত্র পয়েন্টার ভিত্তিক গাছ। সুতরাং আমরা যদি মাঝেমধ্যে পুনরায় আকারের বিলম্বকে সামর্থ করতে পারি তবে স্তূপের জন্য আমরা আরও বেশি স্থানের দক্ষ অ্যারে বাস্তবায়ন বেছে নিতে পারি।
বাইনারি গাদা সৃষ্টি হয় O(n)
সবচেয়ে খারাপ ক্ষেত্রে , O(n log(n))
বিএসটি জন্য।
বাইনারি হিপগুলির উপরে বিএসটি-র সুবিধা
স্বেচ্ছাসেবী উপাদানগুলির জন্য অনুসন্ধান করা হয় O(log(n))
। এটি বিএসটিগুলির হত্যাকারী বৈশিষ্ট্য।
গাদা জন্য, এটি O(n)
সাধারণত, বৃহত্তম উপাদান ছাড়া যা হয় O(1)
।
বিএসটি-র উপর গাদা করার "ভুয়া" সুবিধা
গাদা O(1)
সর্বোচ্চ, বিএসটি সন্ধান করতে হয় O(log(n))
।
এটি একটি সাধারণ ভুল ধারণা, কারণ বৃহত্তম উপাদানটির উপর নজর রাখতে কোনও বিএসটি সংশোধন করা তাত্পর্যপূর্ণ এবং যখনই এই উপাদানটি পরিবর্তিত হতে পারে আপডেট করুন: অপসারণের পরে একটি বৃহত্তর একটি অদলবদল সন্নিবেশ করার পরে দ্বিতীয় বৃহত্তমটি খুঁজে পাওয়া যায় find https://stackoverflow.com/questions/7878622/can-we-use-binary-search-tree-to-simulate-heap-operation ( ইয়েও উল্লেখ করেছেন )।
প্রকৃতপক্ষে, এটি বিএসটিগুলির তুলনায় গাদাগুলির সীমাবদ্ধতা : একমাত্র দক্ষ অনুসন্ধান এটি বৃহত্তম উপাদানটির জন্য।
গড় বাইনারি হ্যাপ সন্নিবেশ করা হয় O(1)
সূত্র:
স্বজ্ঞাত যুক্তি:
বাইনারি হিপগুলিতে, প্রদত্ত সূচকে মান বৃদ্ধি করাও O(1)
একই কারণে। তবে আপনি যদি এটি করতে চান তবে সম্ভবত হিপ অপারেশনগুলিতে আপনি অতিরিক্ত সূচি আপ-টু-ডেট রাখতে চান https://stackoverflow.com/questions/17009056/how-to-implement-ologn-decrease- কী-অপারেশন-মিনি-হিপ-ভিত্তিক-অগ্রাধিকার-কুই জন্য উদাহরণস্বরূপ ডিজকস্ট্রার জন্য। কোনও অতিরিক্ত সময় ব্যয় ছাড়াই সম্ভব।
জিসিসি সি ++ স্ট্যান্ডার্ড লাইব্রেরি রিয়েল হার্ডওয়ারে বেনমার্ক .োকান
আমি + োকানোর সময়গুলি সম্পর্কে সঠিক কিনা তা দেখার জন্য আমি সি ++ std::set
( লাল-কালো গাছ বিএসটি ) এবং std::priority_queue
( গতিশীল অ্যারে হিপ ) সন্নিবেশকে বেঞ্চমার্ক করেছি এবং আমি এটি পেয়েছি:
তাই পরিষ্কার:
হিপ সন্নিবেশ সময় মূলত ধ্রুবক।
আমরা গতিশীল অ্যারে পুনরায় আকার পয়েন্টগুলি পরিষ্কারভাবে দেখতে পারি। যেহেতু আমরা উপরের সমস্ত সিস্টেমের গোলমালে যে কোনও কিছু দেখতে সক্ষম হতে প্রতি 10 কে সন্নিবেশকে গড় গড় দিচ্ছি , সেই শৃঙ্গগুলি বাস্তবে দেখানো থেকে 10k গুণ বেশি বড়!
জুমেড গ্রাফটি মূলত কেবল অ্যারে পুনরায় আকারের পয়েন্টগুলি বাদ দেয় এবং দেখায় যে প্রায় সমস্ত সন্নিবেশগুলি 25 ন্যানোসেকেন্ডের আওতায় পড়ে।
বিএসটি লোগারিথমিক ith সমস্ত serোকানো গড় হ্যাপ সন্নিবেশের তুলনায় অনেক ধীর er
বিএসটি বনাম হ্যাশম্যাপের বিশদ বিশ্লেষণ এখানে: https://stackoverflow.com/questions/18414579/ কি-data-st संरचना-is-inside-stdmap-in-c/51945119#51945119
জিসি সি ++ স্ট্যান্ডার্ড লাইব্রেরি রত্ন 5 তে মাপদণ্ডের বেঞ্চমার্ক
জেম 5 একটি সম্পূর্ণ সিস্টেম সিমুলেটর, এবং তাই এর সাথে একটি অসীম নির্ভুল ঘড়ি সরবরাহ করে m5 dumpstats
। তাই আমি পৃথক প্রবেশের সময় নির্ধারণের জন্য এটি ব্যবহার করার চেষ্টা করেছি।
ব্যাখ্যা:
গাদা এখনও স্থির, তবে এখন আমরা আরও বিশদে দেখতে পাচ্ছি যে কয়েকটি লাইন রয়েছে এবং প্রতিটি উচ্চতর লাইনই বেশি বিচ্ছিন্ন।
এটি উচ্চতর এবং উচ্চতর সন্নিবেশগুলির জন্য মেমরি অ্যাক্সেসের বিলম্বের সাথে সম্পন্ন হওয়া আবশ্যক।
টোডো আমি বিএসটিকে সম্পূর্ণরূপে ব্যাখ্যা করতে পারি না কারণ এটি এত লোগারিথিক এবং কিছুটা বেশি ধ্রুবক লাগে না।
এই বৃহত্তর বিশদটি সহ আমরা দেখতে পাচ্ছি কয়েকটি স্বতন্ত্র লাইনও দেখতে পাবে তবে তারা যেটি উপস্থাপন করে তা আমি নিশ্চিত নই: আমি নীচের লাইনটি আরও পাতলা হওয়ার প্রত্যাশা করব, যেহেতু আমরা উপরের নীচের অংশটি সন্নিবেশ করি?
একটি আড়াল H64 এইচপিআই সিপিইউতে এই বিল্ড্রুট সেটআপের সাথে বেঞ্চমার্কযুক্ত ।
বিএসটি কোনও অ্যারেতে দক্ষতার সাথে প্রয়োগ করা যায় না
হিপ অপারেশনগুলিতে কেবল একটি গাছের শাখাকে বুদ্বুদ করা বা নীচে ফেলা প্রয়োজন, তাই O(log(n))
সবচেয়ে খারাপ পরিস্থিতি স্বাপ হয়, O(1)
গড়।
একটি বিএসটি ভারসাম্য বজায় রাখার জন্য গাছের আবর্তন প্রয়োজন, যা অন্য একটির জন্য শীর্ষ উপাদানকে পরিবর্তন করতে পারে এবং পুরো অ্যারেটি ( O(n)
) ঘুরতে হবে ।
গাদা একটি অ্যারে দক্ষতার সাথে প্রয়োগ করা যেতে পারে
পিতামাতার এবং শিশুদের সূচকগুলি এখানে প্রদর্শিত হিসাবে বর্তমান সূচি থেকে গণনা করা যেতে পারে ।
বিএসটি-র মতো কোনও ভারসাম্যমূলক ক্রিয়াকলাপ নেই।
মিনিট মুছুন সবচেয়ে উদ্বেগজনক অপারেশন কারণ এটি শীর্ষে ডাউন হতে হয়। তবে এখানে বর্ণিত হিসাবে এটি সর্বদা স্তূপের একটি শাখা "পেরকোলেট করে" করা যায় । এটি একটি ও (লগ (এন)) সবচেয়ে খারাপ ক্ষেত্রে বাড়ে, যেহেতু গাদা সর্বদা ভাল সুষম থাকে।
আপনি মুছে ফেলা প্রত্যেকটির জন্য যদি একটি একক নোড inোকাচ্ছেন তবে আপনি অ্যাসিমেটটিক ও (1) গড় সন্নিবেশের সুবিধাটি হারাবেন যা মোছাগুলি মুছে ফেলা হবে, এবং আপনি পাশাপাশি একটি বিএসটি ব্যবহার করতে পারেন। ডিজকસ્ત્રা প্রতিটি অপসারণের জন্য নোডগুলি বেশ কয়েকবার আপডেট করে, তাই আমরা ভাল আছি।
গতিশীল অ্যারে হ্যাপস বনাম পয়েন্টার ট্রি হ্যাপস
পয়েন্টার হ্যাপগুলির শীর্ষে হিপগুলি দক্ষতার সাথে প্রয়োগ করা যেতে পারে: https://stackoverflow.com
গতিশীল অ্যারে বাস্তবায়ন আরও স্থান দক্ষ। মনে করুন যে প্রতিটি গাদা উপাদানটিতে একটিতে কেবলমাত্র একটি পয়েন্টার রয়েছে struct
:
গাছ প্রয়োগের জন্য প্রতিটি উপাদানের জন্য তিনটি পয়েন্টার সংরক্ষণ করতে হবে: পিতামাতা, বাম শিশু এবং ডান শিশু। সুতরাং মেমরির ব্যবহার সর্বদা হয় 4n
(3 টি ট্রি পয়েন্টার + 1 struct
পয়েন্টার)।
বৃক্ষ বিএসটিগুলিতে আরও ভারসাম্যপূর্ণ তথ্যের প্রয়োজন হবে, যেমন- কালো-লাল-নেস।
গতিশীল অ্যারে বাস্তবায়ন 2n
দ্বিগুণ হওয়ার ঠিক পরে আকার হতে পারে । সুতরাং এটি হতে চলেছে 1.5n
।
অন্যদিকে, গাছের স্তূপগুলি সবচেয়ে খারাপ ক্ষেত্রে সন্নিবেশ করায়, কারণ ব্যাকিং গতিশীল অ্যারে এর আকার দ্বিগুণ করার জন্য অনুলিপি করা সবচেয়ে O(n)
খারাপ লাগে , অন্যদিকে গাছের গাদা প্রতিটি নোডের জন্য কেবল নতুন ছোট বরাদ্দ করে।
তবুও, ব্যাকিং অ্যারে দ্বিগুণ হওয়া O(1)
সূচিত হয়েছে, তাই এটি সর্বোচ্চ বিলম্বিত বিবেচনায় নেমে আসে। এখানে উল্লেখ করা হয়েছে ।
দর্শন
বিএসটিগুলি পিতা বা মাতা এবং সমস্ত বংশধরদের মধ্যে একটি বৈশ্বিক সম্পত্তি বজায় রাখে (ছোট ছোট, ডানদিকে বড়)।
একটি বিএসটি-র শীর্ষ নোডটি মাঝারি উপাদান, যা বজায় রাখতে বিশ্বব্যাপী জ্ঞান প্রয়োজন (কতগুলি ছোট এবং বৃহত্তর উপাদান রয়েছে তা জেনে)।
এই বিশ্বব্যাপী সম্পত্তিটি রক্ষণাবেক্ষণ করতে (লগ এন সন্নিবেশ করা) আরও ব্যয়বহুল, তবে আরও শক্তিশালী অনুসন্ধান (লগ এন অনুসন্ধান) দেয়।
গাদা পিতামাতা এবং প্রত্যক্ষ বাচ্চাদের (পিতামাতাদের> শিশুদের) মধ্যে একটি স্থানীয় সম্পত্তি বজায় রাখে।
স্তূপের শীর্ষ নোটটি হ'ল বড় উপাদান, যা কেবল বজায় রাখতে স্থানীয় জ্ঞান প্রয়োজন (আপনার পিতামাতাকে জানার)।
দ্বি-সংযুক্ত তালিকা list
দ্বিগুণ সংযুক্ত তালিকাকে স্তূপের উপসেট হিসাবে দেখা যেতে পারে যেখানে প্রথম আইটেমটির সর্বাধিক অগ্রাধিকার রয়েছে, সুতরাং আসুন এখানেও তাদের তুলনা করুন:
O(1)
যেহেতু আমাদের আইটেমগুলিতে পয়েন্টার রয়েছে সেহেতু সবচেয়ে খারাপ পরিস্থিতি এবং আপডেটটি সত্যই সহজO(1)
গড়, লিঙ্কযুক্ত তালিকার চেয়ে খারাপ। আরও সাধারণ সন্নিবেশ অবস্থানের জন্য ট্রেড অফ।O(n)
উভয়ের জন্যএটির জন্য ব্যবহারের ক্ষেত্রে হিপটির কীটি বর্তমান টাইমস্ট্যাম্প থাকে: সেক্ষেত্রে নতুন প্রবেশিকা সর্বদা তালিকার শুরুতে যাবে। সুতরাং আমরা এমনকি পুরো টাইমস্ট্যাম্পটি সম্পূর্ণরূপে ভুলে যেতে পারি এবং কেবলমাত্র অগ্রাধিকার হিসাবে তালিকায় অবস্থানটি রাখি।
এটি একটি এলআরইউ ক্যাশে প্রয়োগ করতে ব্যবহার করা যেতে পারে । শুধু Dijkstra মত গাদা অ্যাপ্লিকেশনের জন্য , আপনি তালিকার সংশ্লিষ্ট নোড চাবিকাঠি থেকে একটি অতিরিক্ত hashmap রাখা, যা নোড দ্রুত আপডেট করার জন্য খুঁজতে চান হবে।
বিভিন্ন ভারসাম্য বিএসটি এর তুলনা
যদিও অ্যাসিম্পটোটিক সন্নিবেশ করানো হয় এবং সাধারণভাবে "ভারসাম্য বিএসটি" হিসাবে শ্রেণীবদ্ধ করা সমস্ত ডেটা স্ট্রাকচারের জন্য সময় সন্ধান করি যা আমি এখনও দেখতে পেয়েছি একই, বিভিন্ন বিবিএসটিতে বিভিন্ন ট্রেড-অফ রয়েছে। আমি এখনও এটি পুরোপুরি অধ্যয়ন করি নি, তবে এখানে এই বাণিজ্য-সংক্ষেপগুলি সংক্ষিপ্ত করা ভাল হবে:
আরো দেখুন
সিএসে অনুরূপ প্রশ্ন: একটি বাইনারি অনুসন্ধান গাছ এবং বাইনারি হ্যাপের মধ্যে পার্থক্য কী?
ডেটা স্ট্রাকচারের সাথে একজনকে উদ্বেগের মাত্রা আলাদা করতে হবে।
এই প্রশ্নের বিমূর্ত ডেটা স্ট্রাকচার (বস্তুগুলি সংরক্ষণ করা, তাদের ক্রিয়াকলাপ) আলাদা different একটি অগ্রাধিকার সারি প্রয়োগ করে, অন্যটি সেট করে। একটি অগ্রাধিকার সারি একটি স্বেচ্ছাসেবী উপাদান সন্ধান করতে আগ্রহী নয়, বৃহত্তম অগ্রাধিকার সহ কেবল এটিই।
কংক্রিট বাস্তবায়নের স্ট্রাকচার। এখানে প্রথম দর্শনে উভয়ই (বাইনারি) গাছ, যদিও বিভিন্ন কাঠামোগত বৈশিষ্ট্য সহ। কীগুলির আপেক্ষিক ক্রম এবং সম্ভাব্য বৈশ্বিক কাঠামো উভয়ই পৃথক। (কিছুটা অসম্পূর্ণভাবে, BST
কীগুলিতে বাম থেকে ডান দিকে অর্ডার করা হয়, একটি গাদাতে তাদের উপরের নিচে অর্ডার দেওয়া হয়)) আইপল্যান্ট সঠিকভাবে মন্তব্য করার সাথে একটি apੇਰটিও "সম্পূর্ণ" হওয়া উচিত।
নিম্ন স্তরের বাস্তবায়নে চূড়ান্ত পার্থক্য রয়েছে । একটি (ভারসাম্যহীন) বাইনারি অনুসন্ধান-বৃক্ষের পয়েন্টার ব্যবহার করে একটি মানক প্রয়োগ রয়েছে implementation বিপরীতে একটি বাইনারি গাদা একটি অ্যারে ব্যবহার করে একটি কার্যকর বাস্তবায়ন রয়েছে (সুনির্দিষ্টভাবে সীমিত কাঠামোর কারণে)।