資料結構,直白地理解,就是研究資料的組織方式和儲存方式。 資料在計算機儲存空間的存放,決不是胡亂的,這就要求我們選擇一種好的方式來儲存資料,而這也是資料結構的核心內容。
資料儲存的目的是為了更好的使用 ,儲存之間具有複雜關係的資料,需要特殊的結構儲存,方便讀取使用;
資料結構是一門學科,它教會我們「如何儲存具有複雜關係的資料更有助於後期對資料的再利用」。
1. 包結構 : 資料元素之間無關係
2. 線性結構 : 資料元素之間是一對一關係
3. 樹形結構 : 資料元素之間是1對多關係
4. 圖形結構 : 資料元素之間是多對多關係
1. 順序儲存結構 : 儲存資料的元素位址是連續的,可以通過索引獲取資料 : 查詢方便, 插入和刪除效能不好
演算法 : 用已知方法,通過編寫程式解決問題.
優秀的演算法:
1. 時間維度, 用最少時間完成計算
2. 空間維度, 用最小記憶體完成計算
需求 : 1+2+3+..+ 100
比較 : 演算法1計算n次得出結果, 演算法2計算1次得出結果, 如果n是持續增大, 演算法1消耗時間肯定增加, 演算法2 基本沒什麼變化永遠一次計算得出結果; 這就是演算法的好處;/**
* 演算法1
*/private static int cal(int n)
return sum;
}/**
* 演算法2
*/private static int cal2(int n)
事後分析 : 觀察法和實驗室,直接比較兩演算法的執行時間, 得出那種演算法更優
事前分析 :
演算法採用的策略, (需要考慮的)
編譯**的質量 (沒辦法考慮)
問題輸入規格 (需要考慮)
機器指令的執行速速 (沒辦法考慮)
演算法分析一般需要考慮採用的策略和輸入的規格, 輸入的資料量的大小,應該採用不同策略;
時間複雜度分析法 :
1. 輸入規模n的增加, 判斷執行次數的多少, 可以模擬執行需要的時間
2. 分析** .去除變數定義的次數, 去除迴圈判斷的次數, 只分析核心計算**
對於兩個函式f(n)和g(n), 隨著n的增長,存在乙個點n, n>n的情況, f(n) > g(n) , 說明f(n)的漸進增長快於g(n)
na1(2n+3)
a2(2n)
b1(3n+1)
b2(3n)15
2432
7476
39610
981916
2524921
1828
2710
2320
3130
100203
200301
300比較分析 : 當n>2時候, b1的漸近增長大於a1,
隨著n的不算增大, a1和a2, 基本沒什麼差別, b1和b2也沒什麼差別,所以說常數影響不大
比較 : b1和b2是平方增長, 演算法明顯大於a1和a2, 隨著n的不斷增大, b1和b2演算法的差別也不會特別明顯, 也就是說最高係數的常數影響在不斷減小.
演算法a1 : 2n^2+3n+1
演算法a2 : n^2
演算法b1: 2n^3+3n+1
演算法b2: n^3
實際的計算就不寫了, 肯定3次方的漸進增長最大的, b1和b2比較, 也差別不大, 結論,低次冪的影響很小.主要是是高次冪影響
演算法1 : n^3
演算法2: n^2
演算法3: n
演算法4: logn
演算法5: 1
結論: 演算法中最高次冪決定複雜復
時間度量 t(n) = o(f(n))
f(n) 表示執行次數
表示原則 :
常數忽略,只有常數轉換為1
最高次冪常數因子忽略
只保留高階
例項 :
演算法a1 : 2n^2+3n+1 大o標記 o(n^2)
演算法a2 : n^2 大o標記 o(n^2)
演算法b1: 2n^3+3n+1 大o標記 o(n^3)
演算法b2: n^3 大o標記 o(n^3)
常見大o階
1. 線性階o(n) 累加求和, 也就是for迴圈1一次
2. 平方階o(n^2) 兩次for迴圈巢狀, 氣泡排序
3. 立方階o(n^3) 三層for迴圈
4.對數階o(logn) 二分查詢
5.常數階o(1) 高斯公式計算求和
複雜度從低-高
o(1)
複雜度分析 : 需要從最壞情況分析,比如排序,完全逆序排序,
空間複雜度分析,需要分析,演算法每次計算占用多少記憶體, n增加 需要的記憶體是不是巨量增大, 目前演算法主要是考慮時間複雜度, 空間複雜度,需要在特別消耗記憶體的演算法中考慮. 一般的演算法不是特別消耗記憶體.
資料結構與演算法(一) 資料結構與演算法概念
資料結構是計算機儲存 組織資料的方式。資料結構是指資料與資料之間的關係。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。邏輯結構 示意圖1 集合結構 2 線性結構 3 樹形結構 4...
資料結構與演算法(一)
物件導向程式設計方式 1.使用自定義類封裝陣列 2.新增類方法來實現資料操作。無序陣列 增 刪 改 查 更 顯 public class myarray public myarray int maxsize 新增資料 public void insert long value 顯示資料 public...
資料結構與演算法一
遞迴 無限呼叫自身這個函式,每次呼叫總會改動乙個關鍵變數,直到這個關鍵變數達到邊界的時候,不再呼叫。遞迴與迴圈的區別?相同點 1 都是通過控制乙個變數的邊界 或者多個 來改變多個變數為了得到所需要的值,而反覆而執行的 2 都是按照預先設計好的推斷實現某乙個值求取 請注意,在這裡迴圈要更注重過程,而遞...