2012-01-05 20 views
17

बस हास्केल का उपयोग करके देखा और महसूस किया (जहां तक ​​मैं कह सकता हूं) स्ट्रिंग को जांचने के लिए कोई सीधा तरीका नहीं है यह देखने के लिए कि इसमें एक छोटी स्ट्रिंग है या नहीं। तो मैंने सोचा कि मैं बस उस पर एक शॉट ले जाऊंगा।क्या "स्ट्रिंग युक्त एक्स" विधि लिखने का कोई बेहतर तरीका है?

अनिवार्य रूप से विचार यह जांचना था कि दोनों तार एक ही आकार के थे और बराबर थे। यदि स्ट्रिंग की जांच की जा रही थी, तो सिर की बार-बार लूप थी और स्ट्रिंग की जांच होने तक जांच को फिर से चलाएं।

बाकी संभावनाएं मैंने उन्हें संभालने के लिए पैटर्न का उपयोग किया। यही वह है जिसके साथ मैं आया:

stringExists "" wordToCheckAgainst = False 
stringExists wordToCheckFor "" = False 
stringExists wordToCheckFor wordToCheckAgainst | length wordToCheckAgainst < length wordToCheckFor = False 
               | length wordToCheckAgainst == length wordToCheckFor = wordToCheckAgainst == wordToCheckFor 
               | take (length wordToCheckFor) wordToCheckAgainst == wordToCheckFor = True 
               | otherwise = stringExists wordToCheckFor (tail wordToCheckAgainst) 

उत्तर

41

क्या आपने Hoogle चेक किया था?

यदि आप उस फ़ंक्शन के हस्ताक्षर की खोज करते हैं जिसे आप ढूंढ रहे हैं (String -> String -> Bool) आपको शीर्ष परिणामों में isInfixOf देखना चाहिए।

+1

Hoogle के लिए +1। यह सभी हास्केल कोडर्स का सबसे अच्छा दोस्त है :) – Daenyth

+17

जांच रहा है ['InInfixOf'] का स्रोत] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Data-List.html #isInfixOf) निर्देशक है। – dave4420

+0

@ डेव 4420 लिंक टूटा हुआ है। – ThreeFx

23

Data.List से isInfixOf निश्चित रूप से समस्या का समाधान होगा, हालांकि लंबे समय तक haystacks या perverse¹ सुइयों के मामले में आप और अधिक उन्नत string matching algorithms एक बेहतर औसत और सबसे ज्यादा मामले जटिलता के साथ विचार करना चाहिए।


एक बहुत लंबा केवल a से मिलकर स्ट्रिंग की और a का एक बहुत के साथ एक सुई 'शुरुआत में और एक b अंत में विचार करें ¹।

+0

ध्यान दें कि किसी भी अधिक कुशल एल्गोरिदम को 'स्ट्रिंग' (या' [ए]') की तुलना में एक अलग डेटा संरचना की आवश्यकता होगी। –

+3

दरअसल, उन्हें आमतौर पर इनपुट स्ट्रिंग के प्रारंभिक प्रीप्रोकैसिंग की आवश्यकता होती है। उन्हें एक तरीके से कार्यान्वित करना जिसके परिणामस्वरूप '(स्ट्रिंग -> स्ट्रिंग -> बूल) 'फ़ंक्शन बिल्कुल संभव है। – Jan

+0

यदि आप वास्तव में प्रदर्शन में रुचि रखते हैं, तो आप शायद इसे इस तरह कार्यान्वित करेंगे: [Data.Text.Search.indices] (http://hackage.haskell.org/packages/archive/text/latest/doc/html /src/Data-Text-Search.html#indices) (नोट 'Data.Text.isInfixOf' इस के संदर्भ में लागू किया गया है; आलस्य के कारण यह पहली अनुक्रमणिका के बाद बंद हो सकता है) –

9

अपनी टेक्स्ट-प्रोसेसिंग आवश्यकताओं के लिए text package (हैकेज पर text, अब हास्केल प्लेटफॉर्म का हिस्सा भी) का उपयोग करने पर विचार करें। यह एक यूनिकोड टेक्स्ट प्रकार प्रदान करता है, जो अधिक समय-और अंतर्निहित सूची-आधारित String की तुलना में अंतरिक्ष-कुशल है। स्ट्रिंग सर्च के लिए, text पैकेज implementsBoyer-Moore-based algorithm, जिसमें Data.List.isInfixOf द्वारा उपयोग की जाने वाली भद्दा विधि की तुलना में बेहतर जटिलता है।

प्रयोग उदाहरण:

Prelude> :s -XOverloadedStrings 
Prelude> import qualified Data.Text as T 
Prelude Data.Text> T.breakOnAll "abc" "defabcged" 
[("def","abcged")] 
Prelude Data.Text> T.isInfixOf "abc" "defabcged" 
True 
+0

सबलोडिंग की जांच करने के लिए ओवरलोडेड स्ट्रिंग की आवश्यकता है हालांकि मैचों में एक सुंदर बुरा वार्ट है। 'पैक' और 'अनपैक' में लपेटने का विकल्प वास्तव में असंतोषजनक भी है। – ely

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