एक ढेर , जिसे प्राथमिकता-कतार के रूप में भी जाना जाता है, एक सार डेटा प्रकार है। वैचारिक रूप से, यह एक द्विआधारी वृक्ष है जहां हर नोड के बच्चे नोड के बराबर या उससे छोटे होते हैं। (मान लिया जाए कि यह एक अधिकतम-ढेर है।) जब किसी तत्व को धक्का दिया जाता है या पॉप किया जाता है, तो हीप अपने आप को पुन: व्यवस्थित करता है, इसलिए सबसे बड़ा तत्व पॉप-अप होने के लिए अगला है। इसे आसानी से एक पेड़ या एक सरणी के रूप में लागू किया जा सकता है।
आपकी चुनौती, क्या आपको इसे स्वीकार करने का विकल्प चुनना चाहिए, यह निर्धारित करने के लिए कि क्या सरणी एक वैध ढेर है। एक सरणी ढेर के रूप में है यदि प्रत्येक तत्व के बच्चे तत्व से स्वयं के बराबर या उससे छोटे हैं। एक उदाहरण के रूप में निम्नलिखित सरणी लें:
[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]
और यहाँ उस पेड़ का एक दृश्य है जिसे पिछला सरणी बनाता है:
बस अगर यह पर्याप्त रूप से स्पष्ट नहीं है, तो यहां i'th तत्व के बच्चों को प्राप्त करने के लिए स्पष्ट सूत्र है
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
आपको इनपुट के रूप में एक गैर-खाली सरणी लेनी चाहिए और यदि सरणी क्रम में है, और एक मिथ्या मूल्य अन्यथा, तो सत्य मूल्य का उत्पादन करें। यह एक 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
टेस्ट IO:
इन सभी निविष्टियों को वापस लौटना चाहिए:
[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]
?