স্ট্রিংগুলির মধ্যে তফাত দ্রুত খুঁজে পাওয়ার জন্য ডেটা স্ট্রাকচার বা অ্যালগরিদম


19

আমার কাছে 100,000 স্ট্রিংয়ের অ্যারে রয়েছে, সমস্ত দৈর্ঘ্যের । আমি দুটি স্ট্রিং 1 টি অক্ষরের দ্বারা পৃথক কিনা তা দেখতে আমি প্রতিটি স্ট্রিংকে অন্য স্ট্রিংয়ের সাথে তুলনা করতে চাই। এই মুহুর্তে, আমি প্রতিটি স্ট্রিং অ্যারে যুক্ত করার সাথে সাথে আমি এটি ইতিমধ্যে অ্যারেতে থাকা প্রতিটি স্ট্রিংয়ের বিপরীতে যাচাই করছি, যার সময় জটিলতা রয়েছে time ।এন ( এন - 1 )এন(এন-1)2

এমন কোনও ডেটা স্ট্রাকচার বা অ্যালগরিদম রয়েছে যা আমি ইতিমধ্যে যা করছি তার থেকে দ্রুত একে অপরের সাথে তুলনা করতে পারে?

কিছু অতিরিক্ত তথ্য:

  • অর্ডার বিষয়গুলি: abcdeএবং xbcde1 টি অক্ষর দ্বারা পৃথক হয় abcdeএবং edcba4 টি অক্ষর দ্বারা পৃথক হয়।

  • প্রতিটি চরিত্রের দ্বারা পৃথক স্ট্রিংয়ের জন্য, আমি অ্যারে থেকে str স্ট্রিংগুলির একটি অপসারণ করব।

  • এখনই, আমি স্ট্রিংগুলি সন্ধান করছি যা কেবলমাত্র 1 টি চরিত্রের দ্বারা পৃথক, তবে এটি যদি 1 অক্ষরের পার্থক্যটি 2, 3, বা 4 টি অক্ষরে বৃদ্ধি করা যায় তবে এটি ভাল হবে। তবে এই ক্ষেত্রে, আমি মনে করি চরিত্র-পার্থক্য সীমা বাড়ানোর দক্ষতার চেয়ে দক্ষতা আরও গুরুত্বপূর্ণ।

  • সাধারণত 20-40 এর মধ্যে থাকে।


4
1 ত্রুটির সাথে একটি স্ট্রিং অভিধান অনুসন্ধান করা মোটামুটি সুপরিচিত একটি সমস্যা, যেমন cs.nyu.edu/~adi/CGL04.pdf
KWillets

1
20-40 জনগণ মোটামুটি জায়গা ব্যবহার করতে পারে। আপনি পরীক্ষা করতে একটি ব্লুম ফিল্টার ( en.wikedia.org/wiki/Bloom_filter ) দেখতে পাচ্ছেন কিনা একটি টেস্ট মেরে এক, দুই বা ততোধিক বিকল্পের সমস্ত মেশার সেট - সম্ভবত "ইন-ইন" বা "অবশ্যই" -নোট-ইন "একটি সংখ্যক কমার্স। যদি আপনি একটি "সম্ভবত-ইন" পান তবে এটি দুটি মিথ্যা পজিটিভ কিনা তা নির্ধারণের জন্য আরও দুটি স্ট্রিং তুলনা করুন। "অবশ্যই-না-ইন" কেসগুলি হ'ল negativeণাত্মক যা কেবলমাত্র সম্ভাব্য "সম্ভবত-ইন" হিটগুলির মধ্যে তুলনা সীমাবদ্ধ করে আপনাকে করতে হবে চিঠি-দ্বারা-চিঠি তুলনার সামগ্রিক সংখ্যা হ্রাস করবে।
অ্যালেক্স রেনোল্ডস

যদি আপনি কে এর আরও ছোট পরিসরের সাথে কাজ করে থাকেন তবে আপনি সমস্ত ডিজেনরেট স্ট্রিংয়ের জন্য বুলিয়ানগুলির একটি হ্যাশ টেবিল সংরক্ষণ করতে বিটসেট ব্যবহার করতে পারেন (যেমন, খেলনা উদাহরণের জন্য github.com/alexpreynolds/kmer- বুলিয়ান )। যদিও কে = 20-40, বিটসেটের জন্য স্থানের প্রয়োজনীয়তা কেবল খুব বেশি simply
অ্যালেক্স রেনল্ডস

উত্তর:


12

সবচেয়ে খারাপ ক্ষেত্রে চলমান সময় অর্জন করা সম্ভব ।হে(এনলগ)

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

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

তারপরে, প্রতিটি স্ট্রিং নিন এবং একটি হ্যাশটেবলে সংরক্ষণ করুন, এবার স্ট্রিংয়ের দ্বিতীয়ার্ধে কীড করুন । আবার একই বালতিতে প্রতিটি জোড়া স্ট্রিং পরীক্ষা করে দেখুন।

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

পারফরম্যান্স অপটিমাইজেশন হিসাবে, যদি কোনও বালতিতে এর বেশি স্ট্রিং থাকে তবে আপনি একই চরিত্রের সাথে পৃথক একটি জুটির সন্ধান করতে পুনরাবৃত্তভাবে একই প্রক্রিয়াটি পুনরাবৃত্তি করতে পারেন। পুনরাবৃত্তির অনুরোধটি দৈর্ঘ্যের স্ট্রিংগুলিতে থাকবে ।/2

আপনি যদি সবচেয়ে খারাপ সময় চলমান সময় সম্পর্কে যত্নশীল হন:

উপরে কর্মক্ষমতা অপ্টিমাইজেশান সঙ্গে আমি বিশ্বাস করি খারাপ-কেস সময় চলমান হে(এনলগ)


3
যদি স্ট্রিংগুলি একই প্রথম ভাগ করে, যা বাস্তব জীবনে খুব ভাল ঘটতে পারে তবে আপনি জটিলতার উন্নতি করেন নি। Ω(এন)
einpoklum

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

15

আমার সমাধান j_random_hacker এর মত তবে এটি কেবল একটি একক হ্যাশ সেট ব্যবহার করে।

আমি স্ট্রিংগুলির একটি হ্যাশ সেট তৈরি করব। ইনপুটটিতে প্রতিটি স্ট্রিংয়ের জন্য, সেট স্ট্রিং যুক্ত করুন। এই স্ট্রিংগুলির প্রত্যেকটিতে একটি অক্ষরের একটি বিশেষ অক্ষর দ্বারা প্রতিস্থাপন করুন, কোনও স্ট্রিংয়ের মধ্যে পাওয়া যায় নি। আপনি এগুলি যুক্ত করার সময়, তারা ইতিমধ্যে সেটে নেই তা পরীক্ষা করুন। যদি সেগুলি হয় তবে আপনার দুটি স্ট্রিং রয়েছে যা কেবলমাত্র একটি অক্ষরের দ্বারা পৃথক।

'এবিসি', 'অ্যাডিসি' স্ট্রিং সহ একটি উদাহরণ

এবিসি-র জন্য আমরা '* বিসি', 'এ * সি' এবং 'আব *' যুক্ত করব

অ্যাডিসির জন্য আমরা '* ডিসি', 'এ * সি' এবং 'বিজ্ঞাপন *' যুক্ত করি

যখন আমরা দ্বিতীয়বার 'a * সি' যুক্ত করি তখন লক্ষ্য করি এটি ইতিমধ্যে সেটে রয়েছে, তাই আমরা জানি যে দুটি স্ট্রিং রয়েছে যা কেবল একটি বর্ণের দ্বারা পৃথক।

এই অ্যালগরিদমের মোট চলমান সময় হ'ল । এটি কারণ আমরা ইনপুটটিতে সমস্ত এন স্ট্রিংয়ের জন্য কে নতুন স্ট্রিং তৈরি করি । এই স্ট্রিংগুলির প্রত্যেকটির জন্য আমাদের হ্যাশ গণনা করা দরকার, যা সাধারণত ( কে ) সময় নেয় ।O(nk2)এনO(k)

সমস্ত স্ট্রিং সংরক্ষণ করার জন্য স্পেস লাগে ।O(nk2)

আরও উন্নতি

আমরা পরিবর্তিত স্ট্রিংগুলি সরাসরি না সঞ্চয় করে পরিবর্তে মূল স্ট্রিংয়ের রেফারেন্স সহ একটি অবজেক্ট স্ট্রোক করে এবং মুখোশযুক্ত চরিত্রের সূচকটি আরও উন্নত করতে পারি। এইভাবে আমাদের সমস্ত স্ট্রিং তৈরি করার দরকার নেই এবং সমস্ত বস্তু সংরক্ষণ করার জন্য আমাদের কেবল স্পেসের প্রয়োজন।হে(এন*)

আপনাকে অবজেক্টগুলির জন্য একটি কাস্টম হ্যাশ ফাংশন প্রয়োগ করতে হবে। আমরা জাভা বাস্তবায়ন একটি উদাহরণ হিসাবে নিতে পারেন , জাভা ডকুমেন্টেশন দেখুন । জাভা হ্যাশকোড প্রতিটি অক্ষরের ইউনিকোড মানকে ( কে দিয়ে স্ট্রিংয়ের দৈর্ঘ্য এবং আমি অক্ষরের এক-ভিত্তিক সূচক দিয়ে গুণিত করে that দ্রষ্টব্য যে প্রতিটি পরিবর্তিত স্ট্রিং কেবল একটি অক্ষর দ্বারা মূল থেকে পৃথক হয় We আমরা সহজেই গণনা করতে পারি হ্যাশ কোডে এই চরিত্রের অবদান। আমরা এটি বিয়োগ করতে পারি এবং পরিবর্তে আমাদের মাস্কিং চরিত্রটি যুক্ত করতে পারি This এটি গণনা করতে O ( 1 ) লাগে This এটি আমাদের চলমান মোট সময়কে ( এন) এ নামিয়ে আনতে সহায়তা করে31-আমিআমিহে(1)হে(এন*)


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

( কে ) সময়ে প্রতিটি স্ট্রিংয়ের জন্য হ্যাশগুলি গণনা করার জন্য , আমি মনে করি আপনার একটি বিশেষ হোমমেড হ্যাশ ফাংশন প্রয়োজন হবে (উদাহরণস্বরূপ, ( কে ) সময়ে মূল স্ট্রিংয়ের হ্যাশ গণনা করুন , তারপরে মুছে যাওয়া প্রতিটিটির সাথে এটি এক্সওআর করুন ) ( 1 ) সময়গুলিতে প্রতিটি অক্ষর (যদিও এটি সম্ভবত অন্যান্য উপায়ে বেশ খারাপ হ্যাশ ফাংশন))। বিটিডাব্লু, এটি আমার সমাধানের সাথে বেশ সমান, তবে কে পৃথক পৃথক পরিবর্তে একক হ্যাশটেবলের সাথে এবং একটি অক্ষর মুছে ফেলার পরিবর্তে "*" দিয়ে প্রতিস্থাপন করবে। হে()হে()হে(1)
j_random_hacker

@ সিমোনপ্রিনস কাস্টম equalsএবং hashCodeপদ্ধতিগুলির সাথে কাজ করতে পারে। এই পদ্ধতিগুলিতে কেবল একটি * বি-স্টাইলের স্ট্রিং তৈরি করে এটি বুলেটপ্রুফ করা উচিত; আমি সন্দেহ করি এখানে অন্যান্য উত্তরগুলির মধ্যে কয়েকটিতে হ্যাশ সংঘর্ষের সমস্যা থাকবে।
জলি জোকার

1
@ ডিডাব্লু আমি এই পোস্টটি পরিবর্তন করে এই সত্যটি প্রতিফলিত করেছিলাম যে হ্যাশগুলি গণনা করতে সময় লাগে এবং মোট চলমান সময়কে ( N কে ) এ নামিয়ে আনার জন্য একটি সমাধান যুক্ত করে । হে()হে(এন*)
সাইমন প্রিনস

1
হ্যাশস সংঘর্ষের সময় হ্যাশসেট কনটেনগুলিতে স্ট্রিং সমতা পরীক্ষার কারণে সিমোনপ্রিন্স সবচেয়ে খারাপ কেস এনকে ^ 2 হতে পারে। অবশ্যই, সবচেয়ে খারাপ ক্ষেত্রে যখন প্রত্যেক স্ট্রিং একই সঠিক হ্যাশ, যা স্ট্রিং একটি প্রায় কাছাকাছি handcrafted সেট করতে হবে, বিশেষ করে একই হ্যাশ পেতে হয়েছে *bc, a*c, ab*। আমি ভাবছি এটা কি অসম্ভব দেখানো যায়?
জলি জোকার

7

আমি হ্যাশটেবেল এইচ 1 , , এইচ কে করব , যার প্রত্যেকটির কী হিসাবে একটি ( কে - 1 ) দৈর্ঘ্যের স্ট্রিং এবং মান হিসাবে সংখ্যার তালিকা (স্ট্রিং আইডি) থাকবে। Hashtable এইচ আমি সব স্ট্রিং থাকতে হবে এতদূর প্রক্রিয়াজাত কিন্তু অবস্থানে অক্ষর দিয়ে আমি মোছা । উদাহরণস্বরূপ, যদি = 6 , তারপর এইচ 3 [ একটি বি ডি এফ ] যে আছে প্যাটার্ন এ পর্যন্ত দেখা সব স্ট্রিং একটি তালিকা থাকতে হবে একজনএইচ1,...,এইচ(-1)এইচআমিআমি=6এইচ3[একজনবিডিএফ] , যেখানে ⋅ এর অর্থ "যে কোনও চরিত্র"। তারপর প্রক্রিয়া -th ইনপুট স্ট্রিং গুলি :একজনবিডিএফগুলি

  1. 1 থেকে K এর মধ্যে প্রতিটি জন্য : আমি
    • ফরম স্ট্রিং মুছে ফেলার মাধ্যমে আমি থেকে -th চরিত্র গুলি গুলি'আমিগুলি
    • দেখুন । প্রতি STRING আইডি এখানে একটি মূল স্ট্রিং যে হয় সমান চিহ্নিত গুলি অবস্থানে, অথবা পৃথক আমি শুধুমাত্র। এটিকে স্ট্রিং এর জেয়ের জন্য ম্যাচ হিসাবে আউটপুট করুন । (আপনি সঠিক সদৃশ অগ্রাহ্য করতে চান, hashtables মান ধরনের একটি (STRING আইডি, মোছা চরিত্র) যুগল, যে আপনি ঐ যে একই চরিত্র আমরা শুধু থেকে মুছে ফেলা মুছে দেওয়া হয়েছে জন্য পরীক্ষা করতে পারেন, যাতে গুলি ।)এইচআমি[গুলি']গুলিআমিগুলিগুলি
    • ভবিষ্যতের প্রশ্নের ব্যবহারের জন্য H i তে প্রবেশ করান ।এইচআমি

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

সাইমন প্রিন্সের অন্তর্নিহিত উপস্থাপনা কৌশলটির অর্থ হ'ল প্রতিটি চরিত্রের "মুছে ফেলা" আসলে সম্পাদিত হয় না, তাই আমরা পারফরম্যান্স পেনাল্টি ছাড়াই স্ট্রিংয়ের স্বাভাবিক অ্যারে-ভিত্তিক উপস্থাপনাটি ব্যবহার করতে পারি (লিঙ্কযুক্ত তালিকাগুলির পরিবর্তে যা আমি মূলত বলেছিলাম)।


2
সুন্দর সমাধান। একটি উপযুক্ত বেসপোক হ্যাশ ফাংশনের উদাহরণ বহুত্বপূর্ণ হ্যাশ হবে।
ডিডাব্লু

ধন্যবাদ @ ডিডাব্লু আপনি "বহুবর্ষের হ্যাশ" বলতে কী বোঝাতে চেয়েছেন আপনি কি কিছুটা স্পষ্ট করে বলতে পারেন? শব্দটি গুগলিং আমাকে এমন কিছু পাইনি যা যথার্থ বলে মনে হয়েছিল। (দয়া করে আমার পোস্টে সরাসরি যদি তুমি চাও সম্পাদনা করতে দ্বিধা বোধ করবেন না।)
j_random_hacker

1
কেবল স্ট্রিংটি বেস সংখ্যার মডুলো পি হিসাবে পড়ুন , যেখানে পি আপনার হ্যাশম্যাপের আকারের চেয়ে কিছুটা কম, এবং q পি এর একটি আদিম মূল এবং Q বর্ণমালার আকারের চেয়ে বেশি। একে "বহুভুজ হ্যাশ" বলা হয় কারণ এটি বহুপদী মূল্যায়নের মতো যার গুণাগুণগুলি q তে স্ট্রিং দ্বারা দেওয়া হয় । ( কে ) সময়ে সমস্ত কাঙ্ক্ষিত হ্যাশগুলি কীভাবে গণনা করা যায় তা নির্ধারণ করার জন্য আমি এটি অনুশীলন হিসাবে রেখে দেব । মনে রাখবেন যে, এই পদ্ধতির একটি প্রতিদ্বন্দ্বী অনাক্রম্য নয় যদি না আপনি এলোমেলোভাবে উভয় চয়ন পি , কুই আকাঙ্ক্ষিত অবস্থার পরিতৃপ্ত।কুইপিপিকুইপিকুইকুইহে()পি,কুই
ব্যবহারকারী 21820

1
আমি এই সমাধান আরও যে নিরীক্ষক মাত্র এক দ্বারা পরিশ্রুত করা যেতে পারে মনে হ্যাশ টেবিল চাহিদা কোনো এক সময়ে অস্তিত্ব, এইভাবে মেমরির প্রয়োজন কমে যায়।
মাইকেল কে

1
@ মিশেলকে: আপনি ( কে ) সময়ে স্ট্রিংয়ের সম্ভাব্য পরিবর্তনের হ্যাশগুলি গণনা করতে চাইলে এটি কাজ করবে না । আপনার এগুলি এখনও অন্য কোথাও সঞ্চয় করা দরকার। তাই আপনি যদি শুধুমাত্র একটি সময়ে এক অবস্থানে চেক আপনাকে নিতে হবে বার দীর্ঘ হিসাবে হিসাবে যদি আপনি সেই সমস্ত অবস্থানের একসঙ্গে পরীক্ষা ব্যবহার অনেক hashtable এন্ট্রি হিসাবে বার। হে()
ব্যবহারকারী 21820

2

বহুপদী-হ্যাশ পদ্ধতির চেয়ে এখানে আরও শক্তিশালী হ্যাশটেবল পদ্ধতি রয়েছে। প্রথম উৎপন্ন র্যান্ডম ধনাত্মক পূর্ণসংখ্যা r 1 .. যে hashtable মাপ coprime হয় এম । যথা, 0 r i < এম । তারপরে প্রতিটি স্ট্রিং x 1 .. k থেকে ( k i = 1 x i r i ) মোড এম । সেখানে প্রায় কিছুই শত্রু, খুব অমসৃণ দুর্ঘটনায় কারণ যেহেতু আপনি জেনারেট করতে পারেন R 1 .. রান-টাইম এবং তাই হিসাবে R1 ..এম0Rআমি<এমএক্স1 ..(Σআমি=1এক্সআমিRআমি)গেলিক ভাষারএমR1 ..স্বতন্ত্র স্ট্রিংগুলির যে কোনও নির্দিষ্ট জোড়ার সংঘর্ষের সর্বাধিক সম্ভাবনা বৃদ্ধি পায় তা দ্রুত তে চলে যায় । এটিও স্পষ্ট যে কীভাবে ( কে ) সময়ে প্রতিটি স্ট্রিংয়ের জন্য একটি অক্ষরের পরিবর্তিত সমস্ত সম্ভাব্য হ্যাশগুলি গণনা করা যায়।1/এমহে()

আপনি কি সত্যিই গ্যারান্টি অভিন্ন হ্যাশ করতে চান তাহলে, আপনি এক র্যান্ডম প্রাকৃতিক সংখ্যা তৈরি করতে পারেন কম এম প্রতিটি জোড়া জন্য ( আমি , ) জন্য আমি থেকে 1 থেকে k এবং প্রতিটি অক্ষরের জন্য , এবং তারপর প্রতিটি পংক্তি হ্যাশ x 1 .. k থেকে ( k i = 1 r ( i , x i ) ) মোড এমR(আমি,)এম(আমি,)আমি1এক্স1 ..(Σআমি=1R(আমি,এক্সআমি))গেলিক ভাষারএম। তারপরে স্বতন্ত্র স্ট্রিংগুলির যে কোনও প্রদত্ত যুগলের সংঘর্ষের সম্ভাবনা হুবহু । আপনার বর্ণচিহ্ন সেটটি এন এর তুলনায় তুলনামূলকভাবে ছোট হলে এই পদ্ধতিটি আরও ভাল ।1/এমএন


2

এখানে পোস্ট করা প্রচুর অ্যালগরিদম হ্যাশ টেবিলগুলিতে বেশ কিছুটা জায়গা ব্যবহার করে। এখানে একটি সহায়ক স্টোরেজ হে ( ( এন এলজি এন ) কে 2 ) রানটাইম সরল অ্যালগরিদম।হে(1)হে((এনএলজিএন)2)

কৌতুক ব্যবহার করা , যা দুটি মানের মধ্যে একটি comparator হয় একটি এবং যে আয় যদি সত্য হয় একটি < (lexicographically) যখন উপেক্ষা ম অক্ষর। তারপরে অ্যালগরিদম নিম্নরূপ।সি(একটি,)একটিএকটি<

প্রথমে স্ট্রিংগুলি নিয়মিত বাছাই করুন এবং কোনও সদৃশ অপসারণ করতে একটি লিনিয়ার স্ক্যান করুন।

তারপরে, প্রতিটি :

  1. তুলনামূলক হিসাবে দিয়ে স্ট্রিংগুলি সাজান ।সি

  2. স্ট্রিংগুলি যা কেবলমাত্র পৃথক হয় এখন সংলগ্ন এবং লিনিয়ার স্ক্যানে সনাক্ত করা যায়।


1

দৈর্ঘ্যের দুটি স্ট্রিং , এক চরিত্র ভিন্ন, দৈর্ঘ্য একটি উপসর্গ ভাগ এবং দৈর্ঘ্য একটি প্রত্যয় মি যেমন যে ট = ঠ + M + 1 টি

সাইমন Prins দ্বারা উত্তর সংরক্ষণকারী সব উপসর্গ / প্রত্যয় সমন্বয় স্পষ্টভাবে, অর্থাত্ এই এনকোড abcহয়ে *bc, a*cএবং ab*। এটি কে = 3, এল = 0,1,2 এবং মি = 2,1,0।

ভ্যালারমোরগুলিস যেমন উল্লেখ করেছে, আপনি একটি উপসর্গ গাছে শব্দগুলি সংগঠিত করতে পারেন। খুব অনুরূপ প্রত্যয় গাছও আছে। প্রতিটি উপসর্গ বা প্রত্যয়ের নীচে পাতার নোডের সংখ্যা সহ গাছকে বৃদ্ধি করা মোটামুটি সহজ; নতুন শব্দ সন্নিবেশ করার সময় এটি ও (কে) এ আপডেট করা যেতে পারে।

আপনি এই ভাইবোন গণনাগুলি যে কারণে চান তা হ'ল তাই আপনি জানেন যে একটি নতুন শব্দ দেওয়া হয়েছে, আপনি একই উপসর্গের সাথে সমস্ত স্ট্রিং গণনা করতে চান বা একই প্রত্যয় সহ সমস্ত স্ট্রিংগুলি গণনা করতে চান কিনা। উদাহরণস্বরূপ "abc" এর ইনপুট হিসাবে, সম্ভাব্য উপসর্গগুলি হ'ল "", "ক" এবং "আব", যখন সংশ্লিষ্ট প্রত্যয়গুলি "বিসি", "সি" এবং ""। যেমনটি স্পষ্ট, সংক্ষিপ্ত প্রত্যয়গুলির জন্য উপসর্গ গাছে ভাইবোনদের গণনা করা আরও ভাল এবং তদ্বিপরীত।

@ আইনপোকলুম যেমন উল্লেখ করেছেন, অবশ্যই অবশ্যই সম্ভব যে সমস্ত স্ট্রিং একই কে / 2 উপসর্গ ভাগ করে । এই পদ্ধতির জন্য এটি কোনও সমস্যা নয়; প্রিফিক্স গাছটি প্রতিটি নোডের সাথে কে / 2 অবধি গভীরতার কে / 2 অবধি রৈখিক হবে 100.000 পাতার নোডের পূর্বপুরুষ। ফলস্বরূপ, প্রত্যয় গাছটি (কে / ২-১) গভীরতা অবধি ব্যবহার করা হবে, এটি ভাল কারণ তারা উপসর্গ ভাগ করে দেওয়ার কারণে তাদের প্রত্যয়গুলিতে স্ট্রিংগুলি পৃথক করতে হয়।

[সম্পাদনা] একটি অপ্টিমাইজেশন হিসাবে, একবার আপনি একটি স্ট্রিংয়ের সবচেয়ে স্বল্পতম অনন্য উপসর্গটি নির্ধারণ করে নিলে আপনি জানেন যে আলাদা আলাদা চরিত্রের উপস্থিতি থাকলে এটি অবশ্যই উপসর্গের শেষ চরিত্র হতে হবে এবং আপনি যখন নিকট-সদৃশটি খুঁজে পেয়েছিলেন একটি সংক্ষিপ্ত ছিল একটি উপসর্গ পরীক্ষা করা। সুতরাং যদি "abcde" এর একটি সংক্ষিপ্ততম অনন্য উপসর্গ "abc" থাকে, তার মানে এমন অন্যান্য স্ট্রিং রয়েছে যা "ab" দিয়ে শুরু হয়? তবে "এবিসি" দিয়ে নয়। উদাহরণস্বরূপ, যদি তারা কেবল একটি চরিত্রের মধ্যে পৃথক হন, তবে এটি তৃতীয় চরিত্র। আপনার আর "abc? E" পরীক্ষা করার দরকার নেই।

একই যুক্তি অনুসারে, যদি আপনি খুঁজে পান যে "সিডি" একটি স্বল্পতম প্রত্যয়, তবে আপনি জানেন যে আপনাকে কেবল দৈর্ঘ্য -2 "আব" উপসর্গটি পরীক্ষা করতে হবে, দৈর্ঘ্য 1 বা 3 উপসর্গ নয় not

নোট করুন যে এই পদ্ধতিটি কেবলমাত্র একটি চরিত্রের পার্থক্যের জন্য কাজ করে এবং এটি 2 চরিত্রের পার্থক্যে সাধারণীকরণ করে না, এটি একটি চরিত্রকে অভিন্ন উপসর্গ এবং অভিন্ন প্রত্যয়গুলির মধ্যে বিভাজনকে নির্ভর করে।


আপনি ইঙ্গিত করা হয় প্রতিটি স্ট্রিং এর জন্য এবং প্রতিটি 1 আমি k , আমরা নোড খুঁজে পি [ গুলি 1 , ... , গুলি আমি - 1 ] length- সংশ্লিষ্ট ( আমি - 1 ) উপসর্গ trie বিভিন্ন প্রেফিক্স ও নোড এস [ এস আই + 1 , , এস কে ] দৈর্ঘ্যের সাথে সম্পর্কিত- ( কে - আই - 1 )গুলি1আমিপি[গুলি1,...,গুলিআমি-1](আমি-1)এস[গুলিআমি+ +1,...,গুলি](-আমি-1)প্রত্যয় ত্রিকায় প্রত্যয় (প্রতিটি মোড়িত সময় নেয় ), এবং প্রত্যেকের বংশধরের সংখ্যা তুলনা করুন, যার মধ্যে কম বংশধর রয়েছে তা বেছে নিন এবং তারপরে সেই ট্রাইয়ের বাকী স্ট্রিংয়ের জন্য "অনুসন্ধানী" থাকবেন? হে(1)
j_random_hacker

1
আপনার পদ্ধতির চলমান সময়টি কী? এটি দেখতে চতুর্দিকে সবচেয়ে খারাপ অবস্থার মতো মনে হচ্ছে: প্রতিটি স্ট্রিং একই অক্ষর দিয়ে শুরু হয়ে শেষ হয়ে গেলে কী ঘটে তা বিবেচনা করুন । /4
ডিডাব্লু

অপ্টিমাইজেশন ধারণাটি চতুর এবং আকর্ষণীয়। আপনি কি Mtache চেক করার কোনও বিশেষ উপায় মনে রেখেছিলেন? যদি "abcde" এর সংক্ষিপ্ততম অনন্য উপসর্গ "abc" থাকে, তার অর্থ আমাদের "ab? De" ফর্মটির অন্য কোনও স্ট্রিংটি পরীক্ষা করা উচিত। এটি করার কোনও বিশেষ উপায় কী আপনার মনে আছে? ফলে চলমান সময় কি?
DW

@ ডাব্লুডাব্লু: ধারণাটি "আব? ডি" আকারে স্ট্রিংগুলি খুঁজে পেতে আপনি উপসর্গের গাছটি পরীক্ষা করে দেখুন যে "আব" এর নীচে কতগুলি পাতার নোড রয়েছে এবং প্রত্যয় গাছে "ডি" এর অধীনে কতগুলি নোড রয়েছে, তারপরে বেছে নিন দুজনের মধ্যে সবচেয়ে ছোটটি গণনা করা। যখন সমস্ত স্ট্রিং একই কে / 4 টি অক্ষর দিয়ে শুরু হয় এবং শেষ হয়; এর অর্থ উভয় গাছের প্রথম কে / 4 নোডের প্রতিটি একটি করে সন্তান রয়েছে। এবং হ্যাঁ, প্রতিবার যখন আপনার এই গাছগুলির প্রয়োজন হবে তখন সেগুলি ট্র্যাশ করতে হবে যা একটি ও (এন * কে) পদক্ষেপ।
MSalters

ফর্ম উপসর্গ Trie, এটা, "AB" জন্য নোড পেতে তারপর তার সন্তানদের প্রত্যেকের জন্য যথেষ্ট মধ্যে "AB? দে 'একটি স্ট্রিং পরীক্ষা করার জন্য চেক পথ" ডি "নীচে বিদ্যমান কিনা বনাম । এটি হ'ল এই সাবট্রিজগুলিতে অন্য কোনও নোডের গণনা করবেন না। এটি O ( a h ) সময় নেয় , যেখানে a বর্ণমালার আকার এবং h টি ট্রাইয়ের প্রাথমিক নোডের উচ্চতা। h হল ( কে ) , সুতরাং যদি বর্ণমালার আকার ( এন ) হয় তবে এটি অবশ্যই ( এন কে ) হয়বনামবনামহে(একটি)একটিহে()হে(এন)হে(এন)সামগ্রিকভাবে সময়, তবে ছোট বর্ণমালা সাধারণ। বাচ্চাদের সংখ্যা (বংশধর নয়) পাশাপাশি উচ্চতাও গুরুত্বপূর্ণ।
j_random_hacker

1

বালতিতে স্ট্রিংগুলি সংরক্ষণ করা ভাল উপায় (এটি ইতিমধ্যে আলাদা আলাদা উত্তর রয়েছে))

একটি বিকল্প সমাধান একটি বাছাই তালিকায় স্ট্রিং সংরক্ষণ করা হতে পারে । কৌশলটি হ'ল স্থানীয়ভাবে সংবেদনশীল হ্যাশিং অ্যালগরিদম অনুসারে বাছাই করা । এটি একটি হ্যাশ অ্যালগরিদম যা ইনপুট অনুরূপ হয় [1] একইরকম ফলাফল দেয়।

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

স্থানীয় সম্ভাব্য সংবেদনশীল হ্যাশিং অ্যালগরিদম হ'ল নীলিমসা (ওপেন সোর্স বাস্তবায়নের সাথে পাইথনের উদাহরণ হিসাবে উপলব্ধ ) available

[1]: নোট করুন যে প্রায়শই SHA1 এর মতো হ্যাশ অ্যালগরিদমগুলি বিপরীতে নকশাকৃত: একই রকমের জন্য ব্যতিক্রমী হ্যাশগুলি উত্পাদন করে তবে সমান ইনপুট নয় has

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


1
আকর্ষণীয় ধারণা, তবে আমি মনে করি যে দুটি হ্যাশ মানগুলি কতটা পৃথক হতে পারে সে সম্পর্কে আমাদের কিছু সীমাবদ্ধতা থাকা দরকার যখন তাদের ইনপুটগুলি কেবলমাত্র 1 টি চরিত্রের দ্বারা পৃথক হয় - তারপরে কেবল প্রতিবেশীদের পরিবর্তে হ্যাশ মানগুলির এই পরিসরের মধ্যে সমস্ত কিছু স্ক্যান করে। (একটি অক্ষর দ্বারা পৃথক সমস্ত সম্ভাব্য জোড় স্ট্রিংয়ের জন্য সংলগ্ন হ্যাশ মান তৈরি করে এমন একটি হ্যাশ ফাংশন থাকা অসম্ভব । বাইনারি বর্ণমালায় দৈর্ঘ্য -2 স্ট্রিং বিবেচনা করুন: 00, 01, 10 এবং 11 যদি h (00) হয় তবে এইচ (10) এবং এইচ (01) উভয়ের সংলগ্ন তারপর এটি অবশ্যই তাদের মধ্যে হওয়া উচিত,
এক্ষেত্রে

প্রতিবেশীদের দিকে তাকানো যথেষ্ট নয়। তালিকাটি abcd, acef, agcd বিবেচনা করুন। এখানে একটি মিলে যাওয়া জুড়ি রয়েছে, তবে আপনার পদ্ধতিটি এটি খুঁজে পাবে না, কারণ এবিসিডি এটিসিডির প্রতিবেশী নয়।
ডিডাব্লু

আপনি দুজনেই ঠিক বলেছেন! প্রতিবেশীদের সাথে আমি কেবল "প্রত্যক্ষ প্রতিবেশী" বোঝাইনি তবে কাছের অবস্থানগুলির "একটি প্রতিবেশী" ভেবেছিলাম। আমি হ্যাশ অ্যালগরিদমের উপর নির্ভরশীল যেহেতু কতগুলি প্রতিবেশীর দিকে নজর দেওয়া দরকার তা আমি নির্দিষ্ট করেছিলাম না। তবে আপনি ঠিক বলেছেন, আমার উত্তরটিতে আমার সম্ভবত এটি নোট করা উচিত। ধন্যবাদ :)
টেসি

1
"এলএসএইচ ... অনুরূপ আইটেমগুলি উচ্চ সম্ভাবনার সাথে একই" বালতিগুলিতে "ম্যাপ করে" - যেহেতু এটি সম্ভাব্যতা অ্যালগরিদম, ফলাফল গ্যারান্টিযুক্ত নয়। সুতরাং এটি টিএসের উপর নির্ভর করে যে তার 100% সমাধান প্রয়োজন বা 99.9% যথেষ্ট কিনা।
বুলাত

1

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

  1. একসাথে জড়িত সমস্ত স্ট্রিংগুলির বর্ধিত প্রত্যয় অ্যারে তৈরি করুন । যাক এক্স = এক্স 1এক্স 2এক্স 3x n যেখানে x i , 1 i n সংগ্রহের একটি স্ট্রিং। এক্সের জন্য প্রত্যয় অ্যারে এবং এলসিপি অ্যারে তৈরি করুন ।এনএক্স=এক্স1এক্স2এক্স3এক্সএনএক্সআমি,1আমিএনএক্স

  2. এখন প্রতিটি শূন্য-ভিত্তিক সূচকে অবস্থানে ( i - 1 ) কে থেকে শুরু হয়। প্রতিটি স্ট্রিং এর জন্য x আমি , স্ট্রিং এর সাথে LCP নেওয়া এক্স যেমন যে < আমি । এলসিপি যদি এক্স এর শেষের বাইরে চলে যায় তবে x i = x j । অন্যথায়, এখানে একটি অমিল আছে ( x i [ p ] x j [ p ] বলুনএক্সআমি(আমি-1)এক্সআমিএক্স<আমিএক্সএক্সআমি=এক্সএক্সআমি[পি]এক্স[পি]); এক্ষেত্রে অমিলের পরে সংশ্লিষ্ট অবস্থানগুলি থেকে শুরু করে আরেকটি এলসিপি নিন। যদি দ্বিতীয় এলসিপিটি এর শেষের বাইরে চলে যায় তবে x i এবং x j কেবল একটি অক্ষর দ্বারা পৃথক হয়; অন্যথায় একাধিক মিল নেই।এক্সএক্সআমিএক্স

    for (i=2; i<= n; ++i){
        i_pos = (i-1)k;
        for (j=1; j < i; ++j){
            j_pos = (j-1)k;
            lcp_len = LCP (i_pos, j_pos);
            if (lcp_len < k) { // mismatch
                if (lcp_len == k-1) { // mismatch at the last position
                // Output the pair (i, j)
                }
                else {
                  second_lcp_len = LCP (i_pos+lcp_len+1, j_pos+lcp_len+1);
                  if (lcp_len+second_lcp_len>=k-1) { // second lcp goes beyond
                    // Output the pair(i, j)
                  }
                }
            }
        }
    }
    

সংক্ষেপিত আকারে প্রত্যয় অ্যারে তৈরি করতে এবং LCP প্রশ্নের উত্তর দিতে আপনি এসডিএসএল লাইব্রেরি ব্যবহার করতে পারেন ।

বিশ্লেষণ: বর্ধিত প্রত্যয় অ্যারে তৈরি করা এর দৈর্ঘ্যে লম্বাঅর্থাৎ হে ( এন কে ) । প্রতিটি এলসিপি ক্যোয়ারিতে ধ্রুবক সময় লাগে। সুতরাং, সময় অনুসন্ধান করা হয় হে ( 2 )এক্সহে(এন)হে(এন2)

জেনারালাইজেশন: এই পদ্ধতির একাধিক অমিলের ক্ষেত্রেও সাধারণীকরণ করা যায়। সাধারণভাবে চলমান সময় হ'ল যেখানে q অনুমোদিত মিলের মিল নয়।হে(এন+ +কুইএন2)কুই

আপনি যদি সংগ্রহ থেকে কোনও স্ট্রিং সরিয়ে ফেলতে চান তবে প্রতিটি পরীক্ষা না করে আপনি কেবল 'বৈধ' জেয়ের একটি তালিকা রাখতে পারেন ।<আমি


আমি কি বলতে পারি যে আলগো তুচ্ছ - কেবল প্রতিটি স্ট্রিং জুটির তুলনা করুন এবং ম্যাচের সংখ্যা গণনা করুন? এবং এই সূত্রে ব্যবহারিকভাবে বাদ দেওয়া যেতে পারে, যেহেতু এসএসইর মাধ্যমে আপনি 16 টি চিহ্নে 2 সিপিইউ চক্রের সাথে ম্যাচিং বাইটগুলি গণনা করতে পারেন (অর্থাত্ কে = 40 এর জন্য 6 চক্র)। হে(এন2)k
বুলাত

ক্ষমা চেয়ে নিলাম তবে আমি আপনার প্রশ্নটি বুঝতে পারি নি understand উপরের পদ্ধতিরটি এবং ( কে এন 2 ) নয় । এছাড়াও, এটি কার্যত বর্ণমালা আকারে স্বাধীন। এটি হ্যাশ-টেবিল পদ্ধতির সাথে একযোগে ব্যবহার করা যেতে পারে - একবার দুটি স্ট্রিং একই হ্যাশ পাওয়া যায়, ( 1 ) সময়ে যদি তারা একক মিল না পেয়ে থাকে তবে তাদের পরীক্ষা করা যেতে পারে । O(nk+n2)O(kn2)O(1)
ituতু কুন্ডু

আমার বক্তব্যটি হল যে প্রশ্নোত্তর লেখকের জন্য কে = 20..40 এবং এই জাতীয় ছোট স্ট্রিংগুলির তুলনা করতে কেবল কয়েকটি সিপিইউ চক্রের প্রয়োজন হয়, তাই জন্তু শক্তি এবং আপনার পদ্ধতির মধ্যে ব্যবহারিক পার্থক্য সম্ভবত উপস্থিত নেই।
বুলাত

1

প্রস্তাবিত সমস্ত সমাধানগুলির মধ্যে একটি উন্নতি। এগুলির জন্য সবচেয়ে খারাপ ক্ষেত্রে মেমরির প্রয়োজন। আপনার সাথে কম্পিউটিং স্ট্রিং হ্যাশ দ্বারা এটি কমাতে পারে পরিবর্তে প্রতিটি অক্ষর, অর্থাত্ , ... এবং প্রতিটি পাস এ প্রক্রিয়া শুধুমাত্র নির্দিষ্ট পূর্ণসংখ্যা সীমার মধ্যে হ্যাশ মান রূপগুলো। প্রথম পাসে এমনকি হ্যাশ মান সহ দ্বিতীয় এবং অন্যটিতে বিজোড় হ্যাশ মান রয়েছে Feহে(এন)**bcdea*cde

আপনি একাধিক সিপিইউ / জিপিইউ কোরের মধ্যে কাজটি বিভক্ত করতে এই পদ্ধতিটি ব্যবহার করতে পারেন।


এন=100,00040হে(এন)

0

এটি @ সিমোনপ্রিন্সের হ্যাশগুলিতে জড়িত না জবাবের একটি সংক্ষিপ্ত সংস্করণ।

ধরে নিচ্ছি আপনার স্ট্রিংগুলির মধ্যে কোনওটি একটি নক্ষত্রকে ধারণ করে না:

  1. এনহে(এন2)
  2. হে(এন2লগএন)
  3. হে(এন2)

পাইথনে হ্যাশগুলির অন্তর্নিহিত ব্যবহার সহ একটি বিকল্প সমাধান (সৌন্দর্যের প্রতিরোধ করতে পারে না):

def has_almost_repeats(strings,k):
    variations = [s[:i-1]+'*'+s[i+1:] for s in strings for i in range(k)]
    return len(set(variations))==k*len(strings)

হে(এন)

হে(এন2)

0

এখানে আমার 2+ অমিলের সন্ধানকারীকে গ্রহণ করব। নোট করুন যে এই পোস্টে আমি প্রতিটি স্ট্রিংকে বিজ্ঞপ্তি হিসাবে বিবেচনা করি, সূচীতে দৈর্ঘ্য 2 এর ফে স্ট্রিংয়ের পরে k-1প্রতীক থাকে । এবং সূচক 2 দৈর্ঘ্যের সাবস্ট্রিং একই!str[k-1]str[0]-1

Mkmlen(k,M)=k/M1Mk=20M=4abcd*efgh*ijkl*mnop*

এখন, Mচিহ্নগুলির স্ট্রিংগুলির মধ্যে kচিহ্নগুলি পর্যন্ত সমস্ত মেলে না সম্পর্কিত অনুসন্ধানের জন্য অ্যালগরিদম :

  • প্রতিটি আমি 0 থেকে কে -1
    • সমস্ত স্ট্রিংগুলিকে গ্রুপে বিভক্ত করুন str[i..i+L-1], কোথায় L = mlen(k,M)। তবে যদি L=4আপনার 4 টি চিহ্নের বর্ণমালা থাকে (ডিএনএ থেকে), এটি 256 টি গ্রুপ তৈরি করবে।
    • 100 ডলারের চেয়ে কম স্ট্রিং গ্রুপগুলি ব্রুট-ফোর্স অ্যালগোরিদম দিয়ে চেক করা যায়
    • বৃহত্তর গ্রুপগুলির জন্য, আমাদের গৌণ বিভাগ করা উচিত:
      • Lআমরা ইতিমধ্যে মিলেছে এমন গ্রুপ প্রতীকগুলির প্রতিটি স্ট্রিং থেকে সরান
      • আই-এল + 1 থেকে কেএল -1 পর্যন্ত প্রতিটি জে
        • সমস্ত স্ট্রিংগুলিকে গ্রুপে বিভক্ত করুন str[i..i+L1-1], কোথায় L1 = mlen(k-L,M)। Fe if k=20, M=4, alphabet of 4 symbols, so L=4এবং L1=3, এটি 64 টি গ্রুপ তৈরি করবে।
        • বাকীটি পাঠকের অনুশীলন হিসাবে রেখে গেছে: ডি

কেন আমরা j0 থেকে শুরু করি না ? কারণ আমরা ইতিমধ্যে একই গোষ্ঠীগুলির সাথে এই গোষ্ঠীগুলি তৈরি করেছি i, সুতরাং j<=i-Lআমার সাথে জব আই এবং জে মানগুলি অদলবদলের সাথে কাজের সমান হবে।

আরও অনুকূলিতকরণ:

  • প্রতিটি পজিশনে স্ট্রিংগুলিও বিবেচনা করুন str[i..i+L-2] & str[i+L]। এটি কেবল তৈরি কাজের দ্বিগুণ করে তবে L1 টি বাড়িয়ে দেয় (যদি আমার গণিতটি সঠিক হয়)। সুতরাং, 256 টি গোষ্ঠীর পরিবর্তে, আপনি 1024 গ্রুপে ডেটা বিভক্ত করবেন।
  • L[i]*0..k-1M-1k-1

0

অ্যালগোস উদ্ভাবন ও অনুকূলকরণের জন্য আমি প্রতিদিন কাজ করি, সুতরাং আপনার যদি প্রতিটি শেষ বিট পারফরম্যান্সের প্রয়োজন হয় তবে তা এই পরিকল্পনা:

  • সাথে যোগাযোগ করুন *স্বাধীনভাবে প্রতিটি অবস্থানে, অর্থাত্ পরিবর্তে একক কাজ প্রক্রিয়াকরণ n*kSTRING ভিন্ন রূপ - শুরু kস্বাধীন কাজ প্রতিটি পরীক্ষণ nস্ট্রিং। আপনি kএকাধিক সিপিইউ / জিপিইউ কোরের মধ্যে এই কাজগুলি ছড়িয়ে দিতে পারেন । এটি বিশেষত গুরুত্বপূর্ণ যদি আপনি 2+ চর ডিফগুলি পরীক্ষা করতে যাচ্ছেন। ক্ষুদ্রতর কাজের আকার ক্যাশে লোকেশনেও উন্নতি সাধন করবে, যা নিজেই প্রোগ্রামটিকে 10x দ্রুত তৈরি করতে পারে।
  • আপনি যদি হ্যাশ টেবিল ব্যবহার করতে চলেছেন, রৈখিক অনুসন্ধান এবং ~ 50% লোড ফ্যাক্টর নিয়োগ করে আপনার নিজস্ব বাস্তবায়ন ব্যবহার করুন। এটি কার্যকর এবং দ্রুত কার্যকর করা সহজ। অথবা উন্মুক্ত ঠিকানা সহ একটি বিদ্যমান বাস্তবায়ন ব্যবহার করুন। পৃথক চেইন ব্যবহারের কারণে এসটিএল হ্যাশ টেবিলগুলি ধীরে ধীরে।
  • @ অ্যালেক্সারিনোল্ডস দ্বারা প্রস্তাবিত হিসাবে আপনি 3-স্টেট ব্লুম ফিল্টার (0/1/1 + উপস্থিতিগুলি পৃথক করে) ব্যবহার করে ডেটা প্রিফিল্টার করার চেষ্টা করতে পারেন।
  • ০ থেকে কে -১ পর্যন্ত প্রত্যেকের জন্য নিম্নলিখিত কাজটি চালান:
    • প্রতিটি স্ট্রিংয়ের 4-5 বাইট হ্যাশ ( *আই-থ্রি অবস্থানে) এবং স্ট্রিং সূচকযুক্ত 8-বাইট স্ট্রাক্ট তৈরি করুন এবং তারপরে সেগুলি বাছাই করুন বা এই রেকর্ডগুলি থেকে হ্যাশ টেবিল তৈরি করুন।

বাছাইয়ের জন্য, আপনি নিম্নলিখিত কম্বো চেষ্টা করতে পারেন:

  • প্রথম পাস নিযুক্ত 64-256 উপায়ে MSD র্যাডিক্স ধরণের TLB কৌতুক
  • দ্বিতীয় পাসটি এমএসডি রেডিক্সকে 256-1024 উপায় ডাব্লু / ও টিএলবি ট্রিক (মোট 64K উপায়)
  • তৃতীয় পাসটি হ'ল সন্নিবেশ বাছাই করা বাকি অসঙ্গতিগুলি ঠিক করতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.