สำหรับความซับซ้อนของเวลา / พื้นที่ O (n) เคล็ดลับคือการประเมินค่าแฮชสำหรับแต่ละลำดับ พิจารณาอาร์เรย์b
:
[b1 b2 b3 ... bn]
ด้วยวิธีการของ Hornerคุณสามารถประเมินค่าแฮชที่เป็นไปได้ทั้งหมดสำหรับแต่ละลำดับ เลือกค่าฐาน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
โปรดทราบว่าคุณสามารถประเมินแต่ละลำดับในเวลา O (1) โดยใช้ผลลัพธ์ของลำดับก่อนหน้าดังนั้นงานทั้งหมด O (n)
ตอนนี้คุณมีอาร์เรย์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)
คุณต้องทราบว่าเมื่อคุณก้าวจากลำดับหนึ่งไปอีกลำดับหนึ่งคุณคูณลำดับก่อนหน้าทั้งหมดด้วย B และเพิ่มค่าใหม่คูณด้วย B ตัวอย่างเช่น
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
ทีนี้คุณสามารถเปรียบเทียบค่าHa[d] == Hb[d]
ทั้งหมดd
จาก n เป็น 1 หากตรงกับที่คุณมีคำตอบ
ความสนใจ : นี่เป็นวิธีแฮชค่าอาจมีขนาดใหญ่และคุณอาจต้องใช้วิธีการยกกำลังอย่างรวดเร็วและการคำนวณแบบแยกส่วนซึ่งอาจทำให้คุณชนกันได้ (แทบจะ) ทำให้วิธีนี้ไม่ปลอดภัยอย่างสิ้นเชิง วิธีปฏิบัติที่ดีคือการเลือกฐาน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]
ใหม่ แต่ฉันไม่ทราบว่าวัตถุในอาเรย์นั้นตอบสนองได้หรือไม่สำหรับแฮชที่จะถูกคำนวณกับพวกมัน