java - jdk中String类的indexOf方法是使用BF实现的,为什么不使用KMP或BM呢?

标签 java string indexof

jdk中String类的indexOf方法是使用BF实现的,为什么不使用KMP或BM呢? 下面是jdk如何实现这个功能。它使用BF来解决。为什么不使用更有效的方法,例如KMP、BM?

   static int indexOf(char[] source, int sourceOffset, int sourceCount,
                   char[] target, int targetOffset, int targetCount,
                   int fromIndex) {
        if (fromIndex >= sourceCount) {
            return (targetCount == 0 ? sourceCount : -1);
        }
        if (fromIndex < 0) {
            fromIndex = 0;
        }
        if (targetCount == 0) {
            return fromIndex;
        }

        char first  = target[targetOffset];
        int max = sourceOffset + (sourceCount - targetCount);

        for (int i = sourceOffset + fromIndex; i <= max; i++) {
            /* Look for first character. */
            if (source[i] != first) {
                 while (++i <= max && source[i] != first);
            }

            /* Found first character, now look at the rest of v2 */
            if (i <= max) {
                int j = i + 1;
                int end = j + targetCount - 1;
                for (int k = targetOffset + 1; j < end && source[j] ==
                     target[k]; j++, k++);

                if (j == end) {
                    /* Found whole string. */
                    return i - sourceOffset;
                }
            }
        }
        return -1;
   }

最佳答案

why not use a more efficientive method, such as KMP, BM ?

更先进的字符串搜索算法的设置时间并不简单。如果您正在进行一次涉及不太大目标字符串的字符串搜索,您会发现您在设置上花费的时间比在字符串搜索期间节省的时间还要多。

即使只是测试目标和搜索字符串的长度也无法给出是否“值得”使用高级算法的良好答案。从(例如)Boyer-Moore 获得的实际加速取决于字符串的值;即字符模式。

Java 实现者采取了务实的方法。他们无法保证高级算法能够提供更好的性能,无论是平均性能还是特定输入性能。因此,他们将其留给程序员来处理......在必要时。

<小时/>

FWIW,我不知道有任何其他主流编程语言在其运行时库的标准“字符串查找”功能中使用 BM 等。

关于java - jdk中String类的indexOf方法是使用BF实现的,为什么不使用KMP或BM呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23146845/

相关文章:

java - 如何在 postgresql 中使用 LO 数据类型?

java - 从 CSV 类型数据创建 map

替换字符串中的单词

javascript - 看似简单的 javascript 字符串构建

java - 检查字符串中的辅音

JavaScript 对象 indexOf,返回父位置?

java - 忽略大海捞针的换行符并保留文本位置

java - 如何在java中读取Servlet中的URL并打印

c# - 如何将可空字符串作为函数参数处理

java - JTable 删除或隐藏或禁用特定单元格?