সম্পাদন করা (অথবা Levenshtein) দূরত্ব দুটি স্ট্রিং মধ্যে একক অক্ষর সন্নিবেশ, মুছে দেওয়া এবং বদল অপরের মধ্যে এক স্ট্রিং রুপান্তর প্রয়োজনীয় ন্যূনতম সংখ্যা। যদি দুটি স্ট্রিংয়ের দৈর্ঘ্য n থাকে তবে এটি সুপরিচিত যে ডিনামিক প্রোগ্রামিংয়ের মাধ্যমে এটি O (n ^ 2) সময়ে করা যেতে পারে। নিম্নলিখিত পাইথন কোড দুটি স্ট্রিং s1
এবং এর জন্য এই গণনা সম্পাদন করে s2
।
def edit_distance(s1, s2):
l1 = len(s1)
l2 = len(s2)
matrix = [range(l1 + 1)] * (l2 + 1)
for zz in range(l2 + 1):
matrix[zz] = range(zz,zz + l1 + 1)
for zz in range(0,l2):
for sz in range(0,l1):
if s1[sz] == s2[zz]:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz])
else:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz] + 1)
return matrix[l2][l1]
এই কার্যটিতে আপনাকে সম্পাদনা দূরত্বের গণনা করতে পারার সাথে তীব্র মেমরির সীমাবদ্ধতা থাকতে হবে close আপনার কোডে 1000 32-বিট পূর্ণসংখ্যার সমন্বিত একটি অ্যারে সংজ্ঞায়িত করার অনুমতি দেওয়া হয়েছে এবং এটি আপনার গণনায় আপনি কেবলমাত্র অস্থায়ী স্টোরেজ ব্যবহার করবেন। সমস্ত ভেরিয়েবল এবং ডেটা স্ট্রাকচার এই অ্যারেতে থাকা উচিত। বিশেষত, আপনি 1000 দৈর্ঘ্যের স্ট্রিং হিসাবে উপরের অ্যালগরিদমটি প্রয়োগ করতে সক্ষম হবেন না কারণ এতে আপনার কমপক্ষে 1,000,000 সংখ্যা সঞ্চয় করতে হবে। যেখানে আপনার ভাষায় স্বাভাবিকভাবে 32 বিট ইন্টিজার নেই (উদাহরণস্বরূপ পাইথন) আপনার কেবল এটি নিশ্চিত করা দরকার যে আপনি কখনও অ্যারেতে 2 ^ 32-1 এর চেয়ে বড় সংখ্যা সংরক্ষণ করবেন না।
আপনি সেই অংশের মেমরির বিধিনিষেধের বিষয়ে চিন্তা না করে আপনার পছন্দের কোনও মানক গ্রন্থাগার ব্যবহার করে ডেটাতে পড়তে পারেন। আপনার কোডের মূল অংশের জন্য প্রতিযোগিতাটি সুষ্ঠু করার জন্য, আপনি কেবল সেই ক্রিয়াকলাপগুলি ব্যবহার করতে পারেন যা কার্যত সি সি প্রোগ্রামিং ভাষার সাথে সমতুল্য এবং কোনও বাহ্যিক গ্রন্থাগার ব্যবহার করতে পারবেন না।
অতিরিক্ত স্পষ্ট করার জন্য, ইনপুট ডেটা সংরক্ষণ করার জন্য বা আপনার ভাষার ইন্টারপ্রিটার, জেভিএম ইত্যাদির দ্বারা ব্যবহৃত মেমরিটি আপনার সীমাতে গণনা করে না এবং আপনি ডিস্কে কিছু লিখতে পারেন না। আপনাকে অবশ্যই ধরে নিতে হবে ইনপুট ডেটা কেবল পঠনযোগ্য যখন মেমরিতে থাকে তাই আপনি আরও কাজের জায়গা অর্জনের জন্য এটি পুনরায় ব্যবহার করতে পারবেন না।
আমার কী বাস্তবায়ন করতে হবে?
আপনার কোডটি নিম্নলিখিত ফর্ম্যাটে কোনও ফাইলে পড়তে হবে। এটি তিনটি লাইন থাকবে। প্রথম লাইনটি সত্য সম্পাদনার দূরত্ব। দ্বিতীয়টি স্ট্রিং 1 এবং তৃতীয়টি স্ট্রিং 2। আমি এটি https://bpaste.net/show/6905001d52e8 তে নমুনা ডেটা দিয়ে পরীক্ষা করব যেখানে স্ট্রিংগুলির দৈর্ঘ্য 10,000 রয়েছে তবে এটি এই ডেটার জন্য বিশেষীকরণ করা উচিত নয়। এটি দুটি স্ট্রিংয়ের মধ্যে সন্ধান করতে পারে এমন ক্ষুদ্রতম সম্পাদনার দূরত্বকে আউটপুট করা উচিত।
আপনার সম্পাদনা দূরত্ব আসলে বৈধ সম্পাদনাগুলির একটি সেট থেকে আসে তাও প্রমাণ করতে হবে। আপনার কোডে একটি সুইচ থাকা উচিত যা এটিকে এমন মোডে রূপান্তরিত করে যা আরও বেশি মেমরি ব্যবহার করতে পারে (আপনার পছন্দ অনুযায়ী) এবং সম্পাদনা ক্রিয়াকলাপগুলিকে আউটপুট দেয় যা আপনার সম্পাদনার দূরত্ব দেয়।
স্কোর
আপনার স্কোর হবে (optimal edit distance/divided by the edit distance you find) * 100
। জিনিসগুলি শুরু করতে, লক্ষ্য করুন যে আপনি দুটি স্ট্রিংয়ের মধ্যে অমিলের সংখ্যা গণনা করে একটি স্কোর পেতে পারেন।
আপনি আপনার পছন্দ মতো যে কোনও ভাষা লিনাক্সে অবাধে উপলব্ধ এবং সহজেই ইনস্টল করতে পারেন easy
টাই বিরতি
টাই-ব্রেকের ক্ষেত্রে, আমি আপনার কোডটি আমার লিনাক্স মেশিনে চালিত করব এবং দ্রুততম কোড জিতবে।
{ uint32_t foo[1000]; for (foo[0] = 0; foo[0] < 5; ++foo[0]) printf("%d ", foo[0]); }
এটি ধরে নিচ্ছে আপনার 32 বিট সংখ্যার অ্যারে কল করা হবে foo
।
for(int i=0;i<=5;i++)
না কারণ এটি ডাটা সংরক্ষণকারী অনুমতি দেওয়া হবেi
?