簡體   English   中英

算法搜索substring的區別

[英]Algorithm searching substring difference

我在任務中有一個大問題:在 O(1) 時間內找到 substring 的任何 hash


長度=n的輸入字符串的Hash按公式計算:

h(S) = ( s(1)*a^(n-1) + s(2)*a^(n-2)+...+s(n-1)a+s(n) )% R,其中 's' 是 ASCII 碼。

1)我在字符串中找到所有前綴 hash

2)我嘗試通過公式得到 substring 的 hash :

h(RL) = (h(R) - h(L-1))*a^(R-L+1) 例如 string = 'abcdefgh',substing 是 'd'。 a = 1000,R = 1000009;

我在 java 中的代碼:

import java.io.IOException;
import java.math.BigInteger;

public class PrefixHashFAILED {

    public static long[] hashes;

    public static void main(String[] args) throws IOException {

        int a = 1000;
        int modul = 1000009;
        char[] data = "abcdefgh".toCharArray();
        hashes = new long[data.length];

        long res = 0L;
        for( int i = 0 ; i < data.length ; i ++){
            res = ((res*a)%modul +  data[i]%modul)%modul;
            hashes[i] = res;
        }
         System.out.println(getHash(3,3,a,modul));
   }

    private static long getHash(int start, int end , int a, int  m) {
        long x = (hashes[end] - hashes[start-1]+m)%m;
        long z = BigInteger.valueOf(a).pow(end - start + 1  ).mod(BigInteger.valueOf(m)).intValue();
        return (x*z)%m ;
    }
}

在 function getHash 我試圖得到 hash 的 substring 'd'。 正確答案是 100,但我得到 999857。幫幫我,錯誤在哪里?

結果是

(hashes[end] - hashes[start-1] * z % m + m) % m

但不是

(hashes[end] - hashes[start-1] + m) % m * z % m

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM