算法前戲

廢話時間:python

算法其實是高於語言的。

因此我是第一!!!

好比說你的列表.sort 它裏面其實就是實現了一種算法。



算法:一個計算過程,解決問題的方法。

程序 = 數據結構 + 算法。

一:時間複雜度:用來評估算法運行效率(時間)的一個式子。

光年是距離。

通常來講:時間複雜度高的算法比複雜度低的算法慢。算法

​ 問題規模基本上差很少同樣的時候。即n緩存

​ 與機器有關。數據結構

​ 時間複雜度是獨立於機器的。函數

常見的時間複雜度:

o(1) < o(logn) < o(n) < o(nlogn) < o(n的平方) < o(n平方logn) < o(n的三次方)

如何簡單判斷時間複雜度?code

最好是根據運行過程來估計
找到表明問題規模的n   魑魅魍魎chi‘mei’wang‘liang

如何一眼判斷時間複雜度?

是否有循環減半的過程 -> o(logn)
幾層循環就是n的幾回方的複雜度

二:空間複雜度

用來評估算法內存佔用大小的一個式子
  • 空間換時間排序

    例如:若是你想讓你的算法快點,就須要更多的緩存。

三:基本算法

算法裏面重要的思想

遞歸的兩個特色:
    - 調用自身
    - 結束條件

def qq(n):
    if n == 0 :
        print('個人小可愛',end='')
    else:
        print('抱着',end='')
        qq(n-1)
        print('的我',end='')

qq(5)
# 抱着抱着抱着抱着抱着個人小可愛的個人個人個人個人我


def fun(x):
    if x > 0:
        print(x)
        fun(x-1)

def func(x):
    if x > 0:
        func(x-1)

3.0 漢諾塔

當n個盤子時,把n-1看作一部分。
    1. 把n-1個圓盤從a通過c移動到b
    2. 把第n個圓盤從a移動到c
    3. 把n-1個圓盤從b通過a移動到c
t = 0
def hanoi(n,a,b,c):
    global t
    if n > 0:
        hanoi(n-1,a,c,b)
        t +=1
        print(':moving from %s --> %s.'%(a,c))
        hanoi(n-1,b,a,c)
hanoi(5,'a','b','c')
print('本次總共運行 %s 次'%t)
漢諾塔移動次數的遞推式:h(x) = 2h(x-1)+1

前部分算法分爲兩部分:查找和排序

3.1 列表查找:從列表中查找指定元素

- 輸入:列表、待查找元素
- 輸出:元素下標或未查找到元素

3.2 順序查找

- 從列表第一個元素開始,順序進行搜索,直到找到爲止。

3.3 二分查找

- 從有序列表的候選區data[0:n]開始,經過對待查找的值和候選區中間值的比較,可使候選區減小一半。

3.1 二分查找

  • 使用二分查找來找3
    • 1,2,3,4,5,6,7,8,9
    • Low high
      • ​ mid
    • 若是high < low ,說明你要找的值不存在。
def erfen_search(li,val):
    low = 0
    high= len(li) - 1
    while low<=high:
        mid = (low+high) // 2
        if li[mid] == val:
            return  mid
        elif li[mid] < val:
            low = mid + 1
        else:
            high = mid - 1
a = erfen_search([1,2,3,4.123,123,12,3,12,3,12,3,21,3,213,21,321,3,213,21,321,3,21,4,3,543,53,45,435,342,5],435)
# 上面這個方法有問題,不信你試。


# 遞歸版本二分查找
def bin_search_rec(data_set,value,low,high):
    if low <= high:
        mid = (low + high) // 2
        if data_set[mid] == value:
            return mid
        elif data_set[mid] < value:
            low = mid + 1
            return bin_search_rec(data_set,value,low,high)
        else:
            high = mid - 1
            return bin_search_rec(data_set,value,low,high)

    else:
        return

列表排序

- 列表排序
  - 將無序列表變爲有序列表。 .sort
- 應用場景
  - 各類榜單
  - 各類表格
  - 給二分查找用
  - 給其餘算法用

輸入:無序列表
輸出:有序列表

排序Low B三人組
- 冒泡排序
- 插入排序
- 選擇排序

算法關鍵點:
- 有序區
- 無序區

升序與降序

排序兇兇組:
- 快排
  - 思路:
    - 取一個元素p(第一個元素),使元素p歸位;
    - 列表被p分紅兩部分,左邊逗比p小,右邊逗比p大‘
    - 遞歸完成排序。  遞歸終止條件:列表剩一個元素。
    - 算法關鍵點:1. 歸位  2. 遞歸
- 堆排
- 歸併排序

沒什麼人用的排序:
- 基數排序
- 希爾排序
- 桶排序

總覽:

執行次數函數 非正式術語
12 O(1) 常數階
2n+3 O(n) 線性階
3n²+2n+1 O(n²) 平方階
5log2n + 20 O(logn) 對數階
2n + 3nlog2n + 19 O(nlogn) nlogn階
6n³ + 2n² + 3n +4 O(n³) 立方階
2" O(2") 指數階
相關文章
相關標籤/搜索