দ্রুত কে মেলানো স্ট্রিং মেলানো অ্যালগরিদম


10

আমি একটি দ্রুত কে-মেলানো স্ট্রিংয়ের সাথে মিলে থাকা অ্যালগরিদমের সন্ধান করছি। দৈর্ঘ্য মিটারের একটি প্যাটার্ন স্ট্রিং পি এবং দৈর্ঘ্যের এন এর একটি পাঠ্য স্ট্রিং টি দেওয়া, আমার বেশিরভাগ কে মিলে না মিলের সাথে টি এর একটি স্ট্রিংয়ের সাথে মিলে এমন সমস্ত অবস্থানের সন্ধান করতে আমার একটি দ্রুত (রৈখিক সময়) অ্যালগরিদম প্রয়োজন। এটি কে-পার্থক্য সমস্যা (দূরত্ব সম্পাদনা করুন) থেকে পৃথক। একটি মিল নয়, বেশিরভাগ কে পজিশনে পৃথক অক্ষর থাকে এবং প্যাটার্নটির আলাদা বর্ণ রয়েছে। আমার সত্যই কেবল কে = 1 প্রয়োজন (সর্বাধিক 1 টি মিল নয়), তাই কে = 1 এর নির্দিষ্ট ক্ষেত্রে একটি দ্রুত অ্যালগরিদমও যথেষ্ট। বর্ণমালার আকার 26 (কেস-সংবেদনশীল ইংরেজি পাঠ্য) হয়, সুতরাং বর্ণমালার আকারের সাথে স্থানের প্রয়োজনীয়তা খুব দ্রুত বৃদ্ধি করা উচিত নয় (উদাহরণস্বরূপ, FAAST অ্যালগরিদম, আমি বিশ্বাস করি, বর্ণমালার আকারে স্পেস এক্সোনোনিয়াল লাগে এবং তাই) শুধুমাত্র প্রোটিন এবং জিনের ক্রমগুলির জন্য উপযুক্ত)।

একটি গতিশীল প্রোগ্রামিং ভিত্তিক পদ্ধতির সবচেয়ে খারাপ ক্ষেত্রে ও (এমএন) প্রবণতা থাকবে যা খুব ধীর হবে। আমি বিশ্বাস করি এর জন্য বায়ার-মুর অ্যালগরিদমের পরিবর্তন রয়েছে তবে আমি এই জাতীয় কাগজগুলিতে আমার হাত পেতে সক্ষম হই না। একাডেমিক জার্নাল বা প্রকাশনা অ্যাক্সেস করার জন্য আমার সাবস্ক্রিপশন নেই, সুতরাং কোনও রেফারেন্স পাবলিক ডোমেনে থাকতে হবে।

আমি কোনও পয়েন্টার, বা অবাধে উপলভ্য নথিগুলির রেফারেন্সগুলি বা এই সমস্যার জন্য নিজেই অ্যালগরিদমকে খুব প্রশংসা করব।


2
যদি প্যাটার্নটি স্থির করা হয় (তবে মেলানোর পাঠ্যটি পৃথক হয়), আপনি সম্ভাব্যভাবে একটি সসীম অটোমেটন তৈরি করতে পারেন এবং এর মাধ্যমে পাঠ্যটি চালাতে পারেন। প্রত্যয় গাছ ব্যবহার করেও অ্যালগরিদম রয়েছে (পাঠ্য স্থির থাকে এবং প্যাটার্ন পরিবর্তিত হয় তবে সাধারণত ভাল তবে উভয় ভিন্ন হলেও প্রযোজ্য), আপনি ওয়েবে কিছু রেফারেন্স পেতে সক্ষম হতে পারেন। (আমি এখনও উত্তর যুক্ত করছি না যেহেতু আমি প্রত্যয় গাছ ভিত্তিক অ্যালগরিদম সম্পর্কে খুব বেশি নিশ্চিত নই, যদি কেউ জানেন তবে দয়া করে এই মন্তব্যটিকে উপেক্ষা করতে দ্বিধা করবেন)।
— আর্যভাটা

@ আর্যভাটা ধন্যবাদ! প্যাটার্ন এবং পাঠ্য উভয়ই পরিবর্তন হয়। সেই প্রসঙ্গে, একটি সসীম অটোম্যাটন তৈরি করা খুব ব্যয়বহুল হবে, বিশেষত যখন 1 টি অমিলের সুযোগ রয়েছে। প্রত্যয় গাছ / প্রত্যয় অ্যারে হিসাবে, আমি এগুলি কখনও ব্যবহার করি নি, এবং সেগুলি সম্পর্কে খুব কম জানি না, তবে এই ধারণাটি ছিল যে তারা নির্মাণে ধীর এবং মূলত সঠিক মিলের জন্য দক্ষ। তবে আমি এই বিকল্পটি আরও অনুসন্ধান করব। এই দিকের কোনও নির্দেশক বা অন্য কোনও দিক সবচেয়ে কার্যকর হবে!
— পরেশ

1
না, প্রত্যয় গাছগুলিও আনুমানিক ম্যাচের জন্য ব্যবহার করা যেতে পারে। : উইকি দাবি তাই অন্তত en.wikipedia.org/wiki/Suffix_tree
— আর্যভট্ট

উত্তর:


5

প্রত্যয় অ্যারেগুলি এই সমস্যার জন্য ব্যবহার করা যেতে পারে। এগুলিতে ডিক্সোগ্রাফিক ক্রমে সাজানো স্ট্রিংয়ের প্রতিটি প্রত্যয়ের শুরু অবস্থান থাকে। যদিও তারা naively নির্মাণ করা যেতে পারে জটিলতা, তাদের মধ্যে গঠন করা পদ্ধতি Θ ( এন ) জটিলতা। উদাহরণস্বরূপ এটি এবং এটি দেখুন । আসুন আমরা এই প্রত্যয় অ্যারে SA বলি।O(nlog⁡n)Θ(n)

প্রত্যয় অ্যারেটি তৈরি হয়ে গেলে, প্রত্যয় অ্যারের জন্য আমাদের একটি দীর্ঘতম কমন উপসর্গ (এলসিপি) অ্যারে তৈরি করা দরকার। এলসিপি অ্যারে প্রত্যয় অ্যারেতে ধারাবাহিকভাবে দুটি উপসর্গের মধ্যে দীর্ঘতম সাধারণ উপসর্গের দৈর্ঘ্য সংরক্ষণ করে (ডিক্সিকোগ্রাফিক ধারাবাহিক প্রত্যয়)। সুতরাং, LCP [i] এ SA [i] এবং SA [i + 1] এর মধ্যে দীর্ঘতম সাধারণ উপসর্গের দৈর্ঘ্য ধারণ করে। এই অ্যারেটি লিনিয়ার সময়েও তৈরি করা যেতে পারে: দেখুন এখানে , এখানে এবং এখানে কিছু ভাল রেফারেন্সের জন্য।

uvu<vminu<=k<=v−1LCP[k]LCPO(n)O(nlog⁡n)LCP[u,v]O(1)

iTLCPTiPPT[i]l0TPLCPT[i+l0+1]P[l0+1]kLCPO(1)O(k) LCPiTO(nk)

O(nk+(n+m)log⁡(n+m))O(nk+nlog⁡n)m=O(n)O(nk)


গ্রেট! আমার টোডো তালিকায় এখন আমার কিছুটা পড়া আছে :-)
— আর্যভট্ট

দ্বিতীয় অনুচ্ছেদে সিয়াম.org লিঙ্কটি নষ্ট হয়েছে তবে লিঙ্কযুক্ত কাগজটি এখানে পাওয়া যাবে epubs.siam.org/doi/pdf/10.1137/1.9781611972917.3
— লিকব্যাকার

4

O(n+m)kO(nk+m)

ধারণাটি সঠিক স্ট্রিং ম্যাচের জন্য রবিন-কার্প রোলিং হ্যাশ অ্যালগরিদমের সাথে সমান ।

m2km/2k2k2k

k

k

আমি প্রত্যাশা করি (সতর্কতা: এটি নিজে চেষ্টা করেননি) প্রত্যয় গাছভিত্তিক পদ্ধতির ব্যবহারের চেয়ে সম্ভবত এটি অনুশীলনে দ্রুত এবং কোড / রক্ষণাবেক্ষণ করা আরও সহজ হবে।


শুধু একটি ব্যাখ্যা প্রয়োজন। ".. দৈর্ঘ্য মিটার প্রতিটি স্ট্রিংকে এম / 2 কে আকারের 2 কে ব্লকে বিভক্ত করুন ...", আপনার অর্থ টি দৈর্ঘ্যের মিটার প্রতিটি স্ট্রিংকে 2 (দৈর্ঘ্যের এন) 2k ব্লকে আলাদা করুন। এবং এই হ্যাশটি ও (এন) এ রোলিং হ্যাশ পদ্ধতিতে গণনা করা যায়। তারপরে, প্যাটার্নের স্ট্রিংটি 2 কে ব্লকেও বিভক্ত হবে এবং আনুষঙ্গিক হ্যাশগুলির তুলনা করা হবে, যা প্রায় কে-ব্লকের সাথে মেলে না allow যদি তাই হয়, তবে আমরা সম্ভাব্যভাবে কেস-এর চেয়ে বেশি মিল নেই এমন সমস্ত ক্ষেত্রেই বাতিল করতে সক্ষম হব। আমি কি ঠিক বুঝতে পেরেছি?
— পরেশ

kΩ(nk)O(n)

আমি এই পদ্ধতির পছন্দ! তবুও, এই পদ্ধতিরটি সাধারণভাবে দ্রুত, তবে ম্যাচের সংখ্যা বেশি (ও (এন) ম্যাচ) বেশি হলে ও (এমএনকে) এর সাথে অবনতি ঘটে। এটি মাথায় রেখে, আমি দুটি রোলিং হ্যাশ বজায় রেখেছিলাম, এই ধারণার অধীনে যে উভয়ের একই ইনপুটটির জন্য সংঘর্ষ হতে পারে না (যেহেতু আমি গতিটি দেখতে চেয়েছিলাম আমি এই গাণিতিকভাবে করি নি)। এইভাবে, দুটি হ্যাশ সম্মত হলে আমাদের কোনও ম্যাচ চার-বাই-চারটি যাচাই করতে হবে না। এটি সাধারণভাবে বেশ দ্রুত, তবে ম্যাচের সংখ্যা বড় হলে এটিও ধীর। এটির সাথে এবং আপনি যেভাবে পরামর্শ দিয়েছিলেন, এটি বড় ম্যাচের জন্য ধীর ছিল।
— পরেশ

mm/2kmO(nkm)

mm/2k2kk+1k+cΩ(nm)mm/2k
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.