用于找到在多个句子中重复的三个最常见的字阵列的算法

时间:2016-10-20 13:40:24

标签: c# string algorithm performance string-comparison

我正在制定一些想法来制作一种能够在多个句子中找到3个最常用词的算法。那是什么意思?让我们看看下面的例子,假设我有3个句子如下:

true

该算法确定3个最常见的单词(彼此相邻)是:“Samsung galaxy S7”。

我的想法(我相信这是可以实施的最简单的一个)就是从第一句中取出前三个单词并从那开始。例如:

第一循环我得到了这三个词组合:新三星Galaxy  第二个循环我得到这3个单词组合(不包括句子中的第一个单词):三星galaxy S7 ......

因此,直到第一句(字符串)结束为止。

现在我的问题是:

  1. 这是我上面提到的一个好方法吗?
  2. 那里的算法可以做同样的事情,但是当时间因素出现问题时效率更高(即它们工作得更快)?
  3. 有人可以帮我解决这个问题吗?谢谢 ! :)

2 个答案:

答案 0 :(得分:0)

不,没有最快的方法,因为要找到字符串数组中最常见的三个单词,您必须扫描这些行以检查可能的匹配。
但是有一个改进:如果三个单词在字符串中是唯一的(每个句子只有一个Samsung Galaxy S7)并且你想要在找到第一个最常见单词的字符串时立即退出,你可以做出以下控制:

if(counter == array.length)
   return mostCommonWords

这是因为如果数组的所有字符串中都存在三个单词,则您知道其他单词组最多会有相同的计数器。但是,只有当每个句子的三个单词都是唯一的并且您希望获得第一个最常见的出现时,此控件才有效

答案 1 :(得分:0)

使用hashmap和arraylist是合适的:

HashMap<String,ArrayList<Integer>> map = new HashMap<String,ArrayList<Integer>(NumOfSentences)>();    

其中String存储三个单词短语,Arraylist在每个句子索引中存储相应的频率。

警告:只是存储count of occurrence将无济于事,因为你最终可能无法确定所有句子都有该短语。

在您的情况下,地图看起来像这样:

//...other Entries
{"Samsung Galaxy S7",  {1, 1, 1}}
//...other Entries

您可以看到它具有与所有句子索引相对应的频率。您需要找到arraylist的最小,并将其视为该短语的整体频率

如何决定最常见的 - 考虑您在每个句子中添加两次短语,然后地图将如下所示:

//...other Entries
{"Some-3-word-phrase-present-only-ONCE-in-each-sentence",  {1, 1, 1}}
{"Some-3-word-phrase-present-TWICE-in-each-sentence",  {2, 2, 2}}
//...other Entries

显然,后一个将被视为答案。