2008-09-10 16 views
18

मैं इसे अपने प्रश्नों के उत्तर देने की भावना में पोस्ट कर रहा हूं।डेल्फी में लेवेनशेटिन दूरी को आप कैसे कार्यान्वित करते हैं?

मेरा प्रश्न यह था: मैं डेल्फी में described here के रूप में दो तारों के बीच संपादन दूरी की गणना के लिए लेवेनशेटिन एल्गोरिदम को कैसे कार्यान्वित कर सकता हूं?

प्रदर्शन पर बस एक नोट: यह बात बहुत तेज है। मेरे डेस्कटॉप पर (2.33 गीगा ड्यूल-कोर, 2 जीबी रैम, विनएक्सपी), मैं एक सेकंड से भी कम समय में 100 के तारों की एक सरणी के माध्यम से चला सकता हूं।

+11

जेफ ने इसे अपने प्रश्नों के उत्तर देने के लिए प्रोत्साहित किया है। यह न केवल एक प्रश्न मंच है बल्कि उत्तर खोजने के लिए एक मंच है। वे किससे आ रहे हैं - कौन परवाह करता है। बहुत बढ़िया। –

उत्तर

16
function EditDistance(s, t: string): integer; 
var 
    d : array of array of integer; 
    i,j,cost : integer; 
begin 
    { 
    Compute the edit-distance between two strings. 
    Algorithm and description may be found at either of these two links: 
    http://en.wikipedia.org/wiki/Levenshtein_distance 
    http://www.google.com/search?q=Levenshtein+distance 
    } 

    //initialize our cost array 
    SetLength(d,Length(s)+1); 
    for i := Low(d) to High(d) do begin 
    SetLength(d[i],Length(t)+1); 
    end; 

    for i := Low(d) to High(d) do begin 
    d[i,0] := i; 
    for j := Low(d[i]) to High(d[i]) do begin 
     d[0,j] := j; 
    end; 
    end; 

    //store our costs in a 2-d grid 
    for i := Low(d)+1 to High(d) do begin 
    for j := Low(d[i])+1 to High(d[i]) do begin 
     if s[i] = t[j] then begin 
     cost := 0; 
     end 
     else begin 
     cost := 1; 
     end; 

     //to use "Min", add "Math" to your uses clause! 
     d[i,j] := Min(Min(
       d[i-1,j]+1,  //deletion 
       d[i,j-1]+1),  //insertion 
       d[i-1,j-1]+cost //substitution 
       ); 
    end; //for j 
    end; //for i 

    //now that we've stored the costs, return the final one 
    Result := d[Length(s),Length(t)]; 

    //dynamic arrays are reference counted. 
    //no need to deallocate them 
end; 
+1

सफाई भाग की आवश्यकता नहीं है, और प्रदर्शन को भी चोट पहुंचा सकता है। जब कार्य बाहर निकलता है तो गतिशील सरणी डेल्फी द्वारा आवंटित की जाएगी। – kobik

+0

धन्यवाद @ kobik! मैं भूल गया कि गतिशील सरणी संदर्भ गिना जाता है और हमारे लिए हटा दिया जाता है। कोड तदनुसार समायोजित किया गया है। – JosephStyons

+4

[वाउटर वैन निफ्टेरिक] (http://stackoverflow.com/users/38813/wouter-van-nifterick) ने एक और अधिक अनुकूलित फ़ंक्शन बनाया [यहां] (http://stackoverflow.com/a/10593797/576719)। –

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