演算法是對解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。
演算法的特性:零個或多個輸入、乙個或多個輸出、有窮性(有限步驟)、確定性(每一步都有確定的含義,不會出現二義性)、可行性(每一步都必須可行,即每一部都能通過執行有限次數完成)
演算法設計的要求:正確性(即滿足演算法的特性)、可讀性(便於閱讀、理解和交流)、健壯性(即能對不合理情況做出相應的處理,而不是產生異常)、時間效率高和儲存量低
演算法的時間複雜度:在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度也就是演算法的時間度量,記作:t(n)=o(f(n))。它表示隨著問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱為時間複雜度。其中f(n)是問題規模n的某個函式。
常數階:o(1)
以求和演算法為例:
int sum = 0, n = 100; //執行一次
sum = (1 + n)*n / 2; //執行一次
printf("%d", sum); //執行一次
線性階:o(n)
下面**中迴圈體中的**要執行n次
int i;
for (i = 0; i < n; i++)
對數階:o(logn)
下面例子為有多少個2相乘後值大於n,即以2為底n的對數
int count = 1;
while (count < n)
平方階:o(n^2)
迴圈巢狀語句
內層迴圈語句時間複雜度為o(n),外層迴圈不過是內層時間複雜度為o(n)的語句再迴圈n次,即為n^2
int i, j;
for (i = 0; i < n; i++)
}常用的時間複雜度所耗費的時間從小到大依次是:
o(1)2)3)n)n)
初識資料結構
本人是乙個大三的學生,最近在看資料結構,也是第一次寫自己的部落格,有錯勿噴。可能在大學的學生都覺得資料結構是比較難的一門課程,也有許多難掌握的知識。但是在自己多次實踐過後就感覺沒有那麼困難,還是很容易掌握的。在學習過後我覺得資料結構的順序儲存就相當於陣列,陣列大家應該都不陌生吧。接下來我就給大家看一...
初識資料結構
資料結構 是將現實中大量而複雜的問題以特定的資料型別以及特定的儲存結構儲存到記憶體中,以及在此基礎上為實現某個功能而執行的相應操作 演算法 一 線性結構 連續儲存 陣列 離散儲存 鍊錶 線性結構常見應用 棧 資料結構中沒有堆,棧即堆疊 佇列 二 非線性結構 樹 圖三 查詢與排序 折半查詢 快排 冒泡...
初識資料結構
複雜度 粗略衡量演算法好壞的刻度尺。工具 兩個維度 快慢 時間複雜度 使用空間的情況 空間複雜度 之間利用允許時間衡量不現實。測試環境多變,不好控制變數。前提 如果指定的cpu的情況下,單位時間內執行的基本指令的個數是固定的。如果乙個演算法需要的指令比另乙個演算法需要的個數小,就可以推算a執行的更快...