數據結構
文章更新中
文檔版本 | 修訂時間 | 修訂內容 | 修訂人 |
---|---|---|---|
1.0.0 | 18/12/27 | 初稿 | Wagsn |
通常來說,一個數據結構DS 可以表示爲一個二元組:
DS=(D,S) //data-structure=(data-part,logic-structure-part)
這裏D是數據元素的集合(或者是“結點”,可能還含有“數據項”或“數據域”),S是定義在D(或其他集合)上的關係的集合,S = { R | R : D×D×…},稱之爲元素的邏輯結構。
邏輯結構有四種基本類型:
集合結構、線性結構、樹狀結構和網絡結構。
表和樹是最常用的兩種高效數據結構,許多高效的算法可以用這兩種數據結構來設計實現。
表是線性結構的(全序關係),樹(偏序或層次關係)和圖(局部有序(weak/local orders))是非線性結構。
四種基本結構 1
通常有下列四類基本的邏輯結構:
- ⑴集合結構。該結構的數據元素間的關係是“屬於同一個集合”。
- ⑵線性結構。該結構的數據元素之間存在着一對一的關係。
- ⑶樹型結構。該結構的數據元素之間存在着一對多的關係。
- ⑷圖形結構。該結構的數據元素之間存在着多對多的關係,也稱網狀結構。
容器分類:
- 無序 重複 Collection
- 有序 重複 List
- 無序 互異 Set
- 有序 互異 Ordered Set
存儲結構:
- 順序 Array
- 鏈式 Link
順序存儲和鏈接存儲是數據的兩種最基本的存儲結構。
Collection
// Collection 容器 無序 重複
Collection<E> : Iterable<E> {
push (E) => Void;
remove (E) => E;
contains (E) => Bool;
foreach (action: E => Void) => Void;
count () => Int;
}
集合結構
定義
若x是集合A的元素,則記作x∈A。集合中的元素有三個特徵:
- 1).確定性(集合中的元素必須是確定的)
- 2).互異性(集合中的元素互不相同。例如:集合A={1,a},則a不能等於1)
- 3).無序性(集合中的元素沒有先後之分),如集合{3,4,5}和{3,5,4}算作同一個集合。
僞代碼
// Set 集合結構(無序,互異)Collection<E>(無序,重複)Iterable<E>(可迭代)繼承樹中限制越小越在上層
Set<E> : Collection<E> {
// 子集,如果集合A的任意一個元素都是集合B的元素(任意a∈A則a∈B),那麼集合A稱爲集合B的子集,記爲A⊆B或 B⊇A,讀作“集合A包含於集合B”或集合B包含集合A”。
// 即:∀a∈A有a∈B,則A⊆B。
containsAll (other: Set<E>) => Bool {
for(ele in other) {
if(!caller.contains(ele)) { // contains x∈A
return false;
}
}
// 如果other爲空集,空集是任意集合(包括空集)的子集。
return true;
}
// 並集 -由所有屬於集合A或屬於集合B的元素所組成的集合
// A∪B={x|x∈A,或x∈B};∅∪A=A
addAll (other: Set<E>) => Set<E> {
result: Set<E> := Set<E>();
for(ele in caller) { // "caller" is the instance of type Set<E>
result.push(ele);
}
for(ele in other) {
if(!result.contains(ele)) {
result.push(ele);
}
}
return result;
}
// 交集,由屬於A且屬於B的相同元素組成的集合
retainAll (other: Set<E>) => Set<E> {
result: Set<E> := Set<E>();
for(ele in other) {
if(caller.contains(ele)) {
result.push(ele);
}
}
return result;
}
// 相對補集,由屬於A而不屬於B的元素組成的集合,稱爲B關於A的相對補集
removeAll (other: Set<E>) => Set<E> {
result: Set<E> := Set<E>();
for(ele in caller) { // "caller" is the instance of type Set<E>
result.push(ele);
}
for(ele in other) {
if(caller.contains(ele)) {
result.remove(ele);
}
}
}
}
線性結構
分類
- 線性表 List 可索引
- 隊列 Queue 先進先出
- 棧 Stack 後進先出
- 映射 Map 鍵值映射
線性表
僞代碼
// List 線性表,可索引的 Indexable<Int, E> <=> this(index: Int)=>E
List<E> : Colletion<E>, Indexable<Int, E> {
// var list = List<Int>(); var int0 = list(0); 00
this (index: Int) => E;
get (index: Int) => E;
set (index: Int, e: E) => Void;
remove (index: Int) => E;
// 查詢元素的索引
indexOf (e: E) => Int {
for(i=0; i<caller.count(); i++) {
if (caller.get(i).equals(e)) {
return i;
}
}
return -1;
}
// 獲取子表
subList (fromIndex: Int, toIndex: Int) => List<E>{
result := Lsit<E>();
for(i=fromIndex; i<toIndex; i++){
result.push(caller.get(i));
}
return result;
}
}
樹形結構
- 樹 Tree
- 普通樹 Tree
- 二叉樹 Binary Tree
- 完全二叉樹 堆 Heap 1
- B樹 B Tree
- B+樹 B+ Tree
- 森林
圖形結構
定義:
圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示爲:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。
在圖中需要注意的是:
- (1)線性表中我們把數據元素叫元素,樹中將數據元素叫結點,在圖中數據元素,我們則稱之爲頂點(Vertex)。
- (2)線性表可以沒有元素,稱爲空表;樹中可以沒有節點,稱爲空樹;但是,在圖中不允許沒有頂點(有窮非空性)。
- (3)線性表中的各元素是線性關係,樹中的各元素是層次關係,而圖中各頂點的關係是用邊來表示(邊集可以爲空)。
分類:
- 平行邊
- 多重圖 含平行邊的圖稱爲多重圖。
- 簡單圖 既不含平行邊也不包含自環的圖稱爲簡單圖。
- 連通性
- 連通圖 任意兩個頂點是相通的就是連通圖
- 有向性
- 無向圖
- 有向圖
- 有向無環圖
- AOV
- AOE
- 有向無環圖