Indexing 在给定位置查找文本中最短的唯一字符串
除了通过在Indexing 在给定位置查找文本中最短的唯一字符串,indexing,hash,lookup,text-analysis,Indexing,Hash,Lookup,Text Analysis,除了通过在位置向字符增量添加字符并检查唯一性的暴力外,还有哪些其他技术可以在确定的位置查找文本中唯一的最短字符串 为了更好地解释 text = "word1 word2 word3" 如果位置=9(字2中的r)最短\u唯一\u位于\u pos=“rd2” 如果位置=13(word3中的w),则为小观察值;应在两个方向上搜索结果字符串,以便在\u pos=“2 w”处搜索最短的\u唯一的\u,而不是“word3”。当然,在交替方向的同时应用一些技术将产生预期的结果。我假设您试图避免的暴力方法涉及
位置
向字符增量添加字符并检查唯一性的暴力外,还有哪些其他技术可以在确定的位置
查找文本中唯一的最短字符串
为了更好地解释
text = "word1 word2 word3"
如果位置=9
(字2中的r)<代码>最短\u唯一\u位于\u pos=“rd2”
如果
位置=13
(word3中的w),则为小观察值;应在两个方向上搜索结果字符串,以便在\u pos=“2 w”处搜索最短的\u唯一的\u,而不是“word3”
。当然,在交替方向的同时应用一些技术将产生预期的结果。我假设您试图避免的暴力方法涉及对每个唯一字符串的“文本体”进行多次迭代。可以用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
开始搜索时:
获取当前索引i
处的字母。e、 g.'r'
复制该字母的索引集以设置s
,例如{2,8,14}
从s
中删除i
,例如{8,14}
增加s
中的所有索引(+1),例如{9,15}
获取i
之后的下一个字母。e、 g.'d'
获取下一个字母的索引集ns
如果s
和ns
不相等,则您已找到最短的唯一字符串
如果s
和ns
相等,则重复步骤4
由于步骤4-8之间的迭代,复杂性与结果字符串的长度成正比。它还与s
的大小成正比,该大小等于文本中起始字母的频率。比较两个集合是否相等,其复杂性与最小集合的大小成正比
在寻找更高效的算法时,请注意权衡。事实上,暴力可能更适合于短文。如果只搜索一次,上述方法的前期成本可能没有意义。此外,它还需要额外的内存。给出“唯一字符串”的更正式的定义,该定义非常礼貌地放在@Dmitry中。我会说“什么?”,结果字符串在文本中不会出现多次?@jamima确定的位置会让它混淆,而不是唯一的string@jamima你自己说,这和语言没有多大关系,所以我要去掉那些标签。顺便说一句,这个问题很难解决,现在还不知道。你是对的,暴力解决方案是显而易见的,不需要添加代码。这没用。