首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的二进制搜索

Python中的二进制搜索
EN

Stack Overflow用户
提问于 2015-03-16 02:40:05
回答 2查看 353关注 0票数 1

所以我有这个问题。

您将得到一个非空的一维数组seq形式的景观。我们的目标是找到一个细胞的指数I,它是一个凹坑。如果seqi <= seqi-1和seqi <= seqi+1是一个坑,例如在数组7、6、9、7、8中,指数1和3是坑。如果第一个或最后一个元素小于或等于其唯一的邻居,它们就被认为是一个坑。例如,3、2、4、4、1的最后一个元素是一个凹坑(也是索引1)。注意,pit的定义也包括相等;例如,在3、2、2、2、5、6、6、8中,索引1、2、3和6是凹坑。作为特例,我们还定义了长度数组的唯一单元格也是一个凹坑。

我已经制定了一个解决方案,使用二进制搜索(某种)来实现O(logn)作为最坏的情况。但是我遇到了一个例子,它什么也不返回,或者没有返回。

代码语言:javascript
复制
def find_pit(seq):
    first = 0
    last = len(seq) - 1
    origlast = last
    mid = 0
    if len(seq) == 1 :
        return 0
    else:
        while first <= last & mid < last :
            mid = (first + last) // 2
            if seq[mid] <= seq[mid - 1] & seq[mid] <= seq[mid + 1]:
                return mid
            else:
                if seq[mid] > seq[mid - 1]:
                    last = mid
                else:
                    first = mid
    if seq[0] <= seq[1]:
        return 0
    elif seq[origlast] <= seq[origlast-1]:
        return (len(seq) - 1)

print(find_pit([0,1]))
print(find_pit([5, 4, 3, 6, 7]))

我该怎么解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 02:50:04

您需要更改

&(按位“和”)

和(合乎逻辑的“和”)

在您的代码中:

代码语言:javascript
复制
def find_pit(seq):
    first = 0
    last = len(seq) - 1
    origlast = last
    mid = 0
    if len(seq) == 1 :
        return 0
    else:
        #change next line to use logical and
        while first <= last and mid < last :  
            mid = (first + last) // 2
            #change next line to use logical and
            if seq[mid] <= seq[mid - 1] and seq[mid] <= seq[mid + 1]:
                return mid
            else:
                if seq[mid] > seq[mid - 1]:
                    last = mid
                else:
                    first = mid
    if seq[0] <= seq[1]:
        return 0
    elif seq[origlast] <= seq[origlast-1]:
        return (len(seq) - 1)


print(find_pit([0,1]))
print(find_pit([5, 4, 3, 6, 7]))

用上面的测试用例运行这个测试用例,现在将给出结果:第一个列表为0,第二个列表为2。

票数 3
EN

Stack Overflow用户

发布于 2015-03-16 03:23:25

似乎能在给定的情况下找到第一个坑。我调整了调用,允许检查多个函数。

代码语言:javascript
复制
#.... original find_pit left, but not pasted in
import sys

def find_pit2(seq):

    left = sys.maxint
    maxp = len(seq)

    if maxp == 1 :
        return 0
    else:
        for pos, current in enumerate(seq):
            try:
                right = seq[pos+1]
            except IndexError:
                #rightmost, count as right neighbor as bigger
                right = sys.maxint
            #pit - smaller or equal to neighbours
            if left >= current and current <= right:
                return pos
            left = current


li_f = [find_pit, find_pit2]


for f in li_f:
    print f.__name__

    print("  ",f([0,1]))
    print("  ",f([5, 4, 3, 6, 7]))
    print("  ",f([7, 6, 9, 7, 8]))
    print("  ",f([3, 2, 2, 2, 5, 6, 6, 8]))

给予

代码语言:javascript
复制
find_pit
('  ', 0)
('  ', 2)
('  ', None)
('  ', 3)
find_pit2
('  ', 0)
('  ', 2)
('  ', 1)
('  ', 1)        
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29068866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档