让A为包含n个不同的正整数的排序数组。令x为一个正整数,这样x和2x都不在A中。
描述一种有效的算法,以查找A中大于x且小于2x的整数数量
算法的复杂度是多少?有人不用使用库就可以编写伪代码吗?
我知道这可以用线性时间复杂度完成,但是可以修改二进制搜索来实现。 以下是我想出的线性时间复杂度解决方案
def find_integers(A, x):
integers = 0
for element in A:
if element > x and element < 2*x:
integers += 1
return integers
答案 0 :(得分:2)
您已经发现可以使用二进制搜索。搜索x和2x并记下列表中的位置,您可以根据两个位置之间的差来计算整数的数量。
由于您使用的是python,因此bisect模块可以帮助您进行二进制搜索。
答案 1 :(得分:0)
我的任务是改善每个人的默认二进制搜索。如我在此答案中所述:How can I simplify this working Binary Search code in C? ...
......几乎所有我的二进制搜索都在搜索位置而不是元素,因为这样做更快捷,更容易实现。
它也很容易适应以下情况:
def countBetweenXand2X(A,x):
if x<=0:
return 0
# find position of first element > x
minpos = 0
maxpos = len(A)
while minpos < maxpos:
testpos = minpos + (maxpos-minpos)//2
if A[testpos] > x:
maxpos = testpos
else:
minpos = testpos+1
start = minpos;
# find position of first element >= 2x
maxpos = len(A)
while minpos < maxpos:
testpos = minpos + (maxpos-minpos)//2
if A[testpos] >= x*2:
maxpos = testpos
else:
minpos = testpos+1
return minpos - start
这只是2次二进制搜索,因此复杂度保持为 O(log N)。还要注意,第二个搜索从第一个搜索中找到的位置开始,因为我们知道第二个位置必须是第一个>=
。我们只需保留minpos
而不是将其重置为零即可。