sf-1 算法
算法基礎(chǔ)
算法
算法(Algorithm):一個(gè)計(jì)算過程,解決問題的方法
DNiklaus Wirth:“程序=數(shù)據(jù)結(jié)構(gòu)+算法”
時(shí)間復(fù)雜度
時(shí)間復(fù)雜度:用來評估算法運(yùn)行效率的一個(gè)式子
?
?
時(shí)間復(fù)雜度-小結(jié)
時(shí)間復(fù)雜度是用來估計(jì)算法運(yùn)行時(shí)間的一個(gè)式子(單位)。
一般來說,時(shí)間復(fù)雜度高的算法比復(fù)雜度低的算法慢。
常見的時(shí)間復(fù)雜度(按效率排序)
O(1)< O(logn)< O(n)< O(nlogn)< O(n2)< O(n2logn)< O(n3)
復(fù)雜問題的時(shí)間復(fù)雜度
O(n!)O(2n)O(nn)..
如何簡單快速地判斷算法復(fù)雜度
快速判斷算法復(fù)雜度(適用于絕大多數(shù)簡單情況):
確定問題規(guī)模n
循環(huán)減半過程→logn
k層關(guān)于n的循環(huán)→nk
復(fù)雜情況:根據(jù)算法執(zhí)行過程判斷
空間復(fù)雜度
空間復(fù)雜度:用來評估算法內(nèi)存占用大小的式子
空間復(fù)雜度的表示方式與時(shí)間復(fù)雜度完全一樣
算法使用了幾個(gè)變量:O(1)
算法使用了長度為n的一維列表:O(n)
算法使用了m行n列的二維列表:O(mn)
“空間換時(shí)間”
遞歸的兩個(gè)特點(diǎn):
調(diào)用自身
結(jié)束條件
?
?遞歸實(shí)例:漢諾塔問題
大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序擺著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。
在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動(dòng)一個(gè)圓盤。
64根柱子移動(dòng)完畢之日,就是世界毀滅之時(shí)。
?
漢諾塔移動(dòng)次數(shù)的遞推式:h(x)=2h(x-1)+1
h(64)=18446744073709551615
假設(shè)婆羅門每秒鐘搬一個(gè)盤子,則總共需要5800億年!
列表查找
查找
查找:在一些數(shù)據(jù)元素中,通過一定的方法找出與給定關(guān)鍵字相同的數(shù)據(jù)元素的過程。
列表查找(線性表查找):從列表中查找指定元素
輸入:列表、待查找元素
輸出:元素下標(biāo)(未找到元素時(shí)一般返回None或-1)
內(nèi)置列表查找函數(shù):index()
順序查找(Linear Search)
順序查找:也叫線性查找,從列表第一個(gè)元素開始,順序進(jìn)行搜索,直到找到元素或搜索到列表最后一個(gè)元素為止。
時(shí)間復(fù)雜度:O(n)
?
二分查找(Binary Searh)
二分查找:又叫折半查找,從有序列表的初始候選區(qū)li[0:n]開始,通過對待查找的值與候選區(qū)中間值的比較,可以使候選區(qū)減少一半。
def binary(data_list, value):low = 0high = len(data_list) - 1while low <= high:mid = (low + high) // 2 # 折半if data_list[mid] == value:return midelif data_list[mid] > value:high = mid - 1else:low = mid + 1data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] value = 5 index = binary(data_list, value) print("index in data_list:%s ,search value test:%s "%(index,data_list[index]))""" index in data_list:4 ,search value test:5 """總結(jié)
- 上一篇: sjms-1 面向对象
- 下一篇: nginx之Geoip读取地域信息模块