我试图想出一个算法来找到一个单词列表之间的最短距离。我有一个列表字典,显示文档中找到单词的不同位置。
匹配{"所述" :[2,24,15],"是" :[5,13]," apple" :{45} ...}
是否有既定的算法可以找到所有这些重叠的最短长度?例如,在这一个中,13-45将是答案,因为所有单词都可以在该范围内找到。
答案 0 :(得分:1)
我会保留两个位置left
和right
,它们分别是包含所有单词的范围的左端和右端。我还会维护一个优先级队列,每个条目都是一个单词,以及当前左边缘或之后单词出现的位置列表。
要初始化,请创建一个新的空优先级队列,插入每个单词及其完整的出现列表,并正确排序。当您插入每个单词时,请更新right
,以便它是任何单词的最大首次出现。对于您的数据,初始设置将是
left=2,right=45,queue=[["the", [2,15,24]], ["is", [5, 13], ["apple", [45]]
我将优先级队列显示为数组,按其第二个组件的第一个组件排序。也就是说,按顺序2(对于“the”),5(对于“是”)和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之后,没有一个保留。