对已排序的多个项目进行二进制搜索
Binary search for sorted multiple items
假设我有一个长排序列表 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..
这是最有效的方法吗?有没有比这个方法收敛更快的方法?
谢谢!
一些建议:
1)首先尝试找到sorted short list
的中间元素(例子中的623),结果为index
2) 将short list分成下半部分(都是小于中间元素的元素)和上半部分(都是大于中间元素的元素)
3) 对于下半部分,我们从长列表的0
到index
开始搜索,对于上半部分,我们从index + 1
到[=]开始搜索15=](n 是长列表的长度)
4) 对两半递归执行步骤 1。
您跟踪边界并缩小搜索范围的想法很好。从左端和右端交替查找条目的方法与从左到右移动小数组并仅调整下限一样好。 (除非你对 S 中的密钥分布有所了解。)
我认为你应该递归地处理小数组,并在每次递归、二进制搜索风格时将其减半。在数组 L
中查找 623
并找到索引 k
。接下来递归到左子数组并在L[0...k]
中查找{22, 255}
中的条目。然后向右递归并在 L[k + 1...|L|]
.
中查找条目 {723, 876}
由于您在一条评论中提到您的列表很大,如果您的较短列表的长度与较长列表的长度相当,您可以只在两个列表的开头设置两个指针,并在每个step 向右移动一个指向较小元素的元素。只要两个指针指向相等的值,您就找到了一个匹配项。这将是 O(s + l)
,如果 s
接近 l
(s
是较短列表的长度,l
是较长列表的长度)。
假设我有一个长排序列表 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..
这是最有效的方法吗?有没有比这个方法收敛更快的方法?
谢谢!
一些建议:
1)首先尝试找到sorted short list
的中间元素(例子中的623),结果为index
2) 将short list分成下半部分(都是小于中间元素的元素)和上半部分(都是大于中间元素的元素)
3) 对于下半部分,我们从长列表的0
到index
开始搜索,对于上半部分,我们从index + 1
到[=]开始搜索15=](n 是长列表的长度)
4) 对两半递归执行步骤 1。
您跟踪边界并缩小搜索范围的想法很好。从左端和右端交替查找条目的方法与从左到右移动小数组并仅调整下限一样好。 (除非你对 S 中的密钥分布有所了解。)
我认为你应该递归地处理小数组,并在每次递归、二进制搜索风格时将其减半。在数组 L
中查找 623
并找到索引 k
。接下来递归到左子数组并在L[0...k]
中查找{22, 255}
中的条目。然后向右递归并在 L[k + 1...|L|]
.
{723, 876}
由于您在一条评论中提到您的列表很大,如果您的较短列表的长度与较长列表的长度相当,您可以只在两个列表的开头设置两个指针,并在每个step 向右移动一个指向较小元素的元素。只要两个指针指向相等的值,您就找到了一个匹配项。这将是 O(s + l)
,如果 s
接近 l
(s
是较短列表的长度,l
是较长列表的长度)。