【发布时间】:2016-04-04 19:22:53
【问题描述】:
这是来自一个作业。确切的问题是:
“设计一种二分搜索算法的变体,用于在搜索表中执行 findAll(k) 操作(即,使用排序数组实现的映射,并且允许具有相同键的多个条目)使得新算法在 O(log n + s) 时间内运行,其中 n 是映射中的元素数,s 是返回的集合的大小。您必须提供伪代码并解释它如何达到所需的时间复杂度。"
我注意到的第一件事是我不能使用递归,因为我使用相同的参数 k(键)来搜索整个表。所以,这就是我目前所拥有的:
Algorithm findAll(k)
{
for i = 0 to end of array
{
mid = (low + high) / 2;
while k is not equal to mid
{
if k is less than mid
mid = (low + mid) / 2;
else
mid = (mid + high) / 2;
}
store k in collection array;
increment i;
}
return collection;
}
我希望它花费 O(log n) 时间进行搜索,并花费 s 时间将所有匹配的键存储在一个单独的数组中,该数组在最后返回。问题在于:
1) 我在循环中有一个循环,这不是我想要的(for 循环是为了确定结束)。
2)虽然它会遍历整个数组,但它会一遍又一遍地搜索相同的键,并且我无法在每次搜索后将其删除,因为这不是删除方法。
我该如何改进我的伪代码?
谢谢
【问题讨论】:
标签: big-o binary-search pseudocode