ও (এন) সময় / স্থান জটিলতার জন্য, কৌশলটি প্রতিটি অনুচ্ছেদের জন্য হ্যাশগুলি মূল্যায়ন করে। অ্যারে বিবেচনা করুন b
:
[b1 b2 b3 ... bn]
হর্নারের পদ্ধতিটি ব্যবহার করে , আপনি প্রতিটি অনুচ্ছেদের জন্য সম্ভাব্য সমস্ত হ্যাশ মূল্যায়ন করতে পারেন। একটি বেস মান বাছাই করুন B
(আপনার উভয় অ্যারে যে কোনও মানের চেয়ে বড়):
from b1 to b1 = b1 * B^1
from b1 to b2 = b1 * B^1 + b2 * B^2
from b1 to b3 = b1 * B^1 + b2 * B^2 + b3 * B^3
...
from b1 to bn = b1 * B^1 + b2 * B^2 + b3 * B^3 + ... + bn * B^n
নোট করুন যে আপনি পূর্ববর্তী ক্রমের ফলাফলটি ব্যবহার করে ও (1) সময়ে প্রতিটি ক্রম মূল্যায়ন করতে পারেন, সুতরাং সমস্ত কাজের জন্য ও (এন) ব্যয় হয়।
এখন আপনার কাছে একটি অ্যারে রয়েছে Hb = [h(b1), h(b2), ... , h(bn)]
, Hb[i]
হ্যাশটি এখনও b1
পর্যন্ত bi
।
অ্যারের জন্য একই জিনিস করুন a
, তবে একটি সামান্য কৌশল দ্বারা:
from an to an = (an * B^1)
from an-1 to an = (an-1 * B^1) + (an * B^2)
from an-2 to an = (an-2 * B^1) + (an-1 * B^2) + (an * B^3)
...
from a1 to an = (a1 * B^1) + (a2 * B^2) + (a3 * B^3) + ... + (an * B^n)
আপনাকে অবশ্যই লক্ষ্য রাখতে হবে যে, আপনি যখন এক ক্রম থেকে অন্য ক্রমটি চলে যান, আপনি পুরো পূর্বের ক্রমটি বি দ্বারা গুণন করে এবং বি দ্বারা গুণিত নতুন মান যুক্ত করেন উদাহরণস্বরূপ:
from an to an = (an * B^1)
for the next sequence, multiply the previous by B: (an * B^1) * B = (an * B^2)
now sum with the new value multiplied by B: (an-1 * B^1) + (an * B^2)
hence:
from an-1 to an = (an-1 * B^1) + (an * B^2)
এখন আপনার কাছে একটি অ্যারে রয়েছে Ha = [h(an), h(an-1), ... , h(a1)]
, Ha[i]
হ্যাশটি এখনও ai
পর্যন্ত an
।
এখন, আপনি n থেকে 1 পর্যন্ত Ha[d] == Hb[d]
সমস্ত d
মানের জন্য তুলনা করতে পারেন , যদি সেগুলি মেলে, আপনার কাছে আপনার উত্তর রয়েছে।
মনোযোগ : এটি একটি হ্যাশ পদ্ধতি, মানগুলি বড় হতে পারে এবং আপনাকে একটি দ্রুত ক্ষতিকারক পদ্ধতি এবং মডুলার গাণিতিকগুলি ব্যবহার করতে হতে পারে , যা আপনাকে (সংক্ষেপে) সংঘর্ষ দিতে পারে , এই পদ্ধতিটি সম্পূর্ণ নিরাপদ নয় making একটি ভাল অনুশীলন হ'ল একটি বেসকে B
সত্যিকারের বড় সংখ্যা হিসাবে বেছে নেওয়া (আপনার অ্যারেগুলির বৃহত্তম মানের চেয়ে কমপক্ষে বড়)। আপনার প্রতিটি স্তরে সংখ্যার সীমা অতিক্রম করতে পারে সেজন্য আপনারও যত্নবান হওয়া উচিত, সুতরাং আপনাকে K
প্রতিটি ক্রিয়াকলাপে ( মডুলো ) ব্যবহার K
করতে হবে (যেখানে প্রাইম বড় হতে পারে B
)।
এর অর্থ হ'ল দুটি ভিন্ন সিকোয়েন্সগুলিতে একই হ্যাশ থাকতে পারে তবে দুটি সমান ক্রমের সবসময় একই হ্যাশ থাকবে।
b[1] to b[d]
এবং তারপরে অ্যারেa
কম্পিউট হ্যাশ এ যানa[1] to a[d]
যদি এটি মেলে তবে এটি আপনার উত্তর, যদিa[2] to a[d+1]
হ্যাশকে গণনা করে পুনরায় ব্যবহারের জন্য গণনা হ্যাশ না হয়a[1] to a[d]
। তবে আমি জানি না যে অ্যারেতে থাকা বস্তুগুলি তাদের উপর ঘূর্ণায়মান হ্যাশের জন্য উপযুক্ত কিনা if