2010-06-28 12 views
5

मैं विभिन्न सबस्ट्रिंग खोज (एला स्ट्रस्ट्र) एल्गोरिदम और कार्यान्वयन का मूल्यांकन करने की कोशिश कर रहा हूं और कुछ अच्छी तरह से तैयार की गई सुई और घास के तारों की तलाश कर रहा हूं जो सबसे खराब केस प्रदर्शन और संभावित कोने-केस कीड़े को पकड़ेंगे। मुझे लगता है कि मैं उन्हें खुद से बाहर कर सकता हूं लेकिन मुझे लगता है कि किसी के पास कहीं भी बैठे परीक्षण मामलों का अच्छा संग्रह होना चाहिए ...बेंचमार्किंग और तनाव परीक्षण के लिए खोज परीक्षण एल्गोरिदम के लिए अच्छे परीक्षण मामले क्या हैं?

+2

आपका अंतिम लक्ष्य यहां क्या है? बस एल्गोरिदम के बारे में जानने के लिए? या आपके पास असामान्य सुइयों/घास के साथ एक आवेदन है? – Cascabel

+0

अल्प अवधि में, केवल एल्गोरिदम के बारे में जानने के लिए। लंबी अवधि में, मेरे पास सी-लाइब्रेरी कार्यान्वयन बहुत कम आकार की ओर उन्मुख है जो ऊपर-औसत प्रदर्शन के साथ उन्मुख दृष्टिकोण का उपयोग कर रहा है, और मैं इसे ओ (एन) समय/ओ में से किसी एक के साथ बदलने पर विचार करना चाहता हूं (1) अंतरिक्ष एल्गोरिदम। एसएमओए वादा करता है लेकिन मैं देखना चाहता हूं कि तुलना में 6 एन +5 ऊपरी बाउंड में निरंतर 6 अभ्यास में समस्याग्रस्त है (मेरे शुरुआती परीक्षणों से यह दूरस्थ रूप से सैने डेटा पर बहुत कम दिखाता है, और ग्लिबल के प्रदर्शन में तुलनीय सभी विशेष- छोटी/लंबी सुइयों के लिए आवरण)। –

उत्तर

0

सीधे आपके प्रश्न का उत्तर नहीं देता है, लेकिन आपको पुस्तक में एल्गोरिदम मिल सकते हैं - एल्गोरिदम स्ट्रिंग्स, पेड़ और अनुक्रमों पर: कंप्यूटर विज्ञान और कम्प्यूटेशनल जीवविज्ञान - दिलचस्प (उप-स्ट्रिंग खोज पर कई उपन्यास एल्गोरिदम हैं)। इसके अतिरिक्त, यह विशेष और जटिल मामलों का भी एक अच्छा स्रोत है।

+0

धन्यवाद, लेकिन यह वास्तव में परीक्षण/बेंचमार्किंग विचार है जिसे मैं ढूंढ रहा हूं। मेरे यहां एल्गोरिदम पर एक सभ्य संदर्भ है: http://www-igm.univ-mlv.fr/~lecroq/string/index.html दो रास्ता और एसएमओए एकमात्र "तेज़" प्रतीत होता है (बड़े-ओ में) कोड के लिए उपयुक्त एल्गोरिदम जो विफलता के मामलों की अनुमति नहीं है, क्योंकि बाकी अंतरिक्ष में nonconstant हैं और तनावग्रस्त स्मृति स्थितियों के तहत विफल हो सकता है। हालांकि निष्पक्ष कार्यान्वयन भी बहुत दिलचस्प है और ऐसा लगता है कि यह बहुत बड़ी सुई आकारों के लिए अनुकूल हो सकता है। यह कोशिश की गई है कि छोटे से मध्यम तारों के लिए ग्लिब के दो मार्ग जितना तेज़ है। –

+0

लिंक के लिए धन्यवाद! यह सटीक स्ट्रिंग मिलान एल्गोरिदम का वास्तविक अच्छा संकलन है। – tathagata

3

कुछ विचार और अपने आप को एक आंशिक जवाब:

जानवर बल एल्गोरिथ्म के लिए सबसे खराब मामला:

(a^n b)^m में

a^(n+1) b

उदा

(yxyxyxxyxyxyxy)^n में कुछ yxyxyxxyxyxyxx की तरह: aabaabaabaabaabaabaab

SMOA के लिए सबसे खराब स्थिति में aaab। आगे परिशोधन की जरूरत है। मैं यह सुनिश्चित करने की कोशिश कर रहा हूं कि प्रत्येक प्रगति आंशिक मिलान की केवल आधा लंबाई है, और अधिकतम प्रत्यय गणना के लिए बैकट्रैकिंग की अधिकतम मात्रा की आवश्यकता होती है। मुझे पूरा यकीन है कि मैं सही रास्ते पर हूं क्योंकि इस प्रकार का मामला एकमात्र तरीका है जिसे मैंने एसएमओए के कार्यान्वयन के लिए अभी तक पाया है (जो असम्बद्ध रूप से 6n+5 है) ग्लिब के दो-तरफ से धीमी गति से चल रहा है (जो असम्बद्ध रूप से है 2n-m लेकिन मामूली दर्दनाक प्रीप्रोकैसिंग ओवरहेड है)। आधारित कुछ भी रोलिंग-हैश के लिए

सबसे खराब मामला:

जो बाइट्स की अनुक्रम सुई के हैश के साथ हैश टकराव का कारण बनता है। किसी भी उचित रूप से तेज़ हैश और दी गई सुई के लिए, यह एक घास का निर्माण करना आसान होना चाहिए जिसका हैश हर बिंदु पर सुई के हैश के साथ टकराता है। हालांकि, लंबे समय तक आंशिक मैचों को बनाना मुश्किल लगता है, जो कि सबसे खराब केस व्यवहार पाने का एकमात्र तरीका है। स्वाभाविक रूप से सबसे बुरे मामले के व्यवहार के लिए सुई में कुछ आवधिकता होनी चाहिए, और अंतिम पात्रों को समायोजित करके हैश को अनुकरण करने का एक तरीका होना चाहिए।

दो मार्ग के लिए

सबसे खराब मामला:

nontrivial एमएस अपघटन के साथ बहुत ही कम सुई होने के लिए लगता है - जहां भूसे के ढेर में सुई के अधिकार से डेढ़ घटक में गलत परिणामों की बार-बार होता है - - dacdacdacdacdacdacdac की तरह कुछ की तरह bac कुछ । एकमात्र तरीका यह एल्गोरिदम धीमा हो सकता है (ग्लिब लेखकों द्वारा इसे खराब करने के अलावा ...) बाहरी लूप को कई बार फिर से बनाकर और बार-बार उस ओवरहेड (और सेटअप ओवरहेड महत्वपूर्ण बनाते हैं) बनाते हैं।

अन्य एल्गोरिदम:

मैं वास्तव में केवल एल्गोरिदम कि अंतरिक्ष में O(1) कर रहे हैं और कम preprocessing भूमि के ऊपर है में दिलचस्पी रखता हूँ, इसलिए मैं उनके खराब मामलों में इतना देखा नहीं किया है। कम से कम बॉयर-मूर (O(n) बनाने के लिए संशोधनों के बिना) में एक मामूली सबसे खराब मामला है जहां यह O(nm) बन जाता है।

0

एक प्रक्रिया है कि दिलचस्प आंकड़े दे सकता है, हालांकि मैं अभी परीक्षण करने के लिए समय नहीं है: स्ट्रिंग लंबाई से अधिक

यादृच्छिक करें, तो है कि लंबाई की स्ट्रिंग सामग्री पर randomize, तो एक की भरपाई/लंबाई से अधिक randomize substring (संभवतः स्ट्रिंग में कुछ नहीं), तो सबस्ट्रिंग (संभवतः बिल्कुल नहीं) पर यादृच्छिक रूप से clobber, दोहराना। एक से एक चरित्र जोड़कर

रिक्त स्ट्रिंग के साथ शुरू, सेट में वर्तमान में एक स्ट्रिंग के संवर्धन द्वारा दिए गए सभी स्ट्रिंग्स उत्पन्न:

0

आप कंटेनर तार उत्पन्न कर सकते हैं (। resp, परीक्षण मान हों) रिकर्सिवली द्वारा बाएं या दाएं (दोनों) के लिए वर्णमाला।

कंटेनर तार बनाने के लिए वर्णमाला आपके द्वारा चुने गए हैं।

आप निहित तारों के लिए 2 अक्षर का परीक्षण करते हैं। एक वह है जो कंटेनर तार बनाता है, दूसरा इसका पूरक है।

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