在给定位置

时间:2017-03-14 14:05:24

标签: indexing hash lookup text-analysis

通过逐步向text处的角色添加字符,还有其他技巧可以找到position内唯一的确定position的唯一字符串,而不是蛮力。检查唯一性?

为了更好地解释,

text = "word1 word2 word3"

如果position = 9(word2中的r); shortest_unique_at_pos = "rd2"

小观察,如果position = 13(字3中的w);应该在两个方向上搜索结果字符串,因此shortest_unique_at_pos = "2 w",而不是"word3"。当然,在交替方向时应用某些技术会产生所需的结果。

1 个答案:

答案 0 :(得分:2)

我认为你试图避免的蛮力方法涉及对每个唯一字符串的“文本正文”的多次迭代。可以通过O(n)的前期成本解决此问题,其中n是文本的长度,然后每次搜索最短的唯一字符串O(m*k),其中m是“唯一字符串”的长度和k是文本中“确定索引”处的字母出现的次数。如果您经常在大型文本中搜索短的唯一字符串,这可能是有益的。

您可以提前创建字典,其中键是“文本正文”中的字母,值是带有索引的集合,其中可以在文本中找到这些字母。例如,python字典将如下所示:

indexes = { 'w': {0, 6, 12}, 'o': {1, 7, 13}, 'r': {2, 8, 14} }

创建这样的字典是O(n)操作。它可能更复杂,因为(重新)分配了内存并且复制了数据并且你得到了哈希冲突,但基本上你只需要查看一次文本并在相应的索引集处添加一个字母的索引。您可以按照“文本正文”执行上述操作,并在每次搜索最短的唯一字符串时重复使用。

当您获得“确定的索引”时,例如2开始搜索:

  1. 获取当前索引i的字母。例如'r'
  2. 复制该字母的索引集以设置s,例如{2, 8, 14}
  3. i s
  4. 删除{8, 14}
  5. 增加s中的所有索引(+1),例如{9, 15}
  6. 获取i之后的下一个字母。例如'd'
  7. 获取下一个字母的索引集ns
  8. 如果sns不相等,则停止找到最短的唯一字符串
  9. 如果sns相等,请从第4步开始重复
  10. 由于步骤4到8之间的迭代,复杂度与结果字符串的长度成正比。它也与s的大小成比例,它等于从中开始的字母的频率。文本。比较2组是否相等具有与最小集合的大小成比例的复杂性。

    在寻找更有效的算法时,请注意权衡。对于短文本来说,蛮力实际上可能更好。如果您只搜索一次,上述方法的前期成本可能没有意义。此外,它需要额外的内存。