আমি সম্প্রতি উইকিপিডিয়ায় সিউডোকোড থেকে ডামেরাউ-লেভেনস্টেইন দূরত্বের অ্যালগরিদমটি প্রয়োগ করেছি। আমি এটা ঠিক কিভাবে কাজ করে কোনো ব্যাখ্যা খুঁজে পাইনি এবং pseudocode হয় মত সম্পূর্ণরূপে Uninformative পরিবর্তনশীল নামের ব্যবহার DA
, DB
, i1
, এবং j1
যে বাম আমার মাথা প্রারম্ভিক।
পাইথনে আমার বাস্তবায়নটি এখানে: https://gist.github.com/badocelot/5327337
পাইথন বাস্তবায়ন আমাকে প্রোগ্রামের মধ্য দিয়ে যেতে সাহায্য করেছিল এবং ভেরিয়েবলের নামকরণকে আরও সহায়ক নামকরণ করে, কী ঘটছে তা নির্ধারণ করতে সহায়তা করে। আমার রেফারেন্সের একটি ফ্রেম ছিল বলে লেভেনস্টাইন দূরত্ব গণনা করতে ওয়াগনার-ফিশার পদ্ধতির সাথে আমি যথেষ্ট পরিচিত ছিলাম।
অত্যধিক দীর্ঘায়িত হওয়ার ঝুঁকিতে, আমি কীভাবে ডামেরাউ-লেভেনস্টেইনকে বুঝতে পারি তা এখানে:
রহস্য ভেরিয়েবল:
DA
(last_row
আমার কোডে) হ'ল এক ধরণের মানচিত্র যা প্রতিটি উপাদানটিতে সর্বশেষ সারিটি দেখা ছিল; আমার কোডে এটি একটি আসল পাইথন অভিধানDB
(last_match_col
) সর্বশেষ কলামটি ধারণ করে যেখানে অক্ষরটি চিঠিটিরb
সাথেa
বর্তমান সারির জন্য মেলেi1
(last_matching_row
) হ'লDA
বর্তমান বর্ণের সারি নম্বর numberb
j1
সম্ভাব্য আপডেট হওয়ার আগেDB
/ এর মানটির কেবল একটি অনুলিপিlast_match_col
; আমার কোডে আমি সরিয়ে নিয়েছি যেখানেlast_match_col
আপডেট হয় এবং এই ভেরিয়েবলটি মুছে ফেলা হয়
স্থানান্তরের ব্যয়:
H[i1][j1] + (i-i1-1) + 1 + (j-j1-1)
(শেষ ম্যাচ) হিসাবে পরিচিত b
সর্বশেষ চরিত্রের সাথে বর্তমান চরিত্রটি অদলবদলের ব্যয় গণনা করছে , সমস্ত অক্ষরকে উভয়ই সংযোজন বা মুছে ফেলা হিসাবে বিবেচনা করবে।b
a
ব্যয়ের উপাদানগুলি:
H[i1][j1]
প্রতিস্থাপনের আগে ভিত্তি ব্যয়কে গণনার আগের বিন্দুতে রূপান্তর করে, যেহেতু কোনও স্থানান্তর অনুসন্ধান পূর্ববর্তী কাজকে অকার্যকর করে দেয়(i-i1-1)
বর্তমান সারি এবং শেষ সারিটির সাথে বর্তমান অক্ষরের সাথে মিল থাকা দূরত্ব হ'ল এটি মুছে ফেলার সংখ্যা যা প্রয়োজনীয় হবে(j-j1-1)
একটি মিলের সাথে বর্তমান কলাম এবং শেষ কলামের মধ্যবর্তী দূরত্ব যা সংযোজনের সংখ্যা- অতিরিক্ত কেবল
+ 1
পরিবহনের ব্যয়
যদি এই বিশ্লেষণটি ভুল হয় তবে আমি কোথায় ভুল হয়েছি তা জানতে আগ্রহী। আমি যেমন বলেছি, অ্যালগরিদম অনলাইনে কীভাবে কাজ করে তার কোনও বিশদ ব্যাখ্যা আমি পাইনি ।
উন্নত সংস্করণ?
যদিও এটি অনুধাবন করা হয়েছে, এটি আমাকে আঘাত করেছিল যে ট্রান্সপোজড চিঠির মধ্যে সংযোজন এবং মুছে ফেলার জন্য উভয়ই মূল্যের হিসাব করে ত্রুটিযুক্ত বলে মনে হয়েছিল: একটি সংযোজন এবং একটি মুছে ফেলা একটি প্রতিস্থাপনের সমতুল্য, যা এটি পরীক্ষা করছে না।
যদি সমস্ত কিছু সঠিক হয় তবে সমাধানটি ন্যূনতম হওয়া উচিত: ট্রান্সপোজড বর্ণগুলির মধ্যে বর্ণগুলির ব্যয় সংযোজন এবং মোছার চেয়ে বেশি হওয়া উচিত : যতগুলি সম্ভব যথাস্থানে রূপান্তর করুন এবং যেকোন সংযোজন বা মুছে ফেলাতে যুক্ত করুন।
সুতরাং ব্যয় হবে:
H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1
এই সংস্করণটির জন্য আমার কোডটি এখানে: https://gist.github.com/badocelot/5327427
কিছু সাধারণ পরীক্ষা থেকে, এটি সঠিক বলে মনে হচ্ছে। উদাহরণস্বরূপ, "abcdef" -> "abcfad" 2 টির সম্পাদনা দূরত্ব দেয় (ট্রান্সপোজ "d" এবং "f", "e" কে "a" তে পরিবর্তন করুন), যখন মূল অ্যালগোরিদম 3 (একটিও শেষ তিনটি) দেয় বর্ণগুলি হ'ল বিকল্প, বা 1 স্থানান্তর + 1 সংযোজন + 1 মুছে ফেলা)।
এখন, আমি এই প্রথম চিন্তা করতে পারে এমন ব্যক্তি হতে পারি না । তো, কেন আমি এটিকে পেরেছি না? আমি কি যথেষ্ট দীর্ঘ অনুসন্ধান করিনি? বা এমন কিছু সূক্ষ্ম ত্রুটি আছে যা এটিকে আসলে কাজ করা থেকে বিরত করে?