当前位置: 首页 > 面试题库 >

为什么String.indexOf()不使用KMP?

罗奇文
2023-03-14
问题内容

我阅读的源代码,java.lang.String很惊讶地发现它String.indexof()不使用Knuth–Morris–Pratt算法?众所周知,KMP更有效。那么为什么不使用它String.indexOf()呢?

我周围的人告诉我,对于短字符串KMP来说已经足够了,但是如果您需要性能并且打算与大字符串一起使用,则不是一个好选择。但是他没有告诉我细节。

所以,这是我的问题:

  1. 为什么我们不使用KMP String.indexOf()
  2. 为什么KMP对于大字符串不是一个好选择?

问题答案:

KMP在最坏情况下具有更好的性能,但实际上需要进行一些前期计算(以生成偏移表)。这 需要一个初始的内存分配,这也可能会影响性能。

对于(大概)在较短字符串中进行搜索的常见用例,这实际上可能比原始实现要慢。

这与以下事实捆绑在一起:对于非常庞大的数据集,您可能将使用更专业的数据结构,而不是简单的String方法,这意味着增加的实现(可能还有运行时)成本不值得投资。

请注意,由于未指定实际算法,因此在将来的Java版本中这 可能会 更改。



 类似资料:
  • 问题内容: 为什么String.indexOf不使用异常,但是在找不到子字符串时返回-1? 这个问题的目的是:当我们启动自定义异常时。 相信避免返回特殊错误代码是正确的设计路径。 你怎么看? 问题答案: 根据经验,如果方法的目的是检查某物,那么缺少该物也不应该是例外。如果该方法假定某物为真,则缺少某物将是一个例外。因此,“ File.exists()”不会引发FileNotFoundExcepti

  • 这是我有生以来第一次发现自己正在编写一个开源的Java API。希望能被列入许多其他项目。 对于日志记录,我(以及与我一起工作的人)一直使用JUL(java.util.logging),从来没有遇到过任何问题。然而,现在我需要更详细地了解我应该为我的API开发做些什么。我对此做了一些研究,我得到的信息让我更加困惑。因此有了这篇文章。 因为我是从七月来的,所以我对此有偏见。我对其余的知识不是那么多。

  • 问题内容: 我想知道为什么当描述为char时indexOf方法的参数为int。 public int indexOf(int ch) http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#indexOf%28int%29 a]基本上,我感到困惑的是java中的int是32位,而unicode字符是16位。 b]

  • 问题内容: 据我所知,由于安全性,在JavaScript中使用JSON对象被认为是不好的做法。如果JSON来自其他服务器,我可以理解此问题。 但是,如果JSON是由我自己的服务器提供的,并且是使用PHP创建的(我们假设它不是越野车),那么简单地使用JS中的JSON读取是否合法,或者我目前无法想到任何安全问题? ? 我真的不想处理动态加载JSON解析器的问题,因此很高兴使用。 PS:很明显,我将使用

  • 我是一个新手,学习Javascript已经有一段时间了,唯一的目的是用它来编写硒自动化(最终的目的是李尔QA自动化)。 问题是,当谈到语言时,我完全感到困惑。我在Selenium文档和Scriptp示例中看到的都是类似“driver.FindElement”、“sendKeys”、“getTitle”等函数。 据我所知,(纯)Javascript不使用这些函数,而是使用“document.getE

  • eval 函数会在当前作用域中执行一段 JavaScript 代码字符串。 var foo = 1; function test() { var foo = 2; eval('foo = 3'); return foo; } test(); // 3 foo; // 1 但是 eval 只在被直接调用并且调用函数就是 eval 本身时,才在当前作用域中执行。 var fo