算法

一世执手 提交于 2019-11-29 07:01:21

1.算法

1.1时间复杂度

时间复杂度:用来评估算法运行效率的一个式子!

算法
算法

由于print()一次与print多次,执行时间相差很小,所以时间复杂度统一为O(1)。
相对于循环来说,中间执行的代码时间相对来说很小,所以只要是循环,时间复杂度只与循环的次数有关。

算法

小节:
1.时间复杂度是用来估计算法运行时间的一个式子。
2.一般来说,时间复杂度高的算法比复杂度低的算法慢。
3.常见的时间复杂度效率
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
4.复杂的时间复杂度
O(n!) O(2n) O(nn) …
快速判断算法复杂度规模(适用于大多数情况):
1.没有循环,为O(1)
2.循环n次,为O(n)
3.k层循环,为n^k
4.循环减半,为log2^n

复杂情况,根据算法执行过程判断

1.2空间复杂度

空间复杂度:用来评估算法内存占用大小的式子。
1.算法只是使用了一些变量,空间复杂度为O(1)。
2.算法使用了长度为n的一维列表,空间复杂度为O(n)。
3.算法使用了m行n列的二维列表,空间复杂度为O(m*n)

在实际编程中,我们都会以空间来换取时间,即使占用内存,也要争取速度。

2.递归

2.1常见例子

算法

2.2汉诺塔问题

要求把所有圆盘从A上挪到另一个柱子上
小圆盘不能放在大圆盘上
一次只能移动一个盘子

算法
算法
算法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
def hanio(n,a,b,c):
    if n>0:
        hanio(n-1,a,c,b)
        print("from %s to %s"%(a,c))
        hanio(n-1,b,a,c)
hanio(3,"A", "B", "C")

算法

汉诺塔移动次数的递推式:h(x)=2h(x-1)+1

2.列表查找

2.1顺序查找

顺序查找:也叫线性查找,从列表第一个元素开始,顺序搜索,直到找到元素或搜索到最后一个元素。
时间复杂度为O(n)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
def search(li,val):
    for index, v in enumerate(li):
        if v == val:
            return index
    return None
index = search([1,2,4,5,9,3], 4)

print(index)  # 2

2.2二分法查找

⼆分查找:⼜叫折半查找,从有序列表的初始候选区li[0:n]开
始,通过对待查找的值与候选区中间值的⽐较,可以使候选
区减少⼀半。

时间复杂度:O(logn)

算法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita

def search(li,val):
    length = len(li)
    min = 0
    max = length - 1
    while min <= max:
        mid = (min + max)//2
        if li[mid] == val:
            return mid
        elif li[mid] > val:
            max = mid -1
        elif li[mid] < val:
            min = mid + 1
    return None

index = search([1,2,4,5,9], 4)

print(index)  # 2

2.3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!