दो पेड़ संरचनाओं को समान बनाने के लिए न्यूनतम संचालन की गणना करें


81

यह एक सीएस सवाल का अधिक है, लेकिन एक दिलचस्प है:

मान लीजिए कि हमारे पास 2 पेड़ संरचनाएं हैं जो कमोबेश एक ही नोड को पुनर्गठित करती हैं। तुम कैसे पाओगे?

  1. कोई भी
  2. कुछ मायने में न्यूनतम

संचालन का क्रम

  • MOVE(A, B) - नोड A को नोड B के नीचे ले जाता है (पूरे उपट्री के साथ)
  • INSERT(N, B)- नोड बी के तहत एक नया नोड एन सम्मिलित करता है
  • DELETE (A) - नोड ए को हटाता है (पूरे उपशीर्षक के साथ)

वह एक पेड़ को दूसरे में बदल देता है।

स्पष्ट रूप से ऐसे मामले हो सकते हैं जहां इस तरह का परिवर्तन संभव नहीं है, तुच्छ होने वाले बच्चे के साथ मूल ए है। ऐसे मामलों में, एल्गोरिदम बस एक परिणाम देगा " संभव नहीं "।

इससे भी अधिक शानदार संस्करण नेटवर्क के लिए एक सामान्यीकरण है, अर्थात जब हम मानते हैं कि एक नोड पेड़ में कई बार हो सकता है (प्रभावी रूप से कई "माता-पिता"), जबकि चक्र निषिद्ध हैं।

डिस्क्लेमर: यह एक होमवर्क नहीं है, वास्तव में यह एक वास्तविक व्यावसायिक समस्या से आता है और मुझे यह काफी दिलचस्प लगा, अगर कोई इसका समाधान जान सकता है।


MOVE(A,B)ऐसा ही प्रतीत होता है जैसे INSERT(A,B)कि Aकोई बच्चा नहीं है। Aअगर कोई करता है तो उसके बच्चों का क्या होता है INSERT(A,B)? (क्या वे Aमाता-पिता से जुड़े होंगे ?)
आंद्रे होल्ज़नर

अंतर यह है कि INSERT का वास्तव में एक नया नोड है, जो पहले पेड़ में नहीं था (इसलिए कोई भी बच्चा नहीं है, कम से कम मूल स्थिति में नहीं जहां यह मौजूद नहीं था)। दूसरी ओर MOVE वास्तव में एक चाल है, अर्थात अपने बच्चों सहित नोड के कदम
टॉमस वाना

11
ऐसा लगता है कि आपको ग्राफ़-आइसोमॉर्फिज़्म का पता लगाने की आवश्यकता है । परिवर्तन के बारे में हिस्सा मुझे लेवेंशेटिन दूरी की याद दिलाता है , जो गतिशील प्रोग्रामिंग के साथ बड़े पैमाने पर ओ (एन * मी) में हल किया जा सकता है। हो सकता है कि ये संकेत आपकी मदद करें।
ब्योर्न पोलेक्स

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

@ मिकेल, क्या आपने कुछ उपयोगी पाया है? मैं वृक्षों में परिवर्तन में कमी के समान आभामंडल की तलाश कर रहा हूं।
पावेल

जवाबों:


25

ग्राफ आइसोमोर्फिज्म (स्पेस_C0wb0y अंक के रूप में) पर न केवल एक विकिपीडिया लेख है, बल्कि ग्राफ समरूपता समस्या पर एक समर्पित लेख भी है । इसका एक खंड Solved special casesहै जिसके लिए बहुपद-समय समाधान ज्ञात हैं। पेड़ उनमें से एक है और यह निम्नलिखित दो संदर्भों का हवाला देता है:


16

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

कई कागजात हैं जो वाक्यविन्यास के पेड़ों की तुलना करने और विभिन्न तरीकों से न्यूनतम दूरी की गणना करने पर चर्चा करते हैं। विचार प्रासंगिक होने चाहिए।

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

इन एल्गोरिदम के कुछ वास्तव में कंप्यूटर प्रोग्राम स्रोत पाठ की तुलना के लिए उपलब्ध उपकरणों में महसूस किए जाते हैं। हमारा स्मार्ट डिफरेंसर उनमें से एक है; यह कई भाषाओं के लिए एक स्पष्ट भाषा व्याकरण द्वारा संचालित है।


2
दरअसल, हमारे मामले में यह स्रोत कोड नहीं है, ये वास्तव में पेड़ हैं। उन पेड़ों में कुछ अर्थ है, लेकिन सभी महत्वपूर्ण नहीं हैं - वे सीधे उपयोगकर्ताओं द्वारा एक पेड़ के रूप में
टॉमस वाना

टूटी हुई कड़ी: मैंने सिर्फ "चेंज डिस्टिलिंग" पेपर की तलाश में 20 मिनट बिताए। यहां अपडेट की गई लिंक है: merlin.uzh.ch/publication/show/2531 सॉफ्टवेयर प्रोजेक्ट खुद ही bitbucket.org/sealuzh/tools-changedistiller/wiki/Home पर चला गया है (जो कि मुझे पीडीएफ का सही लिंक कैसे मिला)
शालोम क्रेमर

13

हालांकि यह प्रश्न पुराना है, मैं नीचे कुछ संदर्भ और एल्गोरिदम जोड़ूंगा:

  1. एक्स-डिफ: एक्सएमएल दस्तावेज़ों के लिए एक प्रभावी परिवर्तन जांच एल्गोरिथ्म, युआन वांग, डेविड जे। डेविट, जिन-यी कै
  2. KF-Diff +: XML दस्तावेज़ों के लिए अत्यधिक कुशल परिवर्तन जांच एल्गोरिथम
  3. diffX: मल्टी-वर्जन XML डॉक्यूमेंट्स में बदलाव का पता लगाने के लिए एक एल्गोरिथम
  4. एक्सएमएल पेड़ों में परिवर्तन का पता लगाएं: एक सर्वेक्षण, ल्यूक पीटर्स
  5. ट्री डेटा संरचनाओं में समानता

इसके अलावा, GitHub (जावास्क्रिप्ट में) पर लाइब्रेरी और फ्रेमवर्क हैं, जो JSON डेटा या XML ट्रीज़ (जैसे क्लाइंट-साइड MVC / MVVM के लिए) से निपटने वाले उदाहरण अनुप्रयोगों के लिए ट्री जैसी संरचना को लागू करते हैं:

  1. React.js
  2. JSON- पैच
  3. jsondiffpatch
  4. वस्तु

अत्यधिक Change Detection in XML Trees: a Surveyकागज को पढ़ने की सलाह देते हैं - यह XML के अलग-अलग (जो कि सिर्फ पेड़ के अलग होने के लिए) दर्जनों एल्गोरिदम को सूचीबद्ध करता है।
टिम्मम Tim ’

8

यदि लोगों को यह सवाल लगता है और Node.js या ब्राउज़र के लिए कुछ लागू करने की आवश्यकता है, तो मैं एक कार्यान्वयन के लिए एक लिंक और कोड उदाहरण प्रदान कर रहा हूं, जो मैंने लिखा है कि आप यहां github पर पा सकते हैं: ( https://github.com) / Pyonto/jqgram.git ) मौजूदा PyGram पायथन कोड ( https://github.com/Sycondaman/PyGram ) पर आधारित है ।

यह एक ट्री एडिट डिस्टेंस एंबेडिकेशन एल्गोरिदम है, लेकिन यह सच एडिट डिस्टेंस को खोजने की कोशिश की तुलना में बहुत तेज है। सन्निकटन O (n लॉग एन) समय और O (n) स्पेस में प्रदर्शन करता है जबकि सही एडिट डिस्टेंस अक्सर O (n ^ 3) या O (n ^ 2) होता है, जो ट्रू एडिट डिस्टेंस के लिए ज्ञात एल्गोरिदम का उपयोग करता है। वह शैक्षणिक पेपर देखें जिसमें से PQ-Gram एल्गोरिथम आता है: ( http://www.vldb2005.org/program/paper/wed/p301-augsten.pdf )

तो jqgram का उपयोग करना:

उदाहरण:

var jq = require("jqgram").jqgram;
var root1 = {
    "thelabel": "a",
    "thekids": [
        { "thelabel": "b",
        "thekids": [
            { "thelabel": "c" },
            { "thelabel": "d" }
        ]},
        { "thelabel": "e" },
        { "thelabel": "f" }
    ]
}

var root2 = {
    "name": "a",
    "kiddos": [
        { "name": "b",
        "kiddos": [
            { "name": "c" },
            { "name": "d" },
            { "name": "y" }
        ]},
        { "name": "e" },
        { "name": "x" }
    ]
}

jq.distance({
    root: root1,
    lfn: function(node){ return node.thelabel; },
    cfn: function(node){ return node.thekids; }
},{
    root: root2,
    lfn: function(node){ return node.name; },
    cfn: function(node){ return node.kiddos; }
},{ p:2, q:3 },
function(result) {
    console.log(result.distance);
});

और यह आपको 0 और 1. के बीच एक संख्या प्रदान करता है। शून्य के जितना करीब, उतने ही अधिक निकटता से संबंधित दो पेड़ जख्मी दिखते हैं। एक दृष्टिकोण इसकी गति को देखते हुए कई पेड़ों के बीच से कई नज़दीकी पेड़ों पर संकीर्ण करने के लिए jqgram का उपयोग करने के लिए हो सकता है, फिर बचे हुए कुछ पेड़ों पर सही संपादित दूरी का उपयोग करें, जिन्हें आपको बारीकी से निरीक्षण करने की आवश्यकता है, और इसके लिए आप अजगर को ढूंढ सकते हैं उदाहरण के लिए झांग और शाशा एल्गोरिदम के संदर्भ या पोर्ट के लिए कार्यान्वयन।

ध्यान दें कि lfn और cfn पैरामीटर निर्दिष्ट करते हैं कि प्रत्येक पेड़ को नोड लेबल नामों और प्रत्येक पेड़ की जड़ के लिए बच्चों की स्वतंत्र रूप से सरणी कैसे निर्धारित करनी चाहिए ताकि आप किसी ऑब्जेक्ट की तुलना किसी ब्राउज़र जैसे ब्राउज़र DOM की तुलना में कर सकें। आपको बस इतना करना है कि प्रत्येक रूट के साथ उन कार्यों को प्रदान करना है और jqgram बाकी काम करेगा, अपने lfn और cfn को कॉल करके कार्य करता है ताकि पेड़ों का निर्माण किया जा सके। तो इस अर्थ में यह (मेरी राय में वैसे भी) PyGram की तुलना में उपयोग करने के लिए बहुत आसान है। इसके अलावा, इसका जावास्क्रिप्ट, इसलिए इसे क्लाइंट या सर्वर-साइड का उपयोग करें!

ALSO, साइकिल का पता लगाने के संबंध में जवाब देने के लिए, jqgram के अंदर क्लोन विधि की जाँच करें, वहाँ चक्र का पता लगाना है, लेकिन इसके लिए श्रेय नोड-क्लोन के लेखक को जाता है जिसमें से उस टुकड़े को थोड़ा संशोधित किया गया था और शामिल किया गया था।


यह कई lfn अनुमति देता है? मैं लेबल से अधिक मिलान करना चाहता हूं, अर्थात। संग्रहीत मूल्य भी। नोड।
जॉन कित्जिक

0

इसे ट्री टू ट्री करेक्शन प्रॉब्लम या ट्री टू ट्री एडिटिंग प्रॉब्लम कहा जाता है । इस से निपटने वाला अधिकांश साहित्य किसी कारण से एक्सएमएल पेड़ों की तुलना करने से स्पष्ट रूप से संबंधित है, इसलिए "एक्सएमएल डिफरिंग एल्गोरिदम" की खोज से बहुत सारे परिणाम मिलते हैं। निकोस की लिंक्स की सूची के अलावा, मुझे ये मिले:

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

दुर्भाग्य से वहाँ बहुत खुला स्रोत कोड उपलब्ध नहीं लगता है जो ऐसा करता है और प्राचीन नहीं है। बस बहुत सारे अति जटिल कागजात। : - /


मैं इस पेपर को नहीं देख पा रहा हूं, लेकिन क्या पीडीएफ लिंक टूटी हुई है? Change Detection in XML Trees: a Survey
मेंगो

मेरे लिये कार्य करता है। क्या आपने Download full-test PDFबटन पर क्लिक किया ? यदि यह किसी कारण से अवरुद्ध है, तो शायद विज्ञान-हब का प्रयास करें।
टिम्मम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.