算法

时间复杂度:用来评估算法运行效率的一个式子
空间复杂度:用来评估算法内存占用大小的式子

更多的算法例子:https://github.com/ls-2018/book

 

 

 

O(logn):递归折半 
常见的时间复杂度
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^2*logn)<O(n^3)
复杂问题的时间复杂度
O(n!)
O(2^n)
O(n^n)

 

如何快速判断时间复杂度(适合绝大多数简单情况)
    1、确定问题规模
    2、循环减半过程--->logn
    3、k层关于n的循环    n^k
    
时间往往比空间更重要:空间换时间




递归的两个特点:
    调用自身
    结束条件
汉诺塔问题;
    2个-->三次
    A-------->C
    1、把n-1个盘子从A经过C移动到B
    2、把第n个盘子从A移动到C
    3、把n-1个盘子从B经过A移动到C
    
    # h(n)=2h(n-1)+1
    def hanoi(n, a, b, c):
        if n:
            hanoi(n - 1, a, c, b)
            print('moving from %s to %s' % (a, c))
            hanoi(n - 1, b, a, c)


    hanoi(3, 'A', 'B', 'C')

 

 

顺序查找:for循环
    列表的index()就是顺序查找
    
二分查找:
    # O(logn)
    def binary_search(val, li=[]):
        left = 0
        right = li.__len__() - 1

        while left <= right:
            mid = (left + right) // 2
            if li[mid] == val:
                return mid
            elif li[mid] > val:
                right = mid - 1
            else:
                left = mid + 1
        return None


    li = [i for i in range(10)]

    print(binary_search(4, li))    
    
    
    
    
    
排序:将一组无序的记录序列调整为有序的记录序列
列表排序
内置函数sort()    
    结合了归并排序和插入排序,做了一些优化
    java内置的排序也改了(快排--->归并),如果看官方文档的话  ,会有stable    (steibou)
    
    

 

posted @ 2018-12-16 20:12  慕沁  阅读(108)  评论(0)    收藏  举报