資料結構(一)——資料結構基礎
程式=資料結構+演算法
越工作越發現業務程式碼是很容易的,框架也是舊瓶裝新水,大體差不多。
那麼好的程式碼的區分在於演算法,效能這些的差距。而資料結構是演算法實現的基礎,演算法總是要依賴某種資料結構來實現的。
好久沒有仔細看資料結構了,最近被頻繁的演算法,奈何我資料結構基礎不好。決定好好複習一遍,並輸出一份文件。
一.資料結構
1.什麼是資料結構?
資料結構是指相互之間存在一種或多種關係的資料元素的集合和該集合種資料元素之間的關係組成。
通俗說就是資料和資料之間的關係。
2.資料的儲存結構
- 順序儲存結構
順序儲存結構是把資料元素存放在地址連續的儲存單元裡,其資料間的邏輯關係和物理關係是一致的。
順序儲存結構適用於頻繁查詢時使用。
陣列是順序儲存結構的典型代表。
- 鏈式儲存結構
鏈式儲存結構中,相鄰資料元素可隨意存放,但所佔儲存空間分兩部分,一部分存放結點值,另一部分存放表示結點間關係的指標。
鏈式儲存結構適用於在較頻繁地插入、刪除、更新元素時使用。
連結串列是鏈式儲存結構的典型代表。
3.資料的邏輯結構
資料和資料本身之間的關係。
- 集合結構
集合結構中的資料元素同屬於一個集合,他們之間是並列的關係,除此之外沒有其他的關係。
- 線性結構
線性結構中的元素存在一對一的相互關係。
如一維陣列,佇列,棧。
- 樹形結構
樹形結構中的元素存在一對多的相互關係。
- 圖形結構
圖形結構中的元素是一種多對多的關係。
4.常用的資料結構
常用的資料結構有以下八種:
(1)陣列(Array)
(2)連結串列(Linked List)
(3)佇列(Queue)
(4)棧(Stack)
(5)樹(Tree)
(6)圖(Grapth)
(7)堆(Heap)
(8)散列表(Hash)
二.演算法
1.定義
演算法是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表這用系統的方法描述解決問題的策略機制。
2.演算法的特性
- 輸入:演算法可以有0到多個輸入。
- 輸出:演算法至少要有一個輸出。
- 有窮性:演算法在有限的步驟可以執行出結果。
- 確定性:結果的確定性,一個輸入對應一個輸出。
- 可行性:演算法能夠解決實際問題。
3.演算法的基本要求
- 正確性:完成的演算法要能正確的解決問題。
- 可讀性:有一定的可讀性,讓其他人能看懂,便於閱讀、理解和交流。
- 健壯性:當輸入資料不合法時,也能做出相關處理。
- 時間複雜度:演算法的執行時間,執行時間短的效率高,時間長的效率低。
- 空間複雜度:演算法在執行過程中需要的儲存空間。
來看一道最簡單的演算法:
package cn.kimtian.array.one;
/**
* 求從1加到指定數字的和
* @author kimtian
**/
public class AddOneToNums {
public static void main(String[] args) {
long total = 0;
long end = 999999999;
Long a = System.currentTimeMillis();
/**
* 第一種方式:迴圈從1加到100
**/
for (long i = 1; i <= end; i++) {
total += i;
}
Long b = System.currentTimeMillis();
System.out.println("第一種方式結果:"+total+",耗時:"+(b-a));
/**
* 第二種方式:迴圈從1加到100
**/
long total2 = 0;
Long c = System.currentTimeMillis();
total2 = (end + 1) / 2 * end;
Long d = System.currentTimeMillis();
System.out.println("第二種方式結果:"+total2+",耗時:"+(d-c));
}
}
執行結果可以發現,第二種方式執行時間更短。
這就是兩種解決方式時間複雜度的不同。
不過時間複雜度和空間複雜度是相輔相成的,不能過於偏重一個而忽略另一個。有的演算法執行時間很短,卻是以消耗大量記憶體作為前提。所以說沒有最好的演算法,只有最合適的演算法。