0

我的代码正确计算了间隔的起始位置,但没有计算结束位置:

    int left;
    int bot = 0; int top = textLength;

    while(bot != top)
    {
        int mid = (bot+top)/2;

        if(pattern.compareTo(text.substring(suffixArray.get(mid))) > 0) bot = mid + 1;
        else top = mid;
    }

    left = bot;



    int right;
    bot = left; top = textLength;

    while(bot != top)
    {
        int mid = (bot+top)/2;

        if(pattern.compareTo(text.substring(suffixArray.get(mid))) < 0) top = mid;
        else bot = mid+1;
    }

    right = bot;

我将它与互联网上的几个伪代码进行了比较,我真的不明白为什么它不起作用。我错过了什么?

4

1 回答 1

1

搜索的right不同之处仅在于>=而不是>

    if(pattern.compareTo(text.substring(suffixArray.get(mid))) >= 0) bot = mid + 1;
    else top = mid;

所以我会认为

right = bot;

指向下一个更高的值。

所以最好先检查所有是否都已订购:

String old = text.substring(suffixArray.get(0));
for (int i = 1; i < textLength; ++i) {
    String next = text.substring(suffixArray.get(i));
    if (old.compareTo(next) >= 0) {
        System.err.printf("Wrong order at [%d] '%s' >= [%d] '%s'%n",
            i - 1, old, i, next);
    }
    old = next;
}
于 2014-12-10T15:47:23.917 回答