时间复杂度

大O表示法是一种特殊的表示法,指出了算法的速度有多快.大O表示法让你能够比较操作数,它指出了算法运行时间的增速。

 O(log n),也叫对数时间,这样的算法包括二分查找。
 O(n),也叫线性时间,这样的算法包括简单查找。
 O(n * log n),这样的算法包括快速排序——一种速度较快的排序算法。
 O(n 2 ),这样的算法包括选择排序——一种速度较慢的排序算法。
 O(n!),这样的算法包括旅行商问题的解决方案——一种非常慢的算法。

总结:

算法运行时间是从其增速的角度度量的。

算法运行时间用大O表示法表示。

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小度量

二分法查找

简单查找: 是一个查找算法,一个个的数.

二分法是一个查找算法, 其输入的是一个有序的元素列表,如果要查找的元素包含在其中,二分法查找返回其位置,否则返回none.

一般而言,对于包含n个元素的列表,用二分查找最多需要log 2 n步,而简单查找最多需要n步。

简单的思路:  利用列表的中间值和正确的值进行比较,来调整列表的索引范围,然后再在新的范围内重新取中间值,然后再和正确的值比较,来调整列表的索引范围,直到找到正确值的索引.

适用范围: 有序的列表

 

def binary_search(list,item):
    """
    二分法求出给定的元素在列表中的索引
    :param list: 有序的数组
    :param item: 你要查找的元素
    :return: 你要查找元素的索引
    """
    low=0 #最低位的索引
    hight=len(list)-1#最高位的索引
    while low <= hight:
        mid=int((low+hight)/2) #得到中间元素的索引值
        guess=list[mid]    #猜测的元素就是列表中间的数字
        if guess==item: #如果猜测的值正好是正确的值,那么mid就是给定元素的索引
            return mid
        elif guess>item: #如果猜测的值大于正确的值,那么列表的的hight就变成了mid-1,因为正确值并不是mid所有最高的索引就是mid-1
            hight=mid-1 #wi
        else:
            low=mid+1
    return None

list=[1,3,5,6,17,28,35]
print(binary_search(list,17))

结果:

 4

 递归版的二分法查找

def bin_search_rec(data_set,value,low,hight):
    if low <= hight:
        mid=int((low+hight)/2)
        if data_set[mid]==value:
            return mid
        elif data_set[mid]>value:
            return bin_search_rec(data_set,value,low,mid-1)
        else:
            return bin_search_rec(data_set,value,mid+1,hight)
    else:
        return None

list=[1,13,15,18,20]
N=bin_search_rec(list,19,0,len(list)-1)
print(N)

 顺序查找法

顺序查找法主要应用于无序列表,原理从第一个位置的数开始,将其与正确的数比较,如果这两个数相等返回该索引值,如果不相等,再比较第二个位置,知道找到相等的值

def linear_search(data_set, value):

    for i in range(len(data_set)):
        if data_set[i] == value:
            return i
    return None

data_set = [1, 3, 5, 27, 17, 28, 35]
l = linear_search(data_set, 27)
print(l)
posted on 2018-04-28 20:31  程序员一学徒  阅读(147)  评论(0)    收藏  举报