算法-----二分查找及算法快慢表示法

程序=数据结构+算法

1.常见的数据结构:数组,链表,散列表(键值对,python的字典形式)

2.二分查找

1.条件:二分查找的数组必须是【有序的】

2.算法执行速度—大O表示法 O(n)

大O表示法是指最糟糕情况下程序所执行的次数,demo:0-100的数组,查找(0),按顺序查找—-线性的,1次就找到了,要找(100)这个数组,就得执行100次,也就是最糟糕的情况下,大O表示法所执行的次数,线性,O(n)
常见大O速度

1. O(logN),对数是幂的逆运算,log默认指的是以2为底以N为真数
2. O(n),n个数执行n次
3. O(nlogN),
4. O(n^25. O(n!)
可以看出,根据n大小不同(有序列表的长度)大O表示法的增速不同,所以根据你的数据量来确定一个好的算法,使你的程序执行速度加快,提高用户体验,减少等待时间是明智之选,一个好的程序,离不开算法。

二分查找原理:

二分查找所需元素:1一个有序列表list;2:你要查找的item;
demo:有个列表list:0-100;item:67
第一次查找:取中间值50,你说小了,把50复制给最小值,min+1就在【51-100】之间取值
第二次查找:取中间值75:你说大了:把75赋值给最大值,max-1就在【51-74】之间取值
第三次查找:取中间值62:你说小了:把62赋值给最小值,min+1就在【63-74】之间取值
第四次查找:取中间值68:你说大了:把68赋值给最大值,max-1就在【63-73】之间取值
第五次查找:取中间值71:你说小了:把68赋值给最小值,min+1就在【69-71】之间取值
第六次查找:取中间值70:你说大了,把70赋给最大值,max-1 就在【69-69】之间取中间值
第七次查找:取中间值:67!找到了
也就是2^7=128,二分查找执行次数为log100约=7
所以二分查找的执行次数为:O(logN)
如果是顺序查找的话为O(N),你要查找的是67,就要执行67次
假如:你有一个40亿的一个有序列表,查找第40亿个数,普通查找就得执行40亿次,假如每次执行查找耗时1毫秒,40亿次就是执行了40亿毫秒,4000000000就得执行40亿/1000(毫秒)/3600(转换成小时)/24(转换成天)=4.6天
如果用二分查找就是log4000000000=31.8毫秒;
由此可见,二分查找,数据量越大,所需时间越短,执行效率越高。

3.代码demo

def binary_search(list,item):
    # 取最大值,和最小值的下标,
    low = 0
    height = len(list)-1

    while low < height:
        # set_trace()
        mid = (low+height)/2
        print(mid)

        guess = list[mid]
        if guess == item:
            return guess
        elif item > guess:
            low = mid+1
        elif item < guess:
            height = mid-1
        else:
            return None
        print(guess,list[low],list[height])
结果如下
50
(50, 51, 100)
75
(75, 51, 74)
62
(62, 63, 74)
68
(68, 69, 74)
71
(71, 69, 70)
69

猜你喜欢

转载自blog.csdn.net/weixin_40933787/article/details/81739647
今日推荐