數據結構

數據結構

文章更新中

文檔版本 修訂時間 修訂內容 修訂人
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

參考:
4種基本數據結構
淺析數據結構-圖的基本概念
數據結構之圖的基本概念
基本數據結構――堆的基本概念及其操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章