बैकट्रैकिंग एल्गोरिदम पर आधारित एक समाधान है।
- गैर-बढ़ते क्रम में इनपुट सरणी सॉर्ट करें।
- सरणी के मानों को दो सबसेट में विभाजित करना प्रारंभ करें: दोनों सबसेट्स में यह सबसे बड़ा तत्व डालें (यह "मध्य" तत्व होगा), फिर दूसरा सबसे बड़ा मध्यस्थ सबसेट में रखें।
- अनुक्रमिक रूप से शेष तत्वों को या तो सबसेट में डाल दें। यदि यह "अंतर" स्थिति का उल्लंघन किए बिना नहीं किया जा सकता है, तो अन्य सबसेट का उपयोग करें। यदि दोनों सबसेट स्वीकार्य नहीं हैं, रोलबैक और पिछले निर्णय बदलते हैं।
- चरण 3 पर उत्पादित सरणी में से एक को उलट दें और इसे अन्य सरणी के साथ संयोजित करें।
नीचे अजगर कार्यान्वयन (यह सही नहीं है, सबसे बुरा दोष पुनरावर्ती दिया गया है: जबकि प्रत्यावर्तन एल्गोरिदम उलटे पांव लौटने के लिए काफी आम है, इस विशेष एल्गोरिथ्म रैखिक समय में काम करने के लिए लगता है, और प्रत्यावर्तन बहुत बड़ी लिए अच्छा नहीं है इनपुट सरणी)।
def is_concave_end(a, x):
return a[-2] - a[-1] <= a[-1] - x
def append_element(sa, halves, labels, which, x):
labels.append(which)
halves[which].append(x)
if len(labels) == len(sa) or split_to_halves(sa, halves, labels):
return True
if which == 1 or not is_concave_end(halves[1], halves[0][-1]):
halves[which].pop()
labels.pop()
return False
labels[-1] = 1
halves[1].append(halves[0][-1])
halves[0].pop()
if split_to_halves(sa, halves, labels):
return True
halves[1].pop()
labels.pop()
def split_to_halves(sa, halves, labels):
x = sa[len(labels)]
if len(halves[0]) < 2 or is_concave_end(halves[0], x):
return append_element(sa, halves, labels, 0, x)
if is_concave_end(halves[1], x):
return append_element(sa, halves, labels, 1, x)
def make_concave(a):
sa = sorted(a, reverse = True)
halves = [[sa[0]], [sa[0], sa[1]]]
labels = [0, 1]
if split_to_halves(sa, halves, labels):
return list(reversed(halves[1][1:])) + halves[0]
print make_concave([10, 2, 7, 4])
यह इस एल्गोरिथ्म का परीक्षण करने के लिए सेट एक अच्छा डेटा का उत्पादन करने के लिए आसान नहीं है: यादृच्छिक संख्या के मैदान सेट या तो इस एल्गोरिथ्म के लिए बहुत आसान है या किसी समाधान नहीं है। Here मैं एक सेट है कि "पर्याप्त मुश्किल है" एक साथ दो क्रमबद्ध सूचियों मिश्रण, प्रत्येक "अंतर" हालत संतोषजनक से उत्पन्न करने के लिए कोशिश की। फिर भी इस डेटा सेट को रैखिक समय में संसाधित किया जाता है। और मुझे नहीं पता कि इस डेटा एल्गोरिदम की अधिक से अधिक रैखिक समय जटिलता का प्रदर्शन करने वाले किसी भी डेटा सेट को कैसे तैयार किया जाए ...
मैं कोई सॉर्टिंग गुरु नहीं हूं लेकिन यह विधि सरल और सीधा है, हालांकि बड़े डेटा के लिए काफी अक्षम सेट: http://www.tutorialspoint.com/data_structures_algorithms/bubble_sort_algorithm.htm – yano
@ArturoMenchaca दोनों सरणी पहले से ही क्रमबद्ध हैं और स्थिति को पूर्ण कर रहे हैं और कोई बदलाव आवश्यक नहीं – Tsoukos10
उन्हें इतने सारे नकारात्मक वोट क्यों मिलते हैं? –