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
.
이제 n에서 1까지의 Ha[d] == Hb[d]
모든 d
값을 비교할 수 있습니다. 값이 일치하면 답이 있습니다.
주의 : 이것은 해시 방법이며, 값이 클 수 있으며 빠른 지수 방법과 모듈 식 산술 을 사용해야 할 수도 있습니다 .이 방법은 충돌을 거의 일으키지 않으므로 완전히 안전하지 않습니다. 좋은 방법은 기본 B
을 큰 소수 (적어도 배열에서 가장 큰 값보다 큼)로 선택하는 것입니다. 각 단계에서 숫자의 한계가 넘칠 수 있으므로주의해야합니다. 따라서 K
각 작업 (( K
보다 큰 소수 일 수 있음 )에서 (modulo ) 을 사용해야 B
합니다.
이것은 두 개의 다른 시퀀스 가 동일한 해시를 가질 수 있지만 두 개의 동일한 시퀀스는 항상 동일한 해시를 갖음을 의미합니다.
b[1] to b[d]
배열a
계산 해시 로 이동a[1] to a[d]
하십시오 . 그러나 배열의 객체가 롤링 해시를 계산할 수 있는지 여부는 알 수 없습니다.a[2] to a[d+1]
a[1] to a[d]