1. 程式人生 > 實用技巧 >演算法與資料結構總覽

演算法與資料結構總覽

基本結構

0.線性結構幾種典型:資料項之間只存在先後的次序關係
			棧
			
			佇列
			
			雙端佇列
			
			列表
				無序表:僅有相對位置
				
				有序表:按照一定順序存放,如大小順序

1.棧(stack)---FILO先進後出
	只允許在棧頂操作
	用python最基本的資料型別(列表,字典)的列表就可以實現棧結構
	
	棧的應用:
			1.括號匹配
			
			2.十進位制轉二進位制
			
			
			公式表示法:字首 中綴 字尾post_fix 
				實際上計算機中使用的不是按照操作優先順序的順序的數學中的中綴式,一般使用的是是字首。
			
			3.
				表示式轉換:中綴in_fix---->字首pre-fix
				字尾表示式求值
				
				
2.佇列queue----先進先出FIFO
	僅有一個入口,一個出口 
	應用:
		1.印表機等待
		2.鍵盤IO緩衝區
		
3.雙端佇列Deque:
	本質:兩端都可以插入和彈出,集成了棧和佇列的性質
	
	應用:迴文詞判定
		迴文詞:正序反序相同,如“上海自來水來自海上”
	
4.列表
	無序表和有序表
	實現方式:連結串列---助於高效利用記憶體

遞迴

分治策略與遞迴呼叫:
		縮小規模,分而治之

		遞迴呼叫的實現:三定律
			1.必須具備基本結束條件
			2.必須要減小規模,改變狀態,向基本結束條件演進
			3.遞迴演算法必須呼叫自身
		
		遞迴的應用

貪心策略與優化問題:

            動態規劃

            應用:找零問題
		1.動態規劃解法
		2.遞迴解法

排序與查詢

1.各種排序查詢演算法:
                    二分,
                    冒泡,
                    插入,
                    希爾,
                    歸併,
                    快排

2.雜湊函式及衝突解決

樹 Tree

   資料處理的永恆主題:
	快速儲存
	高效查詢
	遞迴演算法在樹及圖中都有廣泛應用

  樹的巢狀列表實現
  
  樹的應用:
	解析樹
	* 編譯生成目的碼
	* 表示式解析
樹的遍歷:
	前序
	中序
	後序

優先佇列和二叉堆
	優先佇列的應用:設定作業系統排程程序的優先順序
	優先佇列的定義:
			出隊:和普通佇列相同,隊首出隊
			入隊:按照資料的優先順序,優先順序越高排在資料越前面。
			性質:入隊O(1),出隊O(n)
	用二叉堆實現優先佇列,降低演算法複雜度,入隊和出隊複雜度都在O(log n)

二叉堆heap:基於非巢狀列表實現

二叉查詢樹binery search tree---BST

在各種插入等操作後依然能保持樹的平衡很重要,能夠提升查詢等演算法的效能。
因此下面討論,如何維持平衡。

AVL樹(平衡二叉樹):所有節點的平衡因子都在-1,0,1之間。
	平衡因子balance-factor:左右子樹的高度差
	可以將增刪改查複雜度保持在O(log n)
	
散列表:O(1)--->O(n)

一般來說要求不高可以用散列表,其次是AVL樹來優化。 

圖 Graph

圖的實際存在:
	社交網路
	網際網路計算機通訊
	交通路線
	網際網路的網頁節點

6度關係理論

社交28原則

圖的組成:
	Vertex(Node)
	Edge(Arch):邊的定義---頂點和頂點之間的連線,一般用Edge:(Node1,Node2,weight)定義
	權重weight:邊的屬性,即代價。
	
圖的定義:G = (V,E)

路徑Path:無權路徑算是1,有權路徑就是所有邊的權之和

圈(環):Cycle
	路徑首尾頂點相同的路徑,如(v1,v3,v4,v1)
	
如果有向圖中不含環,則稱為“有向無環圖”:Directed acyclic graph:DAG
	如果一個問題能表示成DAG,就可以用圖演算法很好的解決(實質上樹就是一種特殊的有向無環圖)


抽象資料型別 ADT:圖的實現
	1.鄰接矩陣
		表示圖中所有頂點的連線關係
		
		類似協方差矩陣那樣,如果頂點有邊相連則賦予行列值(1或權值),否則為0
			優點:實現簡單
			缺點:實際問題大都是稀疏問題---邊的數目<<Node^2,導致儲存效率低。
			
	2.鄰接列表
		維護一個所有頂點組成的主列表master-list,然後每個頂點又儲存一個元組,元組中是有邊相連的頂點和權值。
		優點:儲存緊湊高效。
		
     每種資料結構都是按照 定義,程式碼實現,及應用 介紹的。
	
	
  圖的應用:

1.詞梯問題
		每次只變換1個單詞,有哪些路徑使單詞相同(4個字母單詞,共5000多個)
		最終,鄰接矩陣只有0.2%的連線
		
廣度優先搜素:BFS---實現核心:建立佇列儲存

	每次path路徑長度+1

2.騎士周遊問題:
	8*8棋盤,按馬走日的走法剛好走完一次
	
	深度優先搜尋:DFS-----實現核心:遞迴呼叫
	每次都儘可能地將path深入下去,路徑長度超出了依然沒搜尋到,就返回上一層繼續深入。每次都儘可能地將path深入下去,路徑長度超出了依然沒搜尋到,就返回上一層繼續深入。
	
	首先建圖,最終鄰接矩陣8.2%,也是稀疏矩陣
	
	改進:
		將 先驗知識 加入演算法改進效能----啟發式規則
		經常用於AI領域,有效減少搜尋範圍,更快搜索到目標。
		
3.通用的深度優先搜尋演算法


4.拓撲排序

5.強連通分支:
	定義:
		1.所有頂點之間必須相通,至少是有路徑
		2.是圖的最大的子集
		
	轉置圖:將圖的邊的向全部改變
	
6.最短路徑問題:Dijkstra演算法---只能處理所有的權>1的圖,否則陷入死迴圈
	資訊在路由器網路中傳播速度的最快路徑
	邊的權:網路負責,網路連線的速度
	
	
7.最小生成樹

	應用:遊戲中訊息廣播
	
		生成樹定義:擁有圖中 所有頂點 以及 最少數量的邊,以保持連通的子圖。(無圈,因為是樹)
		(代價/權重)最小生成樹:邊的 權重之和 最小的生成樹。
		
	經典演算法:Prim演算法---貪心本質
			每步都沿著最小權重的邊向前搜尋。
		步驟:
			1.所有的可安全新增的邊(一端頂點在樹中,另一端不在樹中,保持樹的無環性)
			2.遍歷上面所有邊找到一條權重最小的path

學習一門課程的思路

			1.快速過一遍簡單的概論課程,建立框架感(第一遍就當概論聽)-----知止
			2.再學習一門課程以深入課程內容