संपादित करें (या 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]
इस कार्य में आपको जितना पास होना चाहिए, आप संपादित दूरी की गणना कर सकते हैं, लेकिन एक गंभीर स्मृति प्रतिबंध के साथ। आपके कोड को 1000 32-बिट पूर्णांकों वाले एक सरणी को परिभाषित करने की अनुमति दी गई है और यह आपके द्वारा उपयोग किए जाने वाले एकमात्र अस्थायी संग्रहण है। सभी चर और डेटा संरचनाएं इस सरणी में समाहित की जानी हैं। विशेष रूप से, आप ऊपर दिए गए एल्गोरिथ्म को 1000 की लंबाई के स्ट्रिंग्स के रूप में लागू नहीं कर पाएंगे क्योंकि इसके लिए आपको कम से कम 1,000,000 नंबरों को स्टोर करना होगा। जहां आपकी भाषा में स्वाभाविक रूप से 32 बिट पूर्णांक नहीं हैं (उदाहरण के लिए पायथन) आपको बस यह सुनिश्चित करने की आवश्यकता है कि आप सरणी में 2 ^ 32-1 से बड़ी संख्या को कभी संग्रहीत न करें।
आप उस हिस्से में मेमोरी प्रतिबंधों की चिंता किए बिना अपनी पसंद के किसी भी मानक पुस्तकालय का उपयोग कर डेटा में पढ़ सकते हैं। अपने कोड के मुख्य भाग के लिए प्रतियोगिता को उचित बनाने के लिए, आप केवल उन कार्यों का उपयोग कर सकते हैं जो C प्रोग्रामिंग भाषा में उन लोगों के बराबर कार्यात्मक हैं और किसी भी बाहरी पुस्तकालयों का उपयोग नहीं कर सकते हैं।
अतिरिक्त स्पष्ट होने के लिए, इनपुट डेटा को स्टोर करने के लिए या आपकी भाषा के दुभाषिया, जेवीएम आदि द्वारा उपयोग की जाने वाली मेमोरी आपकी सीमा की ओर नहीं होती है और आप डिस्क पर कुछ भी नहीं लिख सकते हैं। आपको यह मान लेना चाहिए कि इनपुट डेटा केवल तभी पढ़ा जाता है जब मेमोरी में है ताकि आप अधिक कार्यशील स्थान प्राप्त करने के लिए पुन: उपयोग न कर सकें।
मुझे क्या लागू करना है?
आपका कोड निम्नलिखित प्रारूप में एक फ़ाइल में पढ़ा जाना चाहिए। इसकी तीन लाइनें होंगी। पहली पंक्ति सही संपादित दूरी है। दूसरा स्ट्रिंग 1 है और तीसरा स्ट्रिंग 2 है। मैं इसे नमूना डेटा के साथ https://bpaste.net/show/6905001d52e8 पर परीक्षण करूंगा जहां स्ट्रिंग्स की लंबाई 10,000 है, लेकिन यह इस डेटा के लिए विशेष नहीं होना चाहिए। इसे दो स्ट्रिंग्स के बीच मिल सकने वाली सबसे छोटी एडिट दूरी को आउटपुट करना चाहिए।
आपको अपने संपादन दूरी को वास्तव में संपादन के एक वैध सेट से आता है साबित करने की आवश्यकता होगी। आपके कोड में एक स्विच होना चाहिए जो इसे एक ऐसे मोड में बदल देता है जो अधिक मेमोरी (जितना आपको पसंद हो) का उपयोग कर सकता है और संपादित संचालन को आउटपुट कर सकता है जो आपके संपादन दूरी को देता है।
स्कोर
आपका स्कोर होगा (optimal edit distance/divided by the edit distance you find) * 100
। चीजों को शुरू करने के लिए, ध्यान दें कि आप केवल दो तारों के बीच बेमेल की संख्या की गिनती करके स्कोर प्राप्त कर सकते हैं।
आप अपनी पसंद की किसी भी भाषा का उपयोग कर सकते हैं, जो कि लिनक्स में आसानी से उपलब्ध है और इंस्टॉल करना आसान है
बराबर का अवसर
टाई-ब्रेक के मामले में, मैं आपके कोड को अपने लिनक्स मशीन पर चलाऊंगा और सबसे तेज कोड जीतूंगा।
{ 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
?