একটি গাদা , যা অগ্রাধিকার-সারি হিসাবেও পরিচিত, এটি একটি বিমূর্ত ডেটা টাইপ। ধারণাগতভাবে, এটি একটি বাইনারি গাছ যেখানে প্রতিটি নোডের বাচ্চারা নোডের চেয়ে ছোট বা সমান। (ধরে নিচ্ছি এটি একটি সর্বাধিক গাদা। এটি গাছ বা অ্যারে হিসাবে সহজেই প্রয়োগ করা যেতে পারে।
আপনার চ্যালেঞ্জ, আপনি যদি এটি গ্রহণ করা পছন্দ করেন তবে এটি নির্ধারণ করা হয় যে কোনও অ্যারেটি বৈধ গাদা কিনা। যদি প্রতিটি উপাদানগুলির বাচ্চারা উপাদানটির চেয়ে ছোট বা সমান হয় তবে একটি অ্যারে হিপ আকারে থাকে। একটি উদাহরণ হিসাবে নিম্নলিখিত অ্যারে নিন:
[90, 15, 10, 7, 12, 2]
সত্যই, এটি অ্যারে আকারে সাজানো একটি বাইনারি গাছ। এটি কারণ প্রতিটি উপাদানগুলির শিশু রয়েছে। 90 এর দুটি সন্তান রয়েছে, 15 এবং 10।
15, 10,
[(90), 7, 12, 2]
15 এর 7 এবং 12 শিশু রয়েছে:
7, 12,
[90, (15), 10, 2]
10 এর বাচ্চা রয়েছে:
2
[90, 15, (10), 7, 12, ]
এবং পরবর্তী উপাদানটিও 10 বছরের বাচ্চা হবে, জায়গা না থাকলে। 7, 12 এবং 2 এর মধ্যেও যদি অ্যারে যথেষ্ট দীর্ঘ হয় তবে তাদেরও বাচ্চা হবে। এখানে স্তূপের আরও একটি উদাহরণ রয়েছে:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
পূর্ববর্তী অ্যারে যে গাছটি তৈরি করেছে তা এখানে দৃশ্যমান:
কেবলমাত্র যদি এটি যথেষ্ট পরিমাণে পরিষ্কার না হয় তবে এখানে উপাদানটির বাচ্চাদের পাওয়ার সুস্পষ্ট সূত্র
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
আপনাকে অবশ্যই ইনপুট হিসাবে একটি শূন্য খালি অ্যারে নিতে হবে এবং অ্যারেটি হ্যাপ ক্রমে থাকলে এবং একটি মিথ্যা মানটি আউটপুট করতে হবে otherwise এটি 0-সূচকযুক্ত হিপ বা 1-সূচিযুক্ত হিপ হতে পারে যতক্ষণ আপনি নির্দিষ্ট করেন যতক্ষণ আপনার প্রোগ্রাম / ফাংশনটি কোন ফর্ম্যাটটির প্রত্যাশা করে। আপনি ধরে নিতে পারেন যে সমস্ত অ্যারেতে কেবল ইতিবাচক পূর্ণসংখ্যা থাকবে। আপনি কোনও হিপ-বিল্টিন ব্যবহার করতে পারবেন না । এর অন্তর্ভুক্ত রয়েছে তবে সীমাবদ্ধ নয়
- যে ক্রিয়াগুলি নির্ধারণ করে যে কোনও অ্যারে হিপ-ফর্মে রয়েছে কিনা তা নির্ধারণ করে
- এমন ক্রিয়াকলাপ যা অ্যারেরকে একটি গাদা বা হিপ-ফর্মে রূপান্তর করে
- ফাংশনগুলি যা ইনপুট হিসাবে অ্যারে নেয় এবং একটি হিপ ডেটা-কাঠামো দেয়
অ্যারে হিপ-ফর্মে রয়েছে কিনা তা যাচাই করতে আপনি এই পাইথন স্ক্রিপ্টটি ব্যবহার করতে পারেন (0 টি সূচিত):
def is_heap(l):
for head in range(0, len(l)):
c1, c2 = head * 2 + 1, head * 2 + 2
if c1 < len(l) and l[head] < l[c1]:
return False
if c2 < len(l) and l[head] < l[c2]:
return False
return True
পরীক্ষার আইও:
এই সমস্ত ইনপুট সত্য হওয়া উচিত:
[90, 15, 10, 7, 12, 2]
[93, 15, 87, 7, 15, 5]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[100, 19, 36, 17, 3, 25, 1, 2, 7]
[5, 5, 5, 5, 5, 5, 5, 5]
এবং এই সমস্ত ইনপুট মিথ্যা ফিরিয়ে দেওয়া উচিত:
[4, 5, 5, 5, 5, 5, 5, 5]
[90, 15, 10, 7, 12, 11]
[1, 2, 3, 4, 5]
[4, 8, 15, 16, 23, 42]
[2, 1, 3]
যথারীতি, এটি কোড-গল্ফ, সুতরাং স্ট্যান্ডার্ড লুফোলস প্রয়োগ হয় এবং বাইটের মধ্যে সবচেয়ে কম উত্তর!
[3, 2, 1, 1]
?