एल्गोरिथ्म किस प्रकार का उपयोग करता है?


24

मुझे पहले से हल की गई सूची में एक एकल पूर्णांक जोड़ने की जरूरत है, जैसे कि यह सही जगह पर जाता है। मेरा पहला संघर्ष कुछ ऐसा था

(sort (cons newelt list) #'<)

हालांकि, यह देखते हुए कि listपहले से ही सॉर्ट किया गया है, केवल एक प्रविष्टि वास्तव में आवश्यक है, जिसका अर्थ है कि यह समाधान उपयोग किए गए एल्गोरिदम के आधार पर बहुत ही अनुपयुक्त हो सकता है sort

तो, कौन सा एल्गोरिथ्म है जो sortउपयोग करता है?

क्या मैं निम्नलिखित की तरह कुछ करना बेहतर होगा?

(let ((tail list))
  ;; The first element is never less-than
  (while (and tail (< newelt (cadr tail)))
    (setq tail (cdr tail)))
  (setcdr tail (cons newelt (cdr tail)))
  list)

1
मैं एक बाइनरी हीप (उदाहरण के लिए heap.el ) का उपयोग करूँगा , अगर वह मेरे कोड में लगातार ऑपरेशन था।
चंद्र

आज्ञा देना Bपहले से ही क्रमित प्रारंभिक हो listऔर Aऔर Cशुरू में खाली सूचियों। स्प्लिट Bदो भागों में B1, B2लंबाई की mऔर mया m+1और mतुलना neweltके पहले तत्व के लिए B2। तो neweltयह है विस्तार Aके साथ अपने सही करने के लिए B1और की जगह Bके साथ B2, और विस्तार Cके साथ अपने बाईं ओर B2और की जगह Bके साथ B1O(log n)ऐसे कदमों के बाद कुछ भी नहीं बचा है B। फिर Aचीजों को शामिल करता है ≤ newelt, और Cउन > newelt, और संघनन विस्तारित सॉर्ट की गई सूची का उत्पादन करता है। e-lispभाषा की तरह नहीं के लिए माफी ।
jfbu

जवाबों:


26

आप Emacs स्रोत कोड स्थापित है, तो आप के लिए स्रोत कोड प्राप्त कर सकते हैं sortके साथ M-x find-function

वहां आप देख सकते हैं कि sortएक मर्ज सॉर्ट करता है। यह सूची की लंबाई की जांच करता है, सूची को आधे में तोड़ता है, "फ्रंट" और "बैक" भागों को पुनरावृत्ति के माध्यम से अलग-अलग करता है, और फिर दोनों को मर्ज करता है।

के रूप में के लिए कि क्या आपका कार्यान्वयन तेज होगा - इसे मापें! यह सिद्धांत में अधिक कुशल है (O (n) बनाम O (n log n)), लेकिन sortC में लिखे जाने का फायदा है, इसलिए इसका परिणाम भी हो सकता है। (बेशक, अपने कार्य को बाइट-संकलित करना न भूलें।)


@ मलबारबा रिकॉर्ड के लिए, आपने किस पैमाने पर इसका परीक्षण किया?
टी। वेरॉन

8
एक यादृच्छिक संख्या को 1000 यादृच्छिक संख्याओं की सूची में सम्मिलित करने के लिए 1000 बार परीक्षण किया गया (सभी पूर्वगामी)। मैनुअल विधि 6 गुना तेज थी।
मालाबार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.