रैखिक समय में "लगभग छँटाई" पूर्णांक


16

मैं सकारात्मक पूर्णांक मानों की एक सरणी को क्रमबद्ध करने में रुचि रखता हूं L=v1,,vn रैखिक समय में (रैम मॉडल में समान लागत माप के साथ, यानी, पूर्णांक लॉगरिदमिक आकार तक हो सकता है, लेकिन उन पर अंकगणितीय संचालन माना जा सकता है। इकाई समय लें)। बेशक, तुलना-आधारित सॉर्टिंग एल्गोरिदम के साथ यह असंभव है, इसलिए मैं एक "अनुमानित" प्रकार की गणना करने में रुचि रखता हूं, अर्थात, कुछ क्रमचय गणना करना के जो वास्तव में सामान्य रूप में पृथक नहीं किया जा रहा है, लेकिन की क्रमबद्ध संस्करण के एक "अच्छा सन्निकटन"vσ(1),,vσ(n)LL। मुझे लगता है कि हम पूर्णांक को घटते क्रम में छांट रहे हैं क्योंकि यह अगली कड़ी को राज्य के लिए थोड़ा और सुखद बनाता है, लेकिन निश्चित रूप से समस्या को दूसरे तरीके से गोल कर सकता है।

अनुमानित प्रकार के लिए एक संभावित मानदंड निम्नलिखित है (*): be , हर , हमें आवश्यकता है कि (यानी "अर्ध-क्रमबद्ध" सूची को घटते फ़ंक्शन ) से ऊपर से । यह देखना है कि वास्तविक तरह संतुष्ट इस आसान है: से अधिक नहीं होना चाहिए तो यह अधिक से अधिक है जो , और सामान्य रूप से से अधिक नहीं होना चाहिए जोNivi1invσ(i)N/iiN/ivσ(2)vσ(1)(vσ(1)+vσ(2))/2N/2vσ(i)(jivσ(i))/iN/i

उदाहरण के लिए, आवश्यकता (*) नीचे एल्गोरिथम द्वारा प्राप्त की जा सकती है (@Louis द्वारा सुझाई गई)। मेरा प्रश्न यह है: क्या इस तरह के काम को "लगभग छँटाई" पूर्णांक में रैखिक समय में किया जा रहा है, (*) जैसी कुछ आवश्यकता को लागू करने से वास्तविक छंटाई संतुष्ट होगी? क्या नीचे एल्गोरिथ्म, या इसके कुछ प्रकार, एक स्थापित नाम है?

संपादित करें: एल्गोरिथ्म को ठीक किया और अधिक स्पष्टीकरण जोड़े


कलन विधि:

INPUT: V an array of size n containing positive integers
OUTPUT: T

N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+

For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+

यह एल्गोरिथम निम्नलिखित कारणों के अनुसार काम करता है:

  1. एक तत्व तो v बाल्टी में है j तो vN/j

    vj=min(N/v,n)jN/vN/v

  2. यदि कोई तत्व बाल्टी तो या । vjN/(j+1)<vj=n

    v को बाल्टी में डाला जाता है , इस प्रकार या । पहले मामले में जिसका अर्थ है और इस प्रकार ।j=min(N/v,n)j=N/vj=nj=N/vjN/v<j+1N/(j+1)<v

  3. के लिए , देखते हैं, ज्यादा से ज्यादा, 1 से बाल्टी में तत्वों ।j<njj

    आज्ञा देना और चलो तत्वों की कुल संख्या में से एक बाल्टी में 1.j। द्वारा 2. हम चाहते हैं कि हर तत्व है एक बाल्टी में (के साथ ) ऐसी है कि । इसलिए योग से बाल्टी में सभी तत्वों के करने के लिए से अधिक है । लेकिन यह राशि , से भी कम है, इस प्रकार and और इस प्रकार जो हमें या ।j<nkवी मैं मैं जे एन / ( j + 1 ) एन / ( मैं + 1 ) < वी कश्मीर 1 j कश्मीर × एन / ( जम्मू + 1 ) कश्मीर एन कश्मीर × एन / ( j + 1 ) < कश्मीर एन कश्मीर / ( j + 1 ) <viijN/(j+1)N/(i+1)<vK1jk×N/(J+1)KNk×N/(j+1)<KNk/(j+1)<1k<j+1kj

  4. T सन्तुष्ट (*) अर्थात का -थ तत्व ऐसा है जोjTT[j]N/j

    द्वारा 3. हम उस राशि , के मई के तत्व , एक बाल्टी से आता है के साथ इसलिए ।T[j]jTiijT[j]N/iN/j

  5. इस एल्गोरिथ्म में रैखिक समय लगता है।

    की गणना में रैखिक समय लगता है। बाल्टी को एक लिंक्ड-सूची के साथ लागू किया जा सकता है जिसमें सम्मिलन और पुनरावृत्ति है। नेस्टेड लूप कई बार चलता है जैसे कि तत्व (यानी बार) हैं।NO(1)n


1
प्रश्न को खारिज करने के लिए नहीं (+1, यह एक अच्छा है) लेकिन क्या आपकी ज़रूरत से ज्यादा मूलांक नहीं होगा?
user541686

@ मेहरदाद: आपकी टिप्पणी के लिए धन्यवाद! मूलांक सॉर्टर्स पूर्णांक को सॉर्ट करेगा, लेकिन इसमें समय लगेगा । O(nlog(maxivi))
a3nm

क्या आप इस बात पर टिप्पणी कर सकते हैं कि उस समय की जटिलता के बारे में क्या अवांछनीय है? क्या आपके पास एक बहुत बड़ा पूर्णांक है और बाकी सब कुछ छोटा है, उदाहरण के लिए?
user541686

1
@ a3nm मूलांक सॉर्ट नहीं है O (n log n) यह O (n) है इसलिए रैखिक है यदि पूर्णांकों का आकार निश्चित है, उदाहरण के लिए 32 बिट्स संख्या या 64 बिट्स संख्या। क्या आपके द्वारा क्रमबद्ध संख्याओं का परिवर्तनशील आकार है?
जेवियर कॉम्बेल

1
@XavierCombelle: हां, मैं RAM मॉडल में काम कर रहा हूं और मैं यह नहीं मान सकता कि इनपुट पूर्णांक एक स्थिरांक से बंधे हैं।
a3nm

जवाबों:


8

यह एस्कॉर्ट एल्गोरिदम की तरह लगता है। जीसेन एट के इस लेख को देखें। अल .:

https://www.inf.ethz.ch/personal/smilos/asort3.pdf

दुर्भाग्य से, चलने का समय काफी रैखिक नहीं है। लेख से ऊपर साबित करता है कि किसी भी तुलना के आधार पर बेतरतीब एल्गोरिथ्म रैंकिंग भीतर आइटम n 2 / ν ( एन ) एक कम के लिए बाध्य है n * एल जी ( ν ( एन ) ) (यह मानते हुए ν ( एन ) < n )।nn2/ν(n)nlog(ν(n))ν(n)<n


EDIT , प्रश्न में स्पष्टीकरण के जवाब में:

तुम क्या कर रहे हो बस एक बाल्टी प्रकार है । हालाँकि, बाल्टी सॉर्ट के लिए एल्गोरिथ्म इस मामले में रैखिक नहीं है। समस्या: आपको प्राकृतिक संख्याओं का योग करना है और फिर उनमें से प्रत्येक पर विभाजन करना है। चूंकि संख्याएं आकार में अनबाउंड हैं, इसलिए अब एक निरंतर-समय ऑपरेशन नहीं है। आपको अधिक संख्या में योग करने में अधिक समय लगेगा।N/V[i]

कितना लम्बा? डिवीजन अंकों की संख्या पर निर्भर करता है, इसलिए यह , बार n डिवीजन ऑपरेशन है। यह शायद परिचित लगता है। :)lg(n)n


1
इस लेख की ओर इशारा करने के लिए धन्यवाद! वास्तव में यह प्रश्न से संबंधित है। हालांकि, मेरा एल्गोरिथ्म (न तो मूल संस्करण और न ही थोड़ा अलग संशोधित संस्करण) एस्कॉर्ट के समान नहीं है ;; पहले, मेरा मानना ​​है कि मेरा एल्गोरिथ्म में चलता है , एस्कॉर्ट की तरह शानदार समय में नहीं। दूसरा, मानदंड (*) स्पीयरमैन के पैरों की दूरी के अनुमान से बहुत अलग है; उदाहरण के लिए, मानदंड (*) पूर्णांक दूरी के विपरीत पूर्णांकों के मूल्यों के आधार पर अधिक या कम तंग है। तीसरा, हमारे एल्गोरिथ्म और एस्कॉर्ट दोनों के लिए तत्वों का बकेटिंग है, मानदंड बहुत अलग हैं। O(n)
a3nm

@ a3nm जो आपने ऊपर पोस्ट किया है उसका स्पष्टीकरण है कि आप एक बाल्टी सॉर्ट का उपयोग कर रहे हैं , जो रैखिक है (और तुलना-आधारित नहीं है, जिसका अर्थ है एक-दूसरे के खिलाफ दो वस्तुओं का परीक्षण करना)। समस्या यह है कि यह सभी गणितीय पूर्णांकों के लिए काम नहीं करता है। यह केवल तभी काम करता है जब पूर्णांक आकार बाउंड हो।
त्रिकोणीय वुल्फ

जब आप कहते हैं कि "यह तभी काम करता है जब पूर्णांक आकार बद्ध होता है", मुझे लगता है कि यह केवल सच है अगर मैं वास्तव में पूर्णांक को छाँट रहा था। लेकिन सामान्य तौर पर मैंने जो एल्गोरिथ्म पोस्ट किया है वह वास्तव में उन्हें सॉर्ट नहीं करता है, यह केवल कमजोर मानदंड (*) को लागू करता है। इसलिए मुझे लगता है कि यह पूर्णांक समय में भी चलता है, जब पूर्णांक आकार बाध्य नहीं होता है।
a3nm

2
@ a3nm यह रैखिक नहीं है। ऊपर मेरी विस्तारित प्रतिक्रिया देखें।
ट्रिक्स वूल्फ

उत्तर के लिए धन्यवाद, और देरी के बारे में खेद है। मुझे लगता है कि मॉडल के बारे में कुछ भ्रम है। मैं रैम मॉडल में यूनिफॉर्म टाइम मीम (वैन एमड बोस, मशीन मॉडल्स एंड सिचुएशंस में, हैंडबुक ऑफ कम्प्यूटेशन में) के साथ काम कर रहा हूं: इसलिए जिन संख्याओं में मैं हेरफेर करता हूं, उनमें लॉगरिदमिक आकार हो सकता है, लेकिन इन नंबरों के अंकगणितीय ऑपरेशन में यूनिट लागत होती है। मैंने अपने प्रश्न को तदनुसार संपादित किया है। मुझे लगता है कि, इस मॉडल में, मैं जिस एल्गोरिथ्म का प्रस्ताव करता हूं, वह वास्तव में रैखिक समय में चलता है (लेकिन निश्चित रूप से इस मॉडल में वास्तविक तुलना-आधारित छँटाई के लिए अभी भी लागू होता है)। nlogn
a3nm

2

जैसा कि यह पता चला है, मेरा सवाल बिल्कुल अप्रासंगिक है। वास्तव में, मैं रैम मशीन पर एकसमान लागत उपाय के साथ काम कर रहा हूं (यानी, हमारे पास रजिस्टरों हैं जिनके रजिस्टरों को निरंतर आकार की आवश्यकता नहीं है, लेकिन इनपुट में लॉगरिदमिक आकार के पूर्णांक को स्टोर कर सकते हैं, और इन रजिस्टरों पर संचालन निरंतर समय लेते हैं, सहित) कम से कम जोड़)। और वास्तव में, इस मॉडल में, पूर्णांक को (मूल रूप से एक मूलांक को क्रमबद्ध करके) क्रमबद्ध किया जा सकता है। इसे 1996 के पेपर में ग्रैंडजीन, सॉर्टिंग, रैखिक समय और संतोषजनकता समस्या द्वारा समझाया गया है

(यह मेरे सवाल का जवाब नहीं देता है कि क्या पूर्णांक का एक सेट "लगभग छंटनी" की अच्छी तरह से अध्ययन की गई धारणाएं हैं, लेकिन उनके लिए दिलचस्प होने के लिए संभवतः इन कमजोर धारणाओं को लागू करने के लिए आसान होने की आवश्यकता होगी, अर्थात, एक कमजोर पर काम करना मॉडल या किसी तरह सबलाइनर टाइम में चलते हैं। हालांकि, मुझे फिलहाल इस बात की जानकारी नहीं है कि ऐसा क्या होगा।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.