思考一下我們如何評估演算法時間開銷呢?所以我們需要事前預估。引入時間複雜度我們可以讓演算法先執行,事後統計。但是會出現以下幾個問題:
1.不同機器的效能不同
2.程式語言不同,越高階越慢
3.一些演算法不能事後統計
4.和編譯程式產生的機器指令質量有關
實際上就是時間開銷t(n)與問題規模n的關係
上述**中:
1執行了1次
2執行3001次
3執行3000次
4執行1次
所以:t(3000)= 1+3001+2*3000+1
轉換為表示式為t(n)=3n+3
思考這個問題:如果表示式中有高次我們怎麼處理?是否可以忽略表示式某一部分?
答案是肯定的
如果出現高次,我們只取最高項,並且也忽略這一項的係數
我們用大o表示同階,同等數量級。函式舉例階階數所以我們表示式可以簡化為:t= o(n),t=o(n²)……
12o(1)
常數階2n+3
o(n)
線性階3n2+2n+1
o(n2)
平方階5log2n+20
o(logn)
對數階2n+3nlog2n+19
o(nlogn)
nlogn階
6n3+2n2+3n+4
o(n3)
立方階2n
o(2n)
指數階消耗時間順序:常對線,冪指階
o(1) < o(log2n) < o(n) < o(nlog2n) < o(n2) < o(n3) < o(2n) < o(n!) < o(nn)
多層巢狀時,分析最深層的加法規則:o(f(n)) + o(g(n)) = o(max(f(n),g(n)))
乘法規則:o(f(n)) * o(g(n)) = o(f(n)*g(n))
假設有乙個從1到n亂序的陣列。
乙個迴圈從陣列第乙個元素查詢元素n。會出現下面三種情況:
最壞時間複雜度:n在最後乙個位置
平均時間複雜度:n在任意位置,概率1/n,迴圈次數x= (1+2+3+…+n)1/n=(n*(1+n)/2)*1/n=(1+n)/2
最好時間複雜度:n在第乙個位置
可以看出演算法執行時間可能與輸入的資料有關
資料結構,演算法,時間複雜度
什麼是資料結構 data structure 中文維基百科 維基百科中文版 在電腦科學中 是計算機中儲存 組織資料的方式。資料結構意味著介面或封裝 乙個資料結構可被視為兩個函式之間的介面,或者是由資料型別聯合組成的儲存內容的訪問方法封裝。不同種類的資料結構適合不同種類的應用,部分資料結構甚至是為了解...
資料結構 演算法的時間複雜度
如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的 漸近時間複雜性 我們常用大o表示法表示時間複雜性,注意它是某乙個演算法的時間複雜性。大o表示只是說有上界,由定義如果f ...
資料結構 演算法 03
1.棧結構實現 棧可以用順序表實現,也可以用鍊錶實現。棧的操作 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 peek 返回棧頂元素 is empty 判斷棧是否為空 size 返回棧的元素個數 2.佇列 佇列 queue 是只允許在一端進行...