मुश्किल एल्गोरिथम? [बन्द है]


164

मैं एक अलग एल्गोरिथ्म की व्याख्या के लिए पागल की तरह दिख रहा हूं जो काम करता है और कुशल है।

मुझे जो निकटतम मिला वह RFC 3284 (कई एरिक सिंक ब्लॉग पोस्ट से) के लिए यह लिंक है , जो पूरी तरह से समझने योग्य शब्दों में वर्णन करता है जिसमें डेटा प्रारूप जिसमें अलग-अलग परिणाम संग्रहीत होते हैं। हालांकि, इसमें कोई उल्लेख नहीं है कि एक कार्यक्रम एक परिणाम करते हुए इन परिणामों तक कैसे पहुंचेगा।

मैं इसे व्यक्तिगत जिज्ञासा से बाहर निकालने के लिए शोध करने की कोशिश कर रहा हूं, क्योंकि मुझे यकीन है कि एक अलग एल्गोरिथ्म को लागू करते समय ट्रेडऑफ़ होना चाहिए, जो कभी-कभी स्पष्ट होते हैं जब आप अंतर को देखते हैं और आश्चर्यचकित होते हैं "क्यों अलग-अलग कार्यक्रम ने इसे बदलाव के रूप में चुना? उसके बदले में?"...

मुझे एक कुशल एल्गोरिथ्म का विवरण कहां मिल सकता है जो वीसीडीआईएफ का आउटपुट देना चाहता है?
वैसे, यदि आप SourceGear के डिफमर्ज़ द्वारा उपयोग किए जाने वाले वास्तविक एल्गोरिथ्म का विवरण खोजने के लिए होते हैं, तो यह और भी बेहतर होगा।

नोट: सबसे लंबे समय तक सामान्य अनुक्रमण VCDIFF द्वारा उपयोग किया जाने वाला एल्गोरिथ्म नहीं लगता है, ऐसा लगता है कि वे कुछ बेहतर कर रहे हैं, जो डेटा प्रारूप का उपयोग करते हैं।


विकिपीडिया पर कुछ नहीं? आप शायद अजगर की तरह एक उच्च स्तर के नुकसान में एक और कार्यान्वयन खोजने की कोशिश कर सकते हैं, जो सी कार्यान्वयन की तुलना में समझने में आसान हो सकता है। अजगर आसानी से पठनीय होने के लिए प्रसिद्ध है? अजगर में एक difflib है। यहाँ स्रोत के लिए यूआरएल है। स्रोत में अलग-अलग एल्गोरिदम के बारे में कई टिप्पणियाँ हैं। svn.python.org/view/python/trunk/Lib/…
bsergean

4
RFC एल्गोरिदम का वर्णन करने के लिए नहीं हैं। वे इंटरफेस (/ प्रोटोकॉल) का वर्णन करने के लिए हैं।

2
दरअसल, सबसे अलग उप-अनुक्रम समस्या, अलग एल्गोरिथ्म का मूल, विकिपीडिया पर पाया जा सकता है। यह पृष्ठ उस एल्गोरिथ्म और नमूना कोड का अवलोकन देता है, जो मुझे एक कस्टम अंतर लिखने के लिए आवश्यक होने पर मददगार मिला: en.wikipedia.org/wiki/Longest_common_subfterence_problem
Corwin Joy

3
शायद यह मदद मिलेगी: paulbutler.org/archives/a-simple-diff-algorithm-in-php यह सुनिश्चित करें कि भयानक है, और यह इतना छोटा है (केवल 29 लाइनों को पूरी तरह से , यह 2 कार्य करता है)। यह स्टैक ओवरफ्लो के एडिट रिवीजन की तरह ही है।
नाथन

VCDIFF मानव पठनीय भिन्नताओं के लिए नहीं है। यह अधिक सादे पठनीय एल्गोरिदम द्वारा उत्सर्जित अधिक मानव पठनीय हटाने और सम्मिलित निर्देशों के विपरीत निर्देशों को जोड़ने, कॉपी करने और चलाने का काम करता है। VCDIFF के लिए आपको कुछ इस तरह की आवश्यकता है जैसे कि xdelta algortihm यहाँ वर्णित है xmailserver.org/xdfs.pdf
asgerhallas

जवाबों:


175

एक O (ND) अंतर एल्गोरिथम और इसका भिन्नरूप एक शानदार पेपर है और आप वहां से शुरू करना चाहते हैं। इसमें छद्म कोड और ग्राफ ट्रैवर्सल्स का एक अच्छा दृश्य शामिल है जो कि अंतर करने में शामिल है।

पेपर की धारा 4 एल्गोरिथ्म में कुछ परिशोधन का परिचय देती है जो इसे बहुत प्रभावी बनाते हैं।

इसे सफलतापूर्वक लागू करने से आप अपने टूलबॉक्स में एक बहुत ही उपयोगी उपकरण छोड़ देंगे (और शायद कुछ उत्कृष्ट अनुभव भी)।

आपके द्वारा आवश्यक आउटपुट स्वरूप उत्पन्न करना कभी-कभी मुश्किल हो सकता है, लेकिन अगर आपको एल्गोरिथ्म इंटर्नल की समझ है, तो आपको अपनी ज़रूरत के अनुसार कुछ भी आउटपुट करने में सक्षम होना चाहिए। आप आउटपुट को प्रभावित करने के लिए और कुछ ट्रेडऑफ़ बनाने के लिए अनुमान भी लगा सकते हैं।

यहाँ एक पृष्ठ है जिसमें कुछ प्रलेखन, पूर्ण स्रोत कोड और उपरोक्त एल्गोरिथम में तकनीकों का उपयोग करके एक अलग एल्गोरिथ्म के उदाहरण शामिल हैं।

स्रोत कोड बारीकी से बुनियादी एल्गोरिथ्म का पालन करने के लिए प्रकट होता है और पढ़ने में आसान है।

इनपुट तैयार करने में भी थोड़ा सा है, जो आपको उपयोगी लग सकता है। जब आप वर्ण या टोकन (शब्द) से भिन्न होते हैं तो आउटपुट में बहुत बड़ा अंतर होता है।

सौभाग्य!


1
यदि लिंक खराब हो जाता है, तो यह मायर्स 1986 है; उदाहरण के लिए देखें citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 - इसमें diffहंट और मैक्लेरो द्वारा यूनिक्स पेपर का लिंक शामिल है ।
ट्रिपल जू

34

मैं अंतर के लिए वास्तविक स्रोत कोड को देखकर शुरू करूंगा , जो जीएनयू उपलब्ध कराता है

यह समझने के लिए कि स्रोत कोड वास्तव में कैसे काम करता है, उस पैकेज के डॉक्स उस कागजात का संदर्भ देते हैं जिसने इसे प्रेरित किया:

बुनियादी एल्गोरिथ्म का वर्णन "एन ओ (एन डी) अंतर एल्गोरिथम और इसके भिन्नरूपों", यूजीन डब्ल्यू मायर्स, 'अल्गोरिथमिका' वॉल्यूम में किया गया है। 1 नंबर 2, 1986, पीपी। 251-266; और "ए फाइल कम्पेरिजन प्रोग्राम", वेब मिलर और यूजीन डब्ल्यू मायर्स, 'सॉफ्टवेयर - अभ्यास और अनुभव' वॉल्यूम में। 15 नंबर 11, 1985, पीपी 1025-1040। एल्गोरिथ्म को स्वतंत्र रूप से "एल्गोरिदम स्ट्रिंग मिलान के लिए एल्गोरिदम", ई। उकोकेन, `सूचना और नियंत्रण 'वॉल्यूम में वर्णित किया गया था। 64, 1985, पीपी। 100-118।

फिर कागजात पढ़ना एक कार्यान्वयन के लिए स्रोत कोड को देखने से यह समझने के लिए पर्याप्त होना चाहिए कि यह कैसे काम करता है।


80
हम्म, संक्षेप में, कभी-कभी वास्तविक स्रोत कोड से अंतर्निहित एल्गोरिथ्म का पता लगाता है (विशेषकर यदि यह कुशल होने के लिए अनुकूलित है) काफी जटिल हो सकता है। मैं यह समझ पाऊँगा कि कार्यक्रम कदम दर कदम क्या कर रहा है, लेकिन वास्तव में "क्यों" नहीं, या उस बारे में एक उच्च स्तरीय अवलोकन ... उदाहरण: आप कभी नहीं समझ पाएंगे कि नियमित अभिव्यक्ति कैसे काम करती है (या वे क्या हैं) पर्ल के रेगेक्स के कार्यान्वयन को देखते हुए। या यदि आप ऐसा कर सकते हैं, तो मैं अपनी टोपी को टिप देता हूं, मुझे निश्चित रूप से यह समझाने की जरूरत है कि क्या चल रहा है।
डैनियल मैगलियोला

3
मुझे कभी यह समझ में नहीं आया कि पर्ल का विशाल बहुमत कैसे काम करता है :-), लेकिन पैकेज डॉक्स (अपडेट देखें) में एक लिंक है जो आपको इसका वर्णन करने वाले साहित्य को इंगित करेगा (यह अलग एल्गोरिथ्म है, पर्ल नहीं)।
paxdiablo

32
कोड को न पढ़ें। अखबार को पढ़ो।
इरा बैक्सटर

31

Https://github.com/google/diff-match-patch देखें

"डिफ मैच और पैच लाइब्रेरी, सादे पाठ को सिंक्रनाइज़ करने के लिए आवश्यक संचालन करने के लिए मजबूत एल्गोरिदम प्रदान करते हैं। ... वर्तमान में जावा, जावास्क्रिप्ट, सी ++, सी # और पायथन में उपलब्ध हैं"

इसके अलावा wikipedia.org डिफ पेज देखें और - " ब्रैम कोहेन: डिफरेंट प्रॉब्लम सॉल्व हो गई है "


2
बस यह उल्लेख करना चाहता था कि कोहेन का एल्गोरिथ्म भी लगता है कि रोगी डिफ के रूप में जाना जाता है। यह डिफ़ॉल्ट है? बाजार में अलग एल्गोरिथ्म और गिट में एक वैकल्पिक एक।
डेल हाग्लगंड

13

मैं यहाँ अलग एल्गोरिथ्म की तलाश में आया था और बाद में अपना कार्यान्वयन किया। क्षमा करें, मुझे vcdiff के बारे में जानकारी नहीं है।

विकिपीडिया : सबसे लंबे समय तक सामान्य परिणाम से भिन्न-भिन्न आउटपुट प्राप्त करने के लिए यह केवल एक छोटा कदम है: यदि कोई आइटम बाद में अनुपस्थित है, लेकिन मूल में मौजूद है, तो उसे हटा दिया जाना चाहिए। ('-' अंक, नीचे।) यदि यह बाद में अनुपस्थित है, लेकिन दूसरे अनुक्रम में मौजूद है, तो इसे ('+' अंक) में जोड़ा जाना चाहिए।

LCS एल्गोरिथ्म का अच्छा एनीमेशन यहाँ

एक तेजी से LCS रूबी कार्यान्वयन से लिंक करें

मेरा धीमा और सरल रूबी अनुकूलन नीचे है।

def lcs(xs, ys)
  if xs.count > 0 and ys.count > 0
    xe, *xb = xs
    ye, *yb = ys
    if xe == ye
      return [xe] + lcs(xb, yb)
    end
    a = lcs(xs, yb)
    b = lcs(xb, ys)
    return (a.length > b.length) ? a : b
  end
  return []
end

def find_diffs(original, modified, subsequence)
  result = []
  while subsequence.length > 0
    sfirst, *subsequence = subsequence
    while modified.length > 0
      mfirst, *modified = modified
      break if mfirst == sfirst
      result << "+#{mfirst}"
    end
    while original.length > 0
      ofirst, *original = original
      break if ofirst == sfirst
      result << "-#{ofirst}"
    end
    result << "#{sfirst}"
  end
  while modified.length > 0
    mfirst, *modified = modified
    result << "+#{mfirst}"
  end
  while original.length > 0
    ofirst, *original = original
    result << "-#{ofirst}"
  end
  return result
end

def pretty_diff(original, modified)
  subsequence = lcs(modified, original)
  diffs = find_diffs(original, modified, subsequence)

  puts 'ORIG      [' + original.join(', ') + ']'
  puts 'MODIFIED  [' + modified.join(', ') + ']'
  puts 'LCS       [' + subsequence.join(', ') + ']'
  puts 'DIFFS     [' + diffs.join(', ') + ']'
end

pretty_diff("human".scan(/./), "chimpanzee".scan(/./))
# ORIG      [h, u, m, a, n]
# MODIFIED  [c, h, i, m, p, a, n, z, e, e]
# LCS       [h, m, a, n]
# DIFFS     [+c, h, +i, -u, m, +p, a, n, +z, +e, +e]

10

Emmelaich ने जो लिंक दिया है, उसके आधार पर, नील फ्रेजर की वेबसाइट (लाइब्रेरी के लेखकों में से एक) पर डिफ स्ट्रैटेजीज़ का एक बेहतरीन रन डाउन भी है ।

वह बुनियादी रणनीतियों को शामिल करता है और लेख के अंत में मायर के एल्गोरिथ्म और कुछ ग्राफ सिद्धांत की ओर बढ़ता है।

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