2011-10-22 4 views
36

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

मुझे taxonomy of various suffix array construction algorithms मिला, लेकिन यह पुराना है। मैंने SA-IS, qsufsort, और BPR के बारे में सुना है, लेकिन मुझे वास्तव में नहीं पता कि वे एक दूसरे से तुलना कैसे करते हैं, न ही यदि बेहतर एल्गोरिदम भी हैं। इस बात पर विचार करते हुए कि प्रत्यय-सरणी फ़ील्ड कितनी गर्म है, मुझे उम्मीद है कि कुछ अन्य एल्गोरिदम ने प्रकाशित होने के बाद से उन्हें हटा दिया है। मुझे लगता है कि "विभाजित" नामक एक तेज एल्गोरिदम का वर्णन करने वाले पेपर में आना याद है, लेकिन मुझे अब मेरे जीवन के लिए यह नहीं मिल रहा है।

तो, कला की वर्तमान स्थिति क्या है? आदर्श रूप से, मुझे वर्तमान सर्वोत्तम एल्गोरिदम की एक छोटी सूची चाहिए (लिंक के साथ, यदि संभव हो) और उनकी सापेक्ष ताकत और कमजोरियों का त्वरित अवलोकन।

उत्तर

41

वर्तमान में, सबसे अच्छा प्रत्यय-ऐरे कन्स्ट्रक्टर जाना जाता LibDivSufSort, युटा मोरी के द्वारा होता है: http://code.google.com/p/libdivsufsort/

यह प्रेरित छंटाई कार्यप्रणाली (मूल रूप से उपयोग करता है, "एक * 'के साथ शुरू सभी स्ट्रिंग्स छाँटने के बाद, आप तार के sortings पैदा कर सकते हैं" बीए * "" सीए * "" डीए * "आदि)

इसकी effi के लिए हर जगह इसकी सराहना की जाती है अपर्याप्त मामलों की क्षमता और अच्छी हैंडलिंग। यह सबसे तेज़ है, और स्मृति की इष्टतम मात्रा (5 एन) का उपयोग करता है। लाइसेंस अनौपचारिक है, इसलिए इस एल्गोरिदम को कई अन्य कार्यक्रमों में एकीकृत किया गया है, उदाहरण के लिए उदाहरण के लिए libbsc संपीड़न लाइब्रेरी, Ilya Grebnov द्वारा। http://libbsc.com/default.aspx

तुलना प्रयोजनों के लिए, यदि आप एक प्रत्यय सरणी संपीड़न इस पेज पर लिंक मानक मिलेगा: http://code.google.com/p/libdivsufsort/wiki/SACA_Benchmarks और इस पृष्ठ http://homepage3.nifty.com/wpage/benchmark/index.html

बेंचमार्क भी कई अन्य योग्य Saca कार्यान्वयन सूचीबद्ध करता है। फिर भी, लाइसेंस और दक्षता दोनों कारणों के लिए, मैं उनके बीच libdivsufsort की सिफारिश करेंगे।

संपादित करें: जाहिर है, MSufsort जल्द ही संस्करण 4 की ओर बढ़ रहा है, और यह Divsufsort से काफी तेज हो जाना चाहिए। यदि यह सही है, तो यह एक नया एसएसीए चैंपियन बन जाएगा। लेकिन फिर भी, हमारे पास अभी तक रिलीज की तारीख नहीं है, और यह अल्फा सामान होगा। तो अगर आपको अब एक सिद्ध कार्यान्वयन की आवश्यकता है, तो libdivsufsort सबसे अच्छा विकल्प बना हुआ है।

ध्यान दें कि ये "सर्वश्रेष्ठ एसएसीए कार्यान्वयन" "एक निर्माण एल्गोरिदम" का उपयोग नहीं करते हैं, लेकिन कई अनुकूलन चालें जोड़ते हैं, जिससे उन्हें सारांशित करना मुश्किल हो जाता है।

+0

चीयर्स :-) इसके लिए धन्यवाद, यह सबसे प्रबुद्ध है। मुझे नहीं लगता कि आपको पता होना चाहिए कि "विभाजित" एसएसीए क्या है? (मुझे यह नहीं पता कि मैंने इसे कहाँ देखा है, और खोज निष्पक्ष साबित हो रही हैं) – Cameron

+0

आह, मुझे अंत में "विभाजन" मिला: इसका उल्लेख [इस पेपर] में है (http://goanna.cs.rmit.edu.au/~ sjp/awoca2006.pdf), MS4Sort एल्गोरिदम के लिए उपनाम के रूप में खंड 4 – Cameron

2

आपको कम से दे सकता है:

प्रत्यय सरणियों और संकुचित प्रत्यय सरणियों आर ग्रॉसी पर एक त्वरित दौरा - सैद्धांतिक कंप्यूटर विज्ञान, 2011

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

9

http://code.google.com/p/libdivsufsort/source/browse/wiki/SACA_Benchmarks.wiki आपको इच्छित सबसे तेज़ एल्गोरिदम की सूची देता है।

केवीर्क का कार्यान्वयन उपरोक्त बेंचमार्क में सबसे अधिक मामले में सबसे तेज़ है। आप http://www.kvatom.com/archon पर कोड पा सकते हैं।

libdivsufsort आईटी के एल्गोरिदम और प्रेरित सॉर्टिंग की पोस्ट प्रक्रिया का संयोजन है। प्रत्यय का एक सबसेट प्रेरित सॉर्टिंग एल्गोरिदम की तरह ही चुना जाता है, लेकिन इसके बजाय प्रेरित सॉर्टिंग द्वारा इसे हल करने के बजाय, उन्हें आईटी के एल्गोरिदम द्वारा क्रमबद्ध किया जाता है।

libdivsufsort और kvark का कार्यान्वयन आईटी के एल्गोरिदम पर आधारित दोनों हैं।

केए का एल्गोरिदम आईटी के एल्गोरिदम के समान है, जो 99 में दिखाई देता है। वे दोनों प्रत्यय को 2 श्रेणियों में विभाजित करते हैं: प्रकार एस या टाइप एल। यदि i-th प्रत्यय (i + 1) से छोटा है- प्रत्यय, यह प्रकार एस है; अन्यथा यह प्रकार एल है। सभी प्रकार एस प्रत्यय क्रमबद्ध करने के बाद, हम सभी प्रकार के एल प्रत्यय के क्रम को कम कर सकते हैं, फिर हम कर रहे हैं।

केए के एल्गोरिदम और आईटी के एल्गोरिदम के बीच का अंतर यह है कि: केए सब्सट्रिंग को सॉर्ट करने के लिए रिकर्सन का उपयोग करते हैं, जबकि आईटी के एल्गोरिदम मल्टीकी क्विक्सोर्ट/एमएसडी/सम्मिलन प्रकार के लिए अपील करते हैं।

संबंधित मुद्दे