搜索词间最短长度的算法

标签 algorithm sorting

我正在尝试提出一种算法来查找单词列表之间的最短距离。我有一个列表字典,它显示在文档中找到一个词的不同位置。

匹配{“the”:[2, 24, 15],“is”:[5, 13],“apple”:{45} ... }

是否有确定的算法来找到所有这些重叠的最短长度?例如,在这一个中,13-45 将是答案,因为所有的单词都可以在该范围内找到。

最佳答案

我会保留两个位置,leftright,它们分别是包含所有单词的范围的左端和右端。我还会维护一个优先级队列,其中的每个条目都是一个单词,以及该单词出现在当前左边缘或之后的位置列表。

要初始化,创建一个新的空优先级队列,插入每个单词及其出现的完整列表,并正确排序。当您插入每个单词时,更新 right 使其成为任何单词的最大首次出现次数。对于您的数据,初始设置为

left=2,right=45,queue=[["the", [2,15,24]], ["is", [5, 13], ["apple", [45]]

我将优先级队列显示为一个数组,按其第二个组件的第一个组件排序。也就是说,顺序为 2(代表“the”)、5(代表“is”)和 45(代表“apple”)。请注意,“the”的出现必须在此初始化期间进行排序。 right结果是45,2、5、45中的最大值。

left 是隐含的。它始终是优先级队列前面的任何内容的第一次出现。此时我们发现的最短距离是 2..45。

然后重复下面的循环:

remove the first entry from the priority queue
shift its next occurrence into `left`
check if left..right is a new shortest sequence
if we've shifted off the last occurrence for this entry
    stop
otherwise, 
    update `right` to include this new next occurrence
    insert the entry back into the priority queue

对于您的数据,连续的值将是:

left=2,right=45,queue=[["the", [2,15,24]], ["is", [5, 13], ["apple", [45]]
left=5,right=45,queue=[["is", [5, 13], ["the", [15,24]], ["apple", [45]]
left=13,right=45,queue=[["is", [13], ["the", [15,24]], ["apple", [45]]

然后我们终止,因为在从队列中弹出 ["is", [13]] 并将 13 从其出现列表中移出后,没有留下。

关于搜索词间最短长度的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28184499/

相关文章:

Python 按字母顺序对字符串进行排序,小写在前

javascript - 使用 orderBy 进行 Angularjs 排序对我来说不起作用

c++ - 带有比较函数的额外参数的排序列表

java - 计算 Java 数组中的非重复匹配对

algorithm - 按属性查找相似产品

java - 找到最佳兼容元素组的算法

actionscript-3 - 在 2D 位图上找到质心

multithreading - 使用最大连接上限计算总下载时间

python - 将元组列表分组到 Python 中的字典

c - C 中的简单 AES 函数(不是库)?