1. 程式人生 > >我的算法筆記---上

我的算法筆記---上

數據結構 算法

數據結構和算法讀書筆記



1.疑惑:數據結構和算法是什麽啊?有毛用啊?


數據結構:數組、鏈表、棧、二叉樹、哈希表

算法:對結構中數據的處理

算法和數據結構的作用: 現實世界數據存儲(家庭地址的存儲) 現實世界建模(圖) 程序員工具


算法概述:增刪查 遍歷 排序 遞歸


專業術語:數據庫 記錄 字段 關鍵字(限定詞帶出記錄,記錄中包含所有字段,全部記錄構成數據庫)



過程性語言的問題:

程序與現實世界缺乏對應關系

程序內部結構出現問題,

重視方法,不重視數據,粗糙的數據組織結構,

對象的特征:

對象同時包括方法和字段

類是對象的說明

創建對象,new和類的名稱連用

.調用對象的方法

Java數據結構的類庫:java.util.*


2.數組

數組又啥好學的呢?

特點:數據項已知 數組的長度固定 非空數據項連續存儲、不能有空

插入快(數據項)

查找慢(n/2)

刪除慢(n/2查找 n/2移動)


允許重復值條件下的算法、不允許從復制條件下的算法之間的比較

不要太匆忙:算法的緩慢但有條不紊的本質


Java中數組的基礎知識:略 數組的索引該由誰負責,調用者又在關註什麽?

數據結構的隱藏 各司其職 arr.setEle(k,arr.getEle(ke+1)) 進化到 arr.set(value)


有序數組:

線性查找:找到比自己大的就退出查詢

二分查找:二分法查找顯著提升速度 log2n對數

查詢快、插入慢


算法的比較,大O表示法:O(1) O(logN) O(N) O(N平方)

無序數組插入:常數

線性查詢:與N成正比

二分查找:與logN成正比


為什麽不使用數組表示一切?數組缺點導致的,慢、固定長度




3.簡單排序

計算機不如人類的地方啊?不夠智能啊


冒泡排序:冒泡,冒泡,顧名思義啊,怎麽一個冒泡法:把最比較出來,放在最邊上

算法效率:(n-1)+(n-2)+(n-3)...+1=n*(n-1)/2 O(n2)級別

不變性:out右邊的數據項總是有序的


插入排序:部分有序 部分無序

比較次數:概率論的角度。最大:n*(n-1)/2 平均:n*(n-1)/2/2 最小:比冒泡排序減少1半的比較量

不變性:比outer變量下標號小的數據項都是局部有序的

排序規則:compareTo()方法


算法性能比較規則:大O表示法

算法穩定性:具有相同關鍵字的數據項,經過多次排序,他們的順序保持不變,這樣的排序就是穩定的

不變性:=規律性



4.棧和隊列、優先隊列。 只有先幹完一件事才能幹另一件事情

用途不同:數組--數據庫 棧隊列作為程序員的工具

受限訪問:數組--任意訪問 棧隊列特定時刻只能有一個數據項被操作

更加抽象:可以基於其他數據結構


棧:3*(4+5)很吊 只是一個概念、抽象

精辟:優先級低的項目被壓到棧底,等待回來執行

棧的容量:小

棧的實例:reverse、分隔符匹配

效率:O(1)



隊列:排隊 指針的移動提高效率

循環隊列:“緩沖環” 連續序列 折斷序列

大量的插入和移除操作的時候,數據項統計影響性能

isFull、isEmpty沒有數據項計數字段的隊列實現?邏輯啊,大腦啊

效率:O(1)


雙端隊列:功能繁多=雙端隊列+棧+隊列。

我的算法筆記---上