演算法:
有充分明確的目標,不可以有歧義其實說白了,演算法就是乙個計算過程解決問題的方法。我們現在已經知道資料結構表示資料是怎麼儲存的,而「程式=資料結構+演算法」,資料結構是靜態的,演算法是動態的,它們加起來就是程式。計算機能處理的範圍之內
描述應不依賴於任何一種計算機語言以及具體的實現手段
對演算法來說有輸入,有輸出,相當於函式有引數有返回值。我們寫演算法的時候習慣把演算法封裝到乙個函式中。
好,從上面我們知道了什麼是演算法,下面我再說什麼是好的演算法?
在解決同乙個問題的時候,我們通常會有很多種不一樣的演算法,區別就在於,有的演算法比較笨,有的演算法比較聰明,那我們怎麼去衡量它們誰好誰壞呢?我們通常有下面兩個指標:
先舉個例子說,如果讓你列印十個整數,你那個程式可能瞬間就給出結果了,如果讓你列印十萬個整數呢?這你就得多等一會了。所以這個程式執行的時間,就跟你要處理的資料是十個還是十萬個是相關的,這個十或十萬就是我們要處理的資料的規模。我們把它叫做n,是乙個變數的話,那我們這個程式所用的時間和空間都跟這個n是有直接關係的。解決乙個問題有很多中不同的方法,你在設計這個方法的時候,一定要把這兩個要素考慮清楚。一不小心,如果空間複雜度太大的話,你那個程式就可能直接爆掉了,非正常中斷,我一會會在後面講,時間複雜度如果太大的話,你就可能等很長時間都等不出結果。時間複雜度
先來看上面中的幾組**,我是用python表示的,你在看的時候考慮兩個問題:
四組**中,哪組的執行時間最短?這裡你會發現我們會用「幾」表示乙個大概,後面還有相應的時間單位,那時間複雜度也參照類似的方法:用什麼方式來體現演算法執行的快慢?
時間複雜度:用來評估演算法執行效率的乙個式子
看上面所示,先說print(『hello world』),它的時間複雜度表示為o(1),o嚴格來說,它表示數學上乙個式子的上界,我們可以簡單的理解為就是乙個估計,大約,相當於上面說的「幾」。1可以理解為是個執行單位(類似於秒這樣的單位),為什麼是o(1),因為print(『hello world』)只執行了一次,同理分析第二個:
for i in range(n):
print('hello world')
它的時間複雜度表示為o(n),因為這組**執行了n次。n還是個單位,同理,分析第三個:
for i in range(n):
for j in range(n):
print('hello world')
它的時間複雜度表示為o(,因為是有兩層迴圈,所以是,看到這個,你是不是感覺很良好,和你猜的差不多是吧,哈哈,不要高興的太早,告訴你們,錯了,它們的時間複雜度不是這樣的。
為什麼?我說了,「1」是單位,但「3」不是單位,3是3乘1,就比如說在生活中,問你一壺水燒多長時間,沒有人回答說是三個幾分鐘或者幾個三分鐘。再說第二個,
所以正確的時間複雜度是這樣的:
第乙個為什麼是o(1),首先print('hello world')列印一次和列印三次實際的影響不大吧,就是不管執行幾次,只要它的規模不上公升到n這麼大的時候,換句話說,1是個單位,所以不管怎樣,因為這是表示近似,不是表示精確的,所以是o(1).好,再看下面這個:
當你的迴圈減半的時候,時間複雜度就會變為o(logn)。所以你可以這樣記,當演算法過程出現迴圈折半的時候,複雜度式子中會出現logn。
時間複雜度小結
常見的時間複雜度(按效率排序)複雜問題的時間複雜度
如何簡單快速地判斷演算法複雜度
空間複雜度
在空間複雜度中需要注意的一點就是理解「空間換時間」,在研究乙個演算法的時候,時間比空間重要。
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...