分治

分治算法

判断某个元素是否在列表中

'''
判断某个元素是否在列表中
'''


def is_in_list(init_list,el):
    return [False,True][init_list[0]==el]
#分治法
def solve(init_list,el):
    n=len(init_list)
    if n==1:
        return is_in_list(init_list,el)
    #分解
    left_list,right_list=init_list[:n//2],init_list[n//2:]
    #合并
    res=solve(left_list,el) or solve(right_list,el)
    return res
if __name__ == '__main__':
    #测试数据
    test_list=[12,2,23,45,67,3,2,4,45,63,24,23]
    #查找
    print(solve(test_list,45))
    print(solve(test_list,5))
View Code


求顺序表中最大值

'''
求顺序表中最大值
'''

#基本子算法
def get_max(max_list):
    return max(max_list)

#分治法
def solve2(init_list):
    n=len(init_list)
    if n<=2:
        return get_max(init_list)
    left_list,right_list=init_list[:n//2],init_list[n//2:]
    left_max,right_max=solve2(left_list),solve2(right_list)
    return get_max([left_max,right_max])


if __name__ == '__main__':
    test_list=[2,1,4,5,523,433,]
    print(solve2(test_list))
View Code

 

找出序列中第k小的元素

#划分
'''
找出一组序列中第k小的元素
'''
def partition(seq):
    pi=seq[0]
    lo=[x for x in seq[1:] if x<=pi]
    hi=[x for x in seq[1:] if x>pi]
    return lo,pi,hi

def select(seq,k):
    #分解
    lo,pi,hi=partition(seq)
    m=len(lo)
    if m==k:
        return pi
    elif m<k:
        return select(hi,k-m-1)
    else:
        return select(lo,k)

if __name__ == '__main__':
    seq=[2,3,5,1,56,5,7,6,45,3,444,333]
    print(select(seq,3))
    print(select(seq,1))
View Code

 



posted @ 2019-10-17 17:29  jiuchen  阅读(211)  评论(0编辑  收藏  举报