কীভাবে গাদা তৈরি করা ও (এন) সময়ের জটিলতা হতে পারে?


494

কেউ কীভাবে গাদা তৈরি করতে ও (এন) জটিলতা বোঝাতে সহায়তা করতে পারে?

একটি গাদা একটি আইটেম .োকানো হয় O(log n), এবং সন্নিবেশ n / 2 বার পুনরাবৃত্তি করা হয় (বাকি পাতা হয়, এবং গাদা সম্পত্তি লঙ্ঘন করতে পারে না)। সুতরাং, এর অর্থ জটিলতা হওয়া উচিত O(n log n), আমি ভাবব।

অন্য কথায়, প্রতিটি আইটেমের জন্য আমরা "heapify" করি, এটি এখন পর্যন্ত স্তূপের জন্য প্রতিটি স্তরের জন্য একবার ফিল্টার করার সম্ভাবনা রয়েছে (যা লগ এন স্তরসমূহ)।

আমি কী মিস করছি?


একটি গাদা "বিল্ডিং" বলতে কী বোঝেন?
mfrankli

যেমন আপনি হিপসোর্টে যাবেন, একটি অর্পিত বিন্যাসে নিন এবং শীর্ষ স্তরের প্রতিটি উপাদানকে ফিল্টারডাউন করুন যতক্ষণ না এটি একটি স্তূপের নিয়ম মেনে চলে না
জিবিএ

2
আমি কেবল এই লিঙ্কটিই দেখতে পেলাম: বিল্ডহীপের জটিলতাটি Θ (n lg n) হিসাবে প্রতীয়মান হয়েছে - এন প্রতি কলে ap (lg n) ব্যয়ে হেপিফায় কল করে, তবে এই ফলাফলটিকে উন্নত করে Θ (n) করা যেতে পারে cs.txstate.edu/~ch04/webest/teaching/courses/5329/lectures/…
জিবা

2
@Gba MIT- র থেকে এই ভিডিওটি দেখতে তিনি, কিভাবে আমরা পেতে হে (ঢ) উপর ভাল ব্যাখ্যা করে গণিতের একটি লিল বিট সঙ্গে youtube.com/watch?v=B7hVxCmfPtM
CodeShadow

2
@ কোডে শ্যাডো উল্লিখিত ব্যাখ্যার সরাসরি লিঙ্ক: youtu.be/B7hVxCmfPtM?t=41m21s
sha1

উত্তর:


435

আমি মনে করি এই বিষয়টিতে বেশ কয়েকটি প্রশ্ন সমাহিত হয়েছে:

  • ও (এন) সময়ে buildHeapএটি চালিত হয় কীভাবে আপনি বাস্তবায়ন করবেন ?
  • সঠিকভাবে প্রয়োগের সময় আপনি কীভাবে ও (এন) সময়ে buildHeapচলে তা দেখান ?
  • ও (এন লগ এন) এর চেয়ে ও (এন ) সময়ে হিপ সাজানোর জন্য একই যুক্তিটি কেন কাজ করে না ?

ও (এন) সময়ে buildHeapএটি চালিত হয় কীভাবে আপনি বাস্তবায়ন করবেন ?

প্রায়শই, এসব প্রশ্নের উত্তর মধ্যে পার্থক্য উপর ফোকাস siftUpএবং siftDown। মধ্যে সঠিক পছন্দ siftUpএবং siftDownপেতে গুরুত্বপূর্ণ হে (ঢ) জন্য কর্মক্ষমতা buildHeapকিন্তু সাহায্যের এক কিছুই মধ্যে পার্থক্য বুঝতে না buildHeapএবং heapSortসাধারণভাবে। বস্তুত, উভয় যথাযথ বাস্তবায়নের buildHeapএবং heapSortহবে শুধুমাত্র ব্যবহার siftDownsiftUpঅপারেশনটি কেবল একটি বিদ্যমান গাদা মধ্যে সন্নিবেশ সম্পাদন করা প্রয়োজন, সুতরাং এটি বাইনারি হিপ ব্যবহার করে অগ্রাধিকারের সারিটি প্রয়োগ করতে ব্যবহৃত হবে, উদাহরণস্বরূপ।

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

গাদা সম্পত্তি নির্দিষ্ট করে একটি বাইনারি গাদা প্রতিটি নোডের অন্তত তার শিশু দুটি মত বৃহৎ হতে হবে। বিশেষত, এটি বোঝাচ্ছে যে গাদা সবচেয়ে বড় আইটেমটি মূলে রয়েছে। নীচে সরানো এবং উপরে তোলা মূলত বিপরীত দিকগুলিতে একই ক্রিয়াকলাপ: একটি আপত্তিজনক নোডটি সরান যতক্ষণ না এটি স্তূপের সম্পত্তিটি সন্তুষ্ট করে:

  • siftDown একটি নোডকে অদলবদল করে যা তার বৃহত্তম সন্তানের সাথে খুব ছোট (যার ফলে এটি নীচে সরানো হয়) যতক্ষণ না এটি তার নীচের উভয় নোডের মতো কমপক্ষে বড় না হয়।
  • siftUp এটির উপরে নোডের চেয়ে বড় না হওয়া অবধি একটি নোড অদলবদল করে যা তার পিতামাতার সাথে খুব বড় (ততক্ষণে এটি সরানো হয়)।

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

buildHeapফাংশন যতক্ষণ না তারা সবাই গাদা সম্পত্তি সন্তুষ্ট যার ফলে একটি বৈধ গাদা উত্পাদক পাঁচমিশালী আইটেম এবং তাদের প্যাচসমূহ একটি অ্যারের লাগে। আমাদের বর্ণিত এবং ক্রিয়াকলাপগুলি buildHeapব্যবহারের জন্য দুটি গ্রহণ করতে পারে ।siftUpsiftDown

  1. স্তূপের শীর্ষে (অ্যারের শুরু) শুরু করুন এবং siftUpপ্রতিটি আইটেমটিতে কল করুন। প্রতিটি পদক্ষেপে, পূর্ববর্তী চালিত আইটেমগুলি (অ্যারেতে বর্তমান আইটেমের আগে থাকা আইটেমগুলি) একটি বৈধ গাদা গঠন করে এবং পরবর্তী আইটেমটি সরিয়ে রাখলে এটি গাদাতে একটি বৈধ অবস্থানে রাখে। প্রতিটি নোড আপ করার পরে, সমস্ত আইটেম গাদা সম্পত্তি সন্তুষ্ট।

  2. অথবা, বিপরীত দিকে যান: অ্যারের শেষে শুরু করুন এবং সামনের দিকে পিছন দিকে যান। প্রতিটি পুনরাবৃত্তির সময়, আপনি কোনও আইটেমটি সঠিক স্থানে না হওয়া পর্যন্ত নীচে রেখে দিন।

কোন বাস্তবায়নের জন্য buildHeapআরও দক্ষ?

এই উভয় সমাধানই একটি বৈধ গাদা উত্পাদন করবে। আশ্চর্যজনকভাবে, আরও কার্যকর একটি হ'ল দ্বিতীয় অপারেশন যা ব্যবহার করে siftDown

আসুন h = লগ এন গাদা উচ্চতা উপস্থাপন করুন। siftDownপদ্ধতির জন্য প্রয়োজনীয় কাজটি যোগফল দ্বারা দেওয়া হয়

(0 * n/2) + (1 * n/4) + (2 * n/8) + ... + (h * 1).

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

(h * n/2) + ((h-1) * n/4) + ((h-2)*n/8) + ... + (0 * 1).

এটি পরিষ্কার হওয়া উচিত যে দ্বিতীয় যোগফলটি আরও বড়। প্রথম শব্দটি একা hn / 2 = 1/2 n লগ এন , সুতরাং এই পদ্ধতির সেরা ও (এন লগ এন) এ জটিলতা রয়েছে ।

আমরা siftDownপদ্ধতির যোগফল কীভাবে প্রমাণ করব যে সত্যই ও (এন) ?

একটি পদ্ধতি (এমন অন্যান্য বিশ্লেষণও রয়েছে যা কাজ করে) হ'ল সীমাবদ্ধ অঙ্ককে অসীম সিরিজে রূপান্তর করা এবং তারপরে টেলর সিরিজ ব্যবহার করা। আমরা প্রথম পদটি উপেক্ষা করতে পারি, যা শূন্য:

বিল্ডহীপ জটিলতার জন্য টেলর সিরিজ

যদি আপনি নিশ্চিত হন না যে এই পদক্ষেপগুলির প্রত্যেকটি কেন কাজ করে, তবে কথায় কথায় প্রক্রিয়াটির ন্যায্যতা এখানে রয়েছে:

  • পদগুলি সমস্ত ইতিবাচক, সুতরাং সসীম যোগফল অবশ্যই অসীমের যোগফলের চেয়ে ছোট হতে হবে।
  • সিরিজটি x = 1/2 এ মূল্যায়ন করা পাওয়ার সিরিজের সমান ।
  • সেই পাওয়ার সিরিজটি f (x) = 1 / (1-x) এর জন্য টেলর সিরিজের ডেরিভেটিভ (একটি ধ্রুবক বারের) সমান ।
  • x = 1/2 Tay টেলর সিরিজের রূপান্তরকরণের ব্যবধানের মধ্যে।
  • অতএব, আমরা টেইলর সিরিজটিকে 1 / (1-x) দিয়ে প্রতিস্থাপন করতে পারি , পার্থক্য করতে পারি এবং অসীম সিরিজের মানটি নির্ধারণ করতে পারি।

যেহেতু অসীম যোগফলটি হ'ল এন , আমরা এই সিদ্ধান্তে পৌঁছলাম যে সীমাবদ্ধ যোগফল বড় নয়, এবং তাই (ও)

কেন হিপ সাজানোর জন্য ও (এন লগ এন) সময় প্রয়োজন?

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

for (i = n - 1; i > 0; i--) {
    arr[i] = deleteMax();
}

স্পষ্টতই, লুপটি O (n) বার চালায় ( সুনির্দিষ্ট হতে n - 1 , শেষ আইটেমটি ইতিমধ্যে স্থানে রয়েছে)। deleteMaxগাদা করার জটিলতা হ'ল ও (লগ এন) । এটি সাধারণত মূলটি (গাদা থেকে ফেলে রাখা বৃহত্তম আইটেম) মুছে ফেলা এবং এটি স্তূপের শেষ আইটেমের সাথে প্রতিস্থাপন করে প্রয়োগ করা হয়, যা একটি পাত, এবং সেইজন্য ক্ষুদ্রতম আইটেমগুলির মধ্যে একটি। এই নতুন রুটটি অবশ্যই হ'ল সম্পত্তি লঙ্ঘন করবে, সুতরাং আপনি siftDownএটি গ্রহণযোগ্য অবস্থানে না নিয়ে যাওয়া পর্যন্ত আপনাকে কল করতে হবে। এটি পরবর্তী বৃহত্তম আইটেমটিকে মূল পর্যন্ত উপরে নিয়ে যাওয়ার প্রভাবও রাখে। লক্ষ্য করুন যে, গাছের নীচ থেকে buildHeapআমরা যে নোডের জন্য কল করছি তার বিপরীতে siftDownআমরা এখন siftDownপ্রতিটি পুনরাবৃত্তিতে গাছের শীর্ষ থেকে কল করছি !যদিও গাছটি সঙ্কুচিত হচ্ছে, এটি পর্যাপ্ত পরিমাণে সঙ্কুচিত হয় না : আপনি নোডগুলির প্রথমার্ধটি সরিয়ে না দেওয়া পর্যন্ত গাছের উচ্চতা স্থির থাকে (যখন আপনি নীচের স্তরটি সম্পূর্ণভাবে সরিয়ে ফেলবেন)। তারপরে পরবর্তী প্রান্তিকের জন্য, উচ্চতা h - 1 হবে । সুতরাং এই দ্বিতীয় পর্যায়ে মোট কাজ

h*n/2 + (h-1)*n/4 + ... + 0 * 1.

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

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


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

28
এটিই আমার কাছে স্বজ্ঞাতভাবে স্পষ্ট করে তুলেছিল: "কেবলমাত্র একটি নোড শীর্ষে রয়েছে যেখানে অর্ধেকটি নোড নীচের স্তরে থাকে So সুতরাং এটি খুব আশ্চর্যজনক নয় যে যদি প্রতিটি নোডে একটি অপারেশন প্রয়োগ করতে হয় তবে আমরা হতাম সিফটআপের চেয়ে সিফ্টডাউন পছন্দ করুন।
ভিকি চিজওয়ানি

3
@ জেরেমি ওয়েস্ট "এক হ'ল (অ্যারের শুরু) এর শীর্ষে শুরু করা এবং প্রতিটি আইটেমটিতে সিফটআপ কল করা হয়।" - আপনি কি গাদা নীচে থেকে শুরু করতে চেয়েছিলেন?
aste123

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

2
এটি বিশ্বের সেরা প্রশ্নের উত্তর আমি এখন পর্যন্ত দেখেছি। এটি এত সুন্দরভাবে ব্যাখ্যা করা হয়েছিল, আমি যেমন ছিলাম এটি কি সত্যিই সম্ভব ... অনেক অনেক ধন্যবাদ।
হার্শল জেইন

314

আপনার বিশ্লেষণটি সঠিক। তবে এটি শক্ত নয়।

হিপ তৈরি করা কেন লিনিয়ার অপারেশন তা ব্যাখ্যা করা সত্যিই সহজ নয়, আপনার এটি আরও ভাল করে পড়া উচিত।

অ্যালগরিদমের একটি দুর্দান্ত বিশ্লেষণ এখানে দেখা যায় ।


মূল ধারণাটি হল build_heapঅ্যালগরিদমে আসল heapifyব্যয় O(log n)সমস্ত উপাদানগুলির জন্য নয়।

যখন heapifyডাকা হয়, চলমান সময় প্রক্রিয়াটি শেষ হওয়ার আগে গাছের মধ্যে কোনও উপাদান কতদূর নেমে যেতে পারে তার উপর নির্ভর করে। অন্য কথায়, এটি গাদা উপাদানটির উচ্চতার উপর নির্ভর করে। সবচেয়ে খারাপ ক্ষেত্রে, উপাদানটি পাতার স্তর পর্যন্ত সমস্ত পথে নেমে যেতে পারে।

আসুন আমরা কাজটি পর্যায়ক্রমে গণনা করি।

নীচের স্তরে, 2^(h)নোড রয়েছে, তবে আমরা heapifyএগুলির কোনওটির জন্যই কল করি না , কাজটি 0 টির পরের 2^(h − 1)স্তরটিতে নোড রয়েছে এবং প্রতিটিই 1 স্তর দ্বারা নীচে চলে যেতে পারে। নীচ থেকে তৃতীয় স্তরে, 2^(h − 2)নোড রয়েছে এবং প্রতিটি নীচে নেমে যেতে পারে 2 স্তর।

আপনি দেখতে পাচ্ছেন যে সমস্ত হ্যাপিফাই অপারেশনগুলি হ'ল না O(log n), এ কারণেই আপনি পাচ্ছেন O(n)


17
এটি একটি দুর্দান্ত ব্যাখ্যা ... তবে কেন এটি হ্যাপ-বাছাই O (n লগ এন) এ চলে। কেন একই যুক্তি হিপ-সাজানোর ক্ষেত্রে প্রযোজ্য নয়?
এইচবিএ

49
@hba আমি মনে করি আপনার প্রশ্নের উত্তর নিবন্ধ থেকে এই চিত্রটি বোঝার মধ্যে নিহিত । হয় যখন সঙ্গে সম্পন্ন কিন্তু যখন সঙ্গে সম্পন্ন । প্রকৃত বাছাই (একের পর এক গাদা থেকে আইটেমগুলি টানতে) তাই করা উচিত । HeapifyO(n)siftDownO(n log n)siftUpsiftUpO(n log n)
The111

3
আমি নীচে আপনার বাহ্যিক দস্তাবেজের স্বজ্ঞাত ব্যাখ্যাটি পছন্দ করি।
লুকাস গ্রেবলিকাস

1
@ hba নীচে জেরেমি ওয়েস্টের উত্তরটি আপনার প্রশ্নকে আরও সূক্ষ্ম, সহজে বোঝার বিশদে সম্বোধন করেছেন, এখানে1111 এর মন্তব্যের উত্তরটি আরও ব্যাখ্যা করে।
cellepo

একটি প্রশ্ন. আমার কাছে মনে হয় যে উচ্চতার iগাছের নীচ থেকে নোডের জন্য তৈরি # টি তুলনাগুলি অবশ্যই 2* log(h-i)তুলনা করাতে হবে এবং এটি @ The111 হিসাবেও গণনা করা উচিত। আপনি কি মনে করেন?
সিড

94

intuitively:

"জটিলতাটি হ'ল ও (এনলগ এন) হওয়া উচিত ... প্রতিটি আইটেমের জন্য আমরা" হিপিফাই "করি, এখন পর্যন্ত স্তূপের জন্য প্রতিটি স্তরের জন্য এটি একবার ফিল্টার করার সম্ভাবনা রয়েছে (এটি লগ এন স্তরসমূহ))

বেশ না। আপনার যুক্তি একটি শক্ত বাঁধা উত্পাদন করে না - এটি প্রতিটি হিপিফাইয়ের জটিলতার অনুমান করে। নীচে থেকে তৈরি করা থাকলে, সন্নিবেশ (হিপিফাই) এর চেয়ে অনেক কম হতে পারে O(log(n))। প্রক্রিয়াটি নিম্নরূপ:

(পদক্ষেপ 1) প্রথম n/2উপাদানগুলি স্তূপের নীচের সারিতে যায়। h=0, তাই হিপিফাইয়ের প্রয়োজন হয় না।

(পদক্ষেপ 2) পরবর্তী উপাদানগুলি নীচে থেকে 1 সারিটিতে যায়। , ফিল্টারগুলি 1 স্তর নীচে হিপিফাই করুন।n/22h=1

(পদক্ষেপ i ) পরবর্তী উপাদানগুলি নীচে থেকে সারি পর্যন্ত যায়। ফিল্টার স্তর নীচে heapify ।n/2iih=ii

(পদক্ষেপ লগ (এন) ) শেষ উপাদানটি নীচ থেকে সারি পর্যন্ত যায় । ফিল্টার স্তর নীচে heapify ।n/2log2(n) = 1log(n)h=log(n)log(n)

বিজ্ঞপ্তি: প্রথম ধাপের পরে, 1/2উপাদানগুলির (n/2)মধ্যে ইতিমধ্যে গাদা রয়েছে, এবং আমাদের একবারও হিপিফাই কল করার দরকার পড়েনি। এছাড়াও, লক্ষ্য করুন যে কেবলমাত্র একটি একক উপাদান, মূল, সম্পূর্ণ log(n)জটিলতা অনুভব করে ।


তাত্ত্বিকভাবে:

Nআকারের গাদা করার মোট পদক্ষেপগুলি nগাণিতিকভাবে লেখা যেতে পারে।

উচ্চতায় i, আমরা (উপরে) দেখিয়েছি যে সেখানে এমন উপাদান থাকবে যা হিপিফাই কল করতে হবে এবং আমরা জানি উচ্চতায় হিপিফাই হ'ল । এটি দেয়:n/2i+1iO(i)

এখানে চিত্র বর্ণনা লিখুন

সুপরিচিত জ্যামিতিক সিরিজের সমীকরণের উভয় পক্ষের ডেরাইভেটিভ গ্রহণ করে শেষ সংক্ষেপের সমাধান পাওয়া যাবে:

এখানে চিত্র বর্ণনা লিখুন

অবশেষে x = 1/2উপরের সমীকরণের ফলনটি প্লাগ ইন করুন 2। এটি প্রথম সমীকরণের মধ্যে প্লাগ করে দেয়:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং, পদক্ষেপের মোট সংখ্যা আকার O(n)


35

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

উদাহরণস্বরূপ http://en.wikedia.org/wiki/Binary_heap , "একটি গাদা তৈরি করা" দেখুন। এক্ষেত্রে আপনি প্রয়োজনীয়ভাবে গাছের নীচের স্তর থেকে কাজ শুরু করেন, গাদা শর্তটি সন্তুষ্ট না হওয়া অবধি অভিভাবক এবং শিশু নোডগুলি অদলবদল করে।


12

ইতিমধ্যে কিছু দুর্দান্ত উত্তর রয়েছে তবে আমি একটু চাক্ষুষ ব্যাখ্যা যোগ করতে চাই

এখানে চিত্র বর্ণনা লিখুন

এখন, ইমেজ কটাক্ষপাত করা, আছে
n/2^1 সবুজ নোড সঙ্গে উচ্চতা 0 (এখানে 23/2 = 12)
n/2^2 লাল নোড সঙ্গে উচ্চতা 1 (এখানে 23/4 = 6)
n/2^3 নীল নোড সঙ্গে উচ্চতা 2 (এখানে 23/8 = 3) উচ্চতা 3 এর সাথে
n/2^4 বেগুনি নোড (এখানে 23/16 = 2) তাই উচ্চতা h এর জন্য নোড রয়েছে সময় নির্ধারণের জন্য প্রতিটি নোড দ্বারা সম্পাদিত কাজের পরিমাণ বা সর্বাধিক সংখ্যক পুনরাবৃত্তিগুলি গণনা করতে দেয় এখন লক্ষ্য করা যায় যে প্রতিটি নোড পারে নোডের উচ্চতা (সর্বমোট) পুনরাবৃত্তি == উচ্চতা সম্পাদন করুন
n/2^(h+1)

Green  = n/2^1 * 0 (no iterations since no children)  
red    = n/2^2 * 1 (heapify will perform atmost one swap for each red node)  
blue   = n/2^3 * 2 (heapify will perform atmost two swaps for each blue node)  
purple = n/2^4 * 3 (heapify will perform atmost three swaps for each purple node)   

সুতরাং উচ্চতা h সহ যে কোনও নোডের জন্য সর্বাধিক কাজ সম্পন্ন হ'ল এন / ২ ^ (এইচ + 1) * এইচ

এখন মোট কাজ শেষ

->(n/2^1 * 0) + (n/2^2 * 1)+ (n/2^3 * 2) + (n/2^4 * 3) +...+ (n/2^(h+1) * h)  
-> n * ( 0 + 1/4 + 2/8 + 3/16 +...+ h/2^(h+1) ) 

এখন এইচ এর মান , ক্রম জন্য

-> ( 0 + 1/4 + 2/8 + 3/16 +...+ h/2^(h+1) ) 

কখনই 1 ছাড়িয়ে যাবে না
এইভাবে সময় জটিলতাহিপ তৈরির জন্যকখনও কখনও ও (এন) এর বেশি হবে না


7

যেহেতু আমরা জানি যে একটি স্তূপের উচ্চতা হ'ল লগ (এন) , যেখানে n উপাদানগুলির মোট সংখ্যা    L লেটগুলি এটিকে h হিসাবে উপস্থাপন করে
যখন আমরা হিপিফাই অপারেশন করবো, তখন শেষ স্তরের ( এইচ ) এর উপাদানগুলি একটি এককও স্থানান্তরিত করবে না ধাপ।
   দ্বিতীয় শেষ স্তরের ( এইচ -1 ) উপাদানের সংখ্যা 2 এইচ -1 এবং তারা সর্বোচ্চ 1 স্তরে (হিপিফাইয়ের সময়) এগিয়ে যেতে পারে ।
   একইভাবে, জন্য আমি তম , স্তর আমরা আছে 2 আমি উপাদান যা স্থানান্তর করতে পারেন হাই অবস্থান।

অতএব মোট চাল সংখ্যা = এস = 2 এইচ * 0 + 2 এইচ -1 * 1 + 2 এইচ -2 * 2 + ... 2 0 * এইচ

                                               এস = 2 এইচ {1/2 + 2/2 2 + 3/2 3 + ... এইচ / 2 এইচ } ----------------------- -------------------------- 1 উভয় পক্ষকে 2 এস / 2 = 2 এইচ {1/2 দ্বারা এই বিভাজন সমাধান করার জন্য
এটি এজিপি সিরিজ 2 + 2/2 3 + ... এইচ / 2 এইচ + 1 } --------------------------------- ---------------- 2 বিয়োগ সমীকরণ 2 থেকে 1 দেয় এস / 2 = 2 {1/2 + 1 টি / 2 2 টি + 1/2 3 ... + 1 টি / 2 ঘন্টা + ঘন্টা / 2 ঘন্টা + 1 }
                                               

                                               
                                               এস = 2 জ + 1 টি {1/2 + 1 টি / 2 2 টি + 1/2 3 ... টি + 1/2 + H / 2 জ + 1 টি }
এখন 1/2 + 1 টি / 2 2 টি + 1/2 3 + ... + 1/2 ঘন্টা জিপি হ্রাস পাচ্ছে যার সমষ্টি 1 এর চেয়ে কম (যখন এইচ অনন্তের দিকে ঝোঁক দেয়, যোগফল 1 এর দিকে থাকে)। আরও বিশ্লেষণে, আসুন ১ এর সমষ্টিটির উপরের একটি উচ্চতর আবদ্ধ করা যাক
এটি S = 2 h + 1 {1 + h / 2 h + 1 }
                    = 2 h + 1 + h
                    ~ 2 h + h
কে h = লগ হিসাবে দেয় (এন) , 2 এইচ = এন

অতএব এস = এন + লগ (এন)
টি (সি) = ও (এন)


6

একটি গাদা তৈরি করার সময়, আপনি বলুন যে আপনি নীচের দিকে আসছেন।

  1. আপনি প্রতিটি উপাদানটি নেন এবং এটি তার বাচ্চাদের সাথে তুলনা করে এই জুড়িটি গাদা বিধি মেনে চলে কিনা তা পরীক্ষা করে। সুতরাং, পাতা বিনামূল্যে গাদা অন্তর্ভুক্ত পেতে। কারণ তাদের কোন সন্তান নেই।
  2. উপরের দিকে অগ্রসর হওয়া, পাতার ডানদিকে নোডের জন্য সবচেয়ে খারাপ পরিস্থিতিটি হবে 1 তুলনা (সর্বাধিক এগুলি কেবলমাত্র একটি প্রজন্মের শিশুদের সাথে তুলনা করা হবে)
  3. আরও উপরে চলে যাওয়া, তাদের তাত্ক্ষণিক বাবা-মাকে সর্বোচ্চ দুই প্রজন্মের সন্তানের সাথে তুলনা করা যেতে পারে।
  4. একই দিকে চালিয়ে যেতে, আপনার নিকৃষ্টতম অবস্থার মূলের জন্য লগ (এন) তুলনা করতে হবে। এবং তাত্ক্ষণিক শিশুদের জন্য লগ (এন) -1, তাদের তাত্ক্ষণিক শিশুদের জন্য লগ (এন) -2 এবং আরও কিছু।
  5. সুতরাং সর্বোপরি সংক্ষেপে, আপনি লগ (এন) + {লগ (এন) -1} * 2 + {লগ (এন) -2} * 4 + ..... + 1 * 2 ^ {(এমন কিছুর মতো কিছুতে পৌঁছান) লগন) -1} যা ও (এন) ছাড়া কিছুই নয়।

2

গাদা তৈরির ক্ষেত্রে, আমরা উচ্চতা থেকে শুরু করি, লগ -1 (যেখানে লগন এন উপাদানগুলির গাছের উচ্চতা)। উচ্চতা 'এইচ' এ উপস্থিত প্রতিটি উপাদানের জন্য, আমরা সর্বোচ্চ (লগন -h) উচ্চতা পর্যন্ত নীচে যাই।

    So total number of traversal would be:-
    T(n) = sigma((2^(logn-h))*h) where h varies from 1 to logn
    T(n) = n((1/2)+(2/4)+(3/8)+.....+(logn/(2^logn)))
    T(n) = n*(sigma(x/(2^x))) where x varies from 1 to logn
     and according to the [sources][1]
    function in the bracket approaches to 2 at infinity.
    Hence T(n) ~ O(n)

1

ক্রম সন্নিবেশগুলি দ্বারা বর্ণিত হতে পারে:

T = O(log(1) + log(2) + .. + log(n)) = O(log(n!))

n! =~ O(n^(n + O(1)))অতএব, প্রায় কাছাকাছি স্টারিং দ্বারাT =~ O(nlog(n))

আশা করি এটি সহায়তা করে, সর্বোত্তম O(n)উপায়টি একটি নির্ধারিত সেট (অর্ডার দেওয়ার ক্ষেত্রে কোনও ব্যাপার নয়) জন্য বিল্ড হিপ অ্যালগরিদম ব্যবহার করছে।


1

মূলত, হিপ তৈরি করার সময় কেবল পাতাগুলিহীন নোডগুলিতে কাজ করা হয় ... এবং সম্পন্ন কাজ হ'ল শর্ত পূরণ করার জন্য অদলবদলের পরিমাণ ... অন্য কথায় (সবচেয়ে খারাপ ক্ষেত্রে) পরিমাণটি উচ্চতার সমানুপাতিক নোডের ... সমস্ত জটিলতার মধ্যে সমস্ত নন-লিফ নোডের উচ্চতার সমষ্টিগুলির সমানুপাতিক..যে (2 ich h + 1 - 1) -h-1 = nh-1 = চালু)


1

@bcorso ইতিমধ্যে জটিলতার বিশ্লেষণের প্রমাণ প্রদর্শন করেছে। তবে যারা এখনও জটিলতা বিশ্লেষণ শিখছেন তাদের জন্য, আমার এটি যুক্ত করতে হবে:

আপনার মূল ভুলের ভিত্তিটি এই বিবৃতিটির অর্থের ভুল ব্যাখ্যা করার কারণে, "একটি স্তূপের মধ্যে সন্নিবেশনের সময় ও (লগ এন) সময় লাগে"। একটি স্তূপের মধ্যে serোকানো অবশ্যই ও (লগ এন), তবে আপনাকে অবশ্যই সনাক্ত করতে হবে যে সন্নিবেশের সময় এনটি হিপটির আকার ।

একটি বস্তুতে n বস্তু সন্নিবেশ করার প্রসঙ্গে, ith সন্নিবেশের জটিলতা হ'ল লগ এন_আই) যেখানে এন_আই সন্নিবেশ হিসাবে হিপটির আকার i কেবলমাত্র সর্বশেষ সন্নিবেশনে ও (লগ এন) এর জটিলতা রয়েছে।


1

আপনি অনুমান করতে দেয় এন এক গাদা উপাদান। তার উচ্চতা লগ (এন) হবে

এখন আপনি অন্য একটি উপাদান সন্নিবেশ করতে চান, তারপরে জটিলতাটি হ'ল: লগ (এন) , আমাদের ইউপির সমস্ত সাথে মূলের সাথে তুলনা করতে হবে ।

এখন আপনার কাছে এন + 1 উপাদান এবং উচ্চতা = রয়েছে লগ (এন + 1)

আনয়ন কৌশলটি ব্যবহার করে এটি প্রমাণ করা যায় যে সন্নিবেশের জটিলতা অলোগি হবে

এখন ব্যবহার

লগ এ + লগ বি = লগ অ্যাব

এটি সরল করে: ∑logi = লগ (এন!)

যা আসলে ও (এনলগএন)

কিন্তু

আমরা এখানে কিছু ভুল করছি, যেমন সমস্ত ক্ষেত্রে আমরা শীর্ষে পৌঁছে না। তাই বেশিরভাগ সময় কার্যকর করার সময় আমরা এটি দেখতে পাব যে, আমরা গাছের অর্ধেক পথ পর্যন্ত যাচ্ছি না। যেহেতু, এই সীমাটি উপরের উত্তরে প্রদত্ত গাণিতিক ব্যবহার করে আরও শক্ত করে আবদ্ধ হওয়ার জন্য অনুকূলিত হতে পারে।

এই উপলব্ধিটি আমার কাছে বিশদ পরে এবং হিপসে পরীক্ষার পরে এসেছিল।


0

আমি জেরেমি ওয়েস্টের ব্যাখ্যাটি সত্যিই পছন্দ করি .... অন্য একটি পদ্ধতির যা বোঝার পক্ষে সত্যই সহজ এখানে দেওয়া হল http://courses.washington.edu/css343/zender/NotesProbs/heapcomplexity

যেহেতু বিল্ডহীপ হিপিফাইয়ের উপর নির্ভর করে এবং শিফট ডাউন পদ্ধতির ব্যবহার নির্ভর করে যা সমস্ত নোডের উচ্চতার সমষ্টি উপর নির্ভর করে। সুতরাং, নোডগুলির উচ্চতার সমষ্টি নির্ধারণ করতে যা এস = সংক্ষেপণ দ্বারা i = 0 থেকে i = h এর (2 ^ i * (হাই)) দিয়ে দেওয়া হয়েছে, যেখানে h = লগন গাছ সমাধানের উচ্চতা, আমরা পাই s = 2 ^ (এইচ + 1) - 1 - (এইচ + 1), এন = 2 n (এইচ + 1) - 1 এস = এন - এইচ - 1 = এন- লগেন - 1 এস = ও (এন), এবং বিল্ডহীপের এত জটিলতা হ'ল হে (এন)।


0

"বিল্ড হিপের রৈখিক সময়সীমাটি হিপগুলির সমস্ত নোডের উচ্চতার সমষ্টি গণনা করে দেখানো যেতে পারে যা ড্যাশযুক্ত রেখার সর্বাধিক সংখ্যা। N = 2 containing সমেত উচ্চতা h এর নিখুঁত বাইনারি গাছের জন্য ( এইচ + 1) - 1 টি নোড, নোডের উচ্চতার সমষ্টি N - H - 1. সুতরাং এটি ও (এন) হয়।


0

ও (ন) এর প্রমাণ

প্রমাণ অভিনব নয়, এবং বেশ সোজা, আমি কেবল একটি সম্পূর্ণ বাইনারি গাছের জন্য কেসটি প্রমাণ করেছি, ফলাফলটি সম্পূর্ণ বাইনারি গাছের জন্য সাধারণীকরণ করা যায়।


0

প্রতিটি নোড নিতে পারে সর্বাধিক সরানো সন্ধান করে আমরা হিপ বিল্ডের জন্য রানটাইম পাই। সুতরাং আমাদের জানতে হবে প্রতিটি সারিতে কয়টি নোড রয়েছে এবং প্রতিটি নোড তাদের থেকে কত দূরে যেতে পারে।

রুট নোড থেকে শুরু করে প্রতিটি পরের সারিতে আগের সারির চেয়ে নোড থাকে, সুতরাং আমরা কোনও নোড না রেখে যতক্ষণ না আমরা গাছের উচ্চতা না পাই আমরা কতবার নোডকে দ্বিগুণ করতে পারি তার উত্তর দিয়ে। অথবা গাণিতিক ভাষায় গাছের উচ্চতা লগ 2 (এন), এন অ্যারের দৈর্ঘ্য।

এক সারিতে নোডগুলি গণনা করতে আমরা পিছন থেকে শুরু করি, আমরা জানি যে n / 2 নোডগুলি নীচে রয়েছে, সুতরাং 2 দিয়ে ভাগ করে আমরা পূর্ববর্তী সারিটি পেয়ে যাব।

এর ভিত্তিতে আমরা শিফটাউন পদ্ধতির জন্য এই সূত্রটি পাই: (0 * এন / 2) + (1 * এন / 4) + (2 * এন / 8) + ... + (লগ 2 (এন) * 1)

সর্বশেষ প্যারান্থেসিসে শব্দটি মূলের যে নোড দিয়ে গুন করা হয় তার গাছের উচ্চতা, প্রথম প্যারান্থেসিসে শব্দটি নীচের সারিতে থাকা সমস্ত নোড যা তারা ভ্রমণ করতে পারে তার দৈর্ঘ্য দ্বারা গুণিত হয়, 0। স্মার্ট একই সূত্র: এখানে চিত্র বর্ণনা লিখুন

ম্যাথ

আমাদের 2 * এন, 2 এ এন ফিরিয়ে আনা যায় তা বাতিল করা যেতে পারে কারণ এটি একটি ধ্রুবক এবং তদা আমাদের সিফটাউন পদ্ধতির সবচেয়ে খারাপ সময়কালীন সময়: এন।


-6

ভাবেন আপনি ভুল করছেন এটি একবার দেখুন: http://golang.org/pkg/container/heap/ একটি গাদা নির্মাণ isn'y O (n)। তবে সন্নিবেশ করানো হচ্ছে ও (এলজি (এন) I'm হিটার মধ্যে হ্যাঁ, প্রতিটি সন্নিবেশটি এলজি (এন) হয় এবং সেখানে এন আইটেম থাকে, সুতরাং আপনি উল্লিখিত হিসাবে এন * এলজি (এন) পাবেন


2
না এটা শক্ত নয়। বিল্ড
হিপগুলির

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

হ্যাঁ এটি আমার স্বজ্ঞাত উত্তরও, তবে উইকিপিডিয়া রাজ্যের মতো উল্লেখ "এন উপাদানগুলির সাথে হ্যাপগুলি ও (এন) এর নীচে তৈরি করা যেতে পারে।"
গিগা

1
আমি একটি সম্পূর্ণরূপে সাজানো ডেটা স্ট্রাকচারের কথা ভাবছিলাম। আমি একটি গাদা নির্দিষ্ট বৈশিষ্ট্য ভুলে গেছি।
মাইক শ্যাচটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.