【问题标题】:Java | compare char word in a char array爪哇 |比较字符数组中的字符字
【发布时间】:2011-03-17 12:55:30
【问题描述】:

如何获取可以在段落中找到的单个单词(表示在 char 数组中)的索引(再次表示在 char 数组中)。

char 代表单词

char word[] = new char[]{'w','o','r','d'};

这是段落

char para[] = new char[]{'f','g','q','z','y','i','o','p','w','o','r','d'};

在这种情况下,我想获得第 8 个字母的索引。我在排序单词时使用了二进制搜索。

谢谢。

【问题讨论】:

  • “期待一些帮助。”好的...呵呵
  • 做一个简单的逐字符测试怎么样?
  • 有什么限制?性能有问题吗?代码可维护性是个问题吗?开发成本有问题吗?是作业吗?还是您只是出于好奇而询问,实际上并不打算实施它?问题的限制在这里产生了巨大的不同。

标签: java char search


【解决方案1】:

理论上效率有点低,但比较实用简单:

int position = new String(paragraph).indexOf(new String(word));

如果您想了解这是如何工作的,请查看java.lang.Stringstatic int indexOf(..) 方法

【讨论】:

  • 如果char[] 不包含数千个字符,我认为这没有问题。
  • 是的,这就是我说“理论上”的原因。在实践中就足够了。
  • 我敢打赌,这将比他可以实现的任何东西都要快几个数量级。唯一的问题是字符串对于堆来说太大了。
  • @Aircule - 我认为它比这更复杂一些。例如,从char[] 创建String 需要复制char[]。此外,与String.indexOf()(可能)使用的朴素算法相比,有一些快速搜索算法在搜索大文本方面要好得多。
  • @Stephen 我非常怀疑String.indexOf() 使用的是朴素算法。我测试过了。
【解决方案2】:

在这种情况下,二分搜索对您没有帮助。你必须线性搜索。最简单的解决方案是线性搜索第一个字符,并在找到后检查剩余的单词是否跟在后面。

更复杂的解决方案是使用KMP algorithm

【讨论】:

  • 是的,二分查找的有序数组的前提条件完全破坏了信息。必须事先提取字符序列。
  • 我自己更喜欢Boyer-Moore。 KMP 只是......不直观。
【解决方案3】:

最简单的方法是尝试所有可能性,循环遍历每个起点并测试所有字符是否匹配。事实上,您已经提到了二分搜索,这可能很简单,您已经知道了,但如果您正在寻找,请告诉我。

如果您正在寻找最佳方法,请参阅http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

【讨论】:

  • “最佳”实际上可能不是正确的词;还有一些在某些情况下表现更好。但这是最常用的算法。
【解决方案4】:

您可以将字符数组转换为字符串。在字符串中搜索的结果与搜索数组的结果相同。

String needle = new String(word);
String haystack = new String(para);
int i = haystack.indexOf(needle);

结果:

8

这比简单的 O(n*m) 搜索要快得多,因为字符串函数 indexOf 已经过优化。

如果您想在不创建临时字符串的情况下执行此操作,您可以为字节数组实现 string searching algorithm。例如,您可以选择具有最坏情况 O(n) 的 Boyer-Moore 算法。

【讨论】:

  • 朴素的搜索算法实际上是O(n*m),但这看起来有点像家庭作业,所以他可能无法将其转换为String。
  • 只是好奇,O(n^2) 指的是什么?我从来没有在算法上看到过这个。
  • @Aircule:谢谢,抱歉,这是一个错误。 @James P.:en.wikipedia.org/wiki/Big_O_notation
  • 顺便说一句,我在 java 中实现了 Rabin-Karp 算法,它的性能非常糟糕,比朴素算法差得多。我猜这是散列。试试 Booyer-Moore。
  • @Mark 我实际上做了一个关于字符串匹配的非常广泛的项目,并且我测试了 RK 的几个散列函数,这两个函数都是增量计算散列的函数和 Java 的 .hashCode()。无论使用何种散列函数,RK 的性能都比朴素算法差很多。我们使用最长 600 个字符的模式和最长 35 MB 的输入文件对其进行了测试。
【解决方案5】:

快速回答,我想其他人会更详细。最初,我会做这样的事情(伪代码更适合思考算法):

boolean nonmatchingchar
integer i, j
for each i of word until endof word
    for each j of para until endof para
      if word i isnotequalto para i set nonmatchingchar true     
    end for
end for


if nonmatchingchar is true print "character sequence not found"

编辑:为了在您要搜索多个单词的情况下更有效,您可以构成一个二维数组,其中的单词根据其首字母排序。从那里开始,您可以逐字母遍历第二个数组,并根据该字母测试单词的子集。

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多