2012-04-26 21 views
11

मैं दो साधारण तारों की तुलना करने के लिए एक सरल और हल्के एल्गोरिदम की तलाश कर रहा हूं।सरल शब्द diff algorithm

उदाहरण के लिए, अगर हम उन दो तार ले:

"plick भूरी लोमड़ी पागल कुत्ते पर tumps" "जल्दी भूरी लोमड़ी आलसी कुत्ते पर कूदता है"

मुझे यह संकेत देना चाहिए कि दूसरे शब्द के 2 पहले अक्षर अलग हैं, आदि

अभी के लिए मेरे पास एक बहुत ही सरल एल्गोरिदम है जो शब्दों की तुलना करता है:

/// <summary> 
    /// Make a diff between two strings and returns words indices 
    /// </summary> 
    /// <param name="a"></param> 
    /// <param name="b"></param> 
    /// <returns></returns> 
    public static List<int> Diff(string a, string b) 
    { 
     List<int> indices = new List<int>(); 

     string[] asplit = a.Split(' '); 
     string[] bsplit = b.Split(' '); 

     for (int i = 0; i < asplit.Length; i++) 
     { 
      if (bsplit.Length > i) 
      { 
       if (asplit[i].CompareTo(bsplit[i]) != 0) 
       { 
        indices.Add(i); 
       } 
      } 
     } 

     return indices; 
    } 

तो यह मुझे बताएगा कि कौन से शब्द (अंतरिक्ष पात्रों पर विभाजन का उपयोग करके) अलग हैं।

मैंने जटिल एल्गोरिदम लागू करने या मौजूदा लाइब्रेरी का उपयोग करने के बारे में यहां कई विषयों को पढ़ा है।

लेकिन मुझे .NET कॉम्पैक्ट फ्रेमवर्क (WP7) द्वारा नियंत्रित किया गया है और मुझे ऐसा कुछ नहीं है जो दो फाइलों या दो ग्रंथों की तुलना कर सके, मुझे बस एक शब्द तुलना की आवश्यकता है।

क्या कोई पुस्तकालय या एल्गोरिदम फिट हो सकता है? धन्यवाद :)।

+1

क्या होगा यदि वाक्यों में से एक के बीच में कोई शब्द डाला गया है तो यह मैच को स्कूज करता है? क्या यह हर बाद के शब्द को अलग-अलग रिपोर्ट करना चाहिए? –

+9

इस समस्या को हल करने का मानक तरीका सबसे लंबा आम उपक्रम एल्गोरिदम लागू करना है। यह एक सुंदर सीधा एल्गोरिदम है। मेरे पास यहां एक जेस्क्रिप्ट कार्यान्वयन है: http://blogs.msdn.com/b/ericlippert/archive/2004/07/21/189974.aspx इसे C# में कनवर्ट करना एक अभ्यास के रूप में छोड़ा गया है। –

+0

@ जेम्स माइकल हरे: मान लें कि मेरे पास "मेरी छोटी टट्टू" और "मेरी प्यारी छोटी टट्टू" है, इसे केवल "मीठा" की रिपोर्ट करनी चाहिए। मुझे लगता है कि इसके लिए मेरा बहुत आसान एल्गोरिदम विफल रहता है। – Valryon

उत्तर

3

आप DiffPlex प्रोजेक्ट पर एक नज़र डाल सकते हैं।

मूल कार्यक्षमता ऐसा लगता है कि यह \ DiffPlex \ Differ.cs में है, इसमें सिल्वरलाइट दर्शक भी है लेकिन इसे कुछ पोर्टिंग की आवश्यकता हो सकती है।

संपादित करें:

मैं जोड़ने के लिए है कि DiffPlex विशेष रूप से अपने प्रश्न के अनुसार शब्द तुलना का समर्थन करता है चाहता था। हो सकता है कि यह स्पष्ट रूप से अन्य सभी चरित्र, रेखा, आदि तुलना विधियों के बीच दफन नहीं किया जा रहा हो।

+0

यह वास्तव में अच्छा लगता है, मैं केवल कोर को एकीकृत करने की कोशिश करूंगा और देख सकता हूं कि यह मेरी छोटी आवश्यकता के लिए बहुत अधिक नहीं है। धन्यवाद! – Valryon

+0

यह वास्तव में अच्छा काम करता है, धन्यवाद। diff कोर वास्तव में हल्का और शक्तिशाली है, इंटरफ़ेस को समझने में आसान है। एक अतिरिक्त उदाहरण का उपयोग (http://diffplex.codeplex.com/discussions/254392 से यूनिडिफसेकफॉर्मेटर), मैं कुछ पंक्तियों में एक जटिल चार diff निष्पादित करने में सक्षम था। – Valryon

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