我希望找到列表的最小元素,其元素首先减少然后增加

时间:2014-06-11 17:02:11

标签: python algorithm search binary

我想在O(log n) complexity中实现它。使用binary search的想法可以实现它。我这样说:让L成为一个列表; L= [12,10,9,7,6,5,8,9,11]所以预期的结果应该是5python中有一个简单的算法可以做到吗?

def binse(l,lo,hi):
    n =len(l)
    lo = 0
    hi =n
    mid =(lo+hi)//2
    if (hi-lo)<2:
       return lo
    if l[mid]<l[mid-1] and l[mid]<l[mid+1]:
       return l[mid]
    elif l[mid]<l[mid-1] and l[mid]>l[mid+1]:
       return binse(l,mid+1,hi)
    elif l[mid]>l[mid-1] and l[mid]<l[mid+1]:
       return binse(l,lo,mid)
    else:
       return

l = [13,11,5,6,7,8,9,11,13]
lo =0
hi =len(l)
print(binse(l,lo,hi))

2 个答案:

答案 0 :(得分:0)

你说过 - 使用二进制搜索。在每次探测时,取两个连续的条目并确定值是增加还是减少。基于此,您知道哪个区域需要进一步细分。

顺便说一句,我忽略了平等的情况

根据发布的代码进行更新:

  1. binse做的第一件事是覆盖lo和hi参数 - 糟糕!
  2. return lo行显然是错误的,因为它没有返回数组值
  3. 在某些边缘情况下需要小心一些,包括靠近端点以及当你有一系列相等的值时
  4. 最后一次&#34;返回&#34;也显然是错的,因为它没有任何价值。
  5. 第一项是你看到无限递归的原因。

答案 1 :(得分:0)

def mini(lis):
s, e = 0, len(lis)-1
while True:
    m = (s+e)/2
    if lis[m] > lis[m+1]:
        s = m
    elif lis[m-1] < lis[m]:
        e = m+1
    else:
        return m

这应该有效。