【发布时间】:2020-08-14 22:40:22
【问题描述】:
我正在尝试使用二进制搜索来计算排序数组中唯一数字的数量。我需要从一个数字到下一个数字的变化边缘来计算。我正在考虑在不使用递归的情况下这样做。有迭代方法吗?
def unique(x):
start = 0
end = len(x)-1
count =0
# This is the current number we are looking for
item = x[start]
while start <= end:
middle = (start + end)//2
if item == x[middle]:
start = middle+1
elif item < x[middle]:
end = middle -1
#when item item greater, change to next number
count+=1
# if the number
return count
unique([1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5,5,5,5,5,5,5])
谢谢。
编辑:即使 o(n) 忽略了运行时优势,我的二分搜索缺少什么?不寻找实际物品时会令人困惑。我该如何解决这个问题?
【问题讨论】:
-
这不是递归的。但我不确定它是否有效,你永远不会改变
item。 -
在你的例子中它返回
5,正确答案是3。 -
它不是计算唯一值,而是计算找到第一个元素所需的二分搜索迭代次数。
-
@Barmar 是的,我说我正在寻找一种迭代方法。我固定了返回值。是的,我知道这是错误的,这就是我在这里发帖的原因。
-
似乎 BS 方法的复杂性是
O(klogn)其中 n 是数组大小,k 是唯一项的数量。当 k 与 n 相当时,时间变为 O(nlogn) - 肯定比线性扫描慢
标签: python python-3.x algorithm binary-search