2018-01-31二分查找

2018-01-31  本文已影响5人  开子的私家地

04-22

迭代简化版

思路:

参考老版py 2.4之前bisect_right

def bisect_right(a, x, lo=0, hi=None):
    if hi is None:
        hi = len(a)
    while lo < hi:
        mid = (lo + hi)//2
        if x < a[mid] : hi = mid
        else: lo = mid + 1
    return lo

04-15

递归版:

思路:在一个升序的列表中,比mid大找右边,比mid小赵左边。
注意:条件判断后调用自身时用return: return func(n),如果直接调用递归会出现很多次return.

def Find_row(target,row):
    n = len(row) - 1
    _min = 0
    _max = n
    mid = n/2
    # print 'mid _max',mid,_max
    # TODO
    if n == 0:
        # print target,row[0]
        if target == row[0]:
            # print 'Equal=='
            return True
        else:
            # print '??'
            return False
    if n > 0:
        if target == row[mid]:
            # print 'Equal'
            return True
        elif target < row[mid]:
            # print 'lower'
            if mid == _min:
                return False
            else:
                return Find_row(target, row[:mid])
        else:
            # if target > row[mid]:
            # print 'bigger'
            return Find_row(target, row[mid+1:])

test

t = [i for i in range(10)]
row = [1,2,3,4,5,6,7,8,9,10]
for _x in t:
    if Find_row(_x,row):
        print _x,'Y'
    else:
        print _x,'N'

输出

0 N
1 Y
2 Y
3 Y
4 Y
5 Y
6 Y
7 Y
8 Y
9 Y

—————————————————————————————

迭代循环版

放上之前写的二分查找,复杂度(nlogn)

def b_Search(x,item):
    first = 0
    last = len(x)-1
    found = False
    while first<=last and not found:
        mid = (first+last)//2
        # print mid,last,first
        if item == x[mid]:
            found == True
            break

        else:
            if first==last and item != x[mid]:
                found = True
                # print '缺失值'
                mid = -1
            else:
                if x[mid] > item:
                    first = mid+1
                else:
                    last = mid-1

    return mid
上一篇 下一篇

猜你喜欢

热点阅读