數據結構與算法的基本概念

整理一下數據結構和算法的基本概念:

數組
有序數組是按關鍵字升序或降序排列的,可以使用二分法查找
有序數組的查找速度比無序數組快
有序數組在插入操作中由於所有靠後的數據都需要移動以騰開空間,使用速度較慢
有序數組和無序數組的刪除操作都很慢,因爲數據項必須向前移動來填補已刪除的數據項的洞
有序數組適用於查找頻繁的數據庫,插入和刪除較爲頻繁的時候,無法高效工作

無序數組插入塊,查找慢
有序數組插入慢,查找快

數組創建之後大小就固定了。
數組中每一項佔用一個特定的位置,這個位置可以用一個下標號直接訪問
數組new出來太大導致效率低下,太小導致空間溢出

使用情況:
數據量較小
數據量的大小事先可預測
插入速度重要,用無序數組
查找速度重要,用有序數組,並用二分查找

二分法查找
--大O表示法

比較算法的速度

------------------

鏈表就可以隨插入數據項而擴展大小

簡單排序

冒泡排序

比較相鄰的2個,然後交換順序,然後循環

選擇排序
掃描一遍,找出最小的,放在第0位,再從第1位掃描一遍,找出剩下的最小的,放在第1位

插入排序
先分小組,比較小組裏的大小,在小組中進行排序

速度:
冒泡排序 < 選擇排序 < 插入排序

------------------


棧只允許訪問最後插入的數據項。移除這個數據項之後才能訪問倒數第二個插入的數據項
數組實現的棧會滿
入棧和出棧是棧的兩個最主要的操作
只能查看棧頂元素
棧通常很小,是臨時的數據結構
棧操作所耗的時間不依賴棧中數據項的個數,因此操作時間很短
棧不需要比較和移動操作
棧中最後插入的數據最先移除,後進先出

隊列
第一個插入的數據最先被移除,先進先出
隊同樣可以通過數組和鏈表實現
根據數據量是否可以預知,來確定用數組還是鏈表實現
排隊買票

循環隊列
隊頭指針指向隊尾

雙端隊列
兩端都是結尾的隊列
隊列的每一端都可以插入和移除數據項

優先級隊列
優先級隊列有一個隊頭和一個隊尾,從隊頭移除數據項。
數據項按關鍵字的值有序,這樣關鍵字最小的數據項(或者最大)總在隊頭
插入的時候按照順序插入到合適的位置以確保隊列的順序
可以快速訪問最小關鍵值的數據項
可以相當快的插入數據項

算術表達式
後綴表達式

操作符寫在兩個操作數的後面

中綴表達式
操作符寫在兩個操作數的中間

前綴表達式

------------------

鏈表
鏈表中尋找一個特定元素的唯一方法就是沿着這個元素的鏈一直向下尋找
鏈表需要多少內存就用多少內存,可以擴展到所有可用的內存

單鏈表
對錶頭的插入和刪除 

雙端鏈表
對最後一個鏈結點的引用
保持一個對鏈表最後一個元素的引用
允許在表尾插入數據項

有序鏈表
數據按照關鍵值有序排列
刪除常常只限於刪除在鏈表頭部的最小(或者最大)鏈接點

雙向鏈表
不同於雙端鏈表
傳統鏈表沿鏈表的反向遍歷困難
雙向鏈表,允許向前遍歷,也允許向後遍歷整個鏈表
每個鏈結點有兩個指向其他鏈結點的引用,而不是一個,一個往前指,一個往後指
每次插入或者刪除一個鏈結點的時候,要處理四個鏈結點,而不是兩個
鏈結點佔用的空間也變大了一點
可以從表尾刪除

迭代器
迭代器是隨機訪問鏈表元素的一種方法
迭代器是一個引用,它被封裝在類對象中,這個引用指向相關聯的鏈表中的鏈結點
迭代器方法允許使用者沿鏈表移動迭代器,並訪問當前指向的鏈結點
能用迭代器遍歷鏈表,在選定的鏈結點(或者所有鏈結點)上執行某些操作

有迭代器的鏈表

ADT--抽象數據類型
是一種考慮數據結構的方式,着重於它做了什麼,忽略它是怎麼做的
棧和隊列是ADT,既可以用數組實現,又可以用鏈表實現

使用情況:
存儲數據量不能預知
需要頻繁的插入刪除數據元素
無序鏈表中,插入快,查找和刪除卻很慢(儘管比數組的刪除快一些)
鏈表最好也應用於數據量相對較小的情況

------------------
遞歸
是一種方法(函數)調用自己的編程技術
調用自身是爲了解決更小的問題
存在某個足夠簡單的問題的層次,在這一層算法不需要調用自己就可以直接解答,且返回結果

三角數字
階乘
變位字

二分查找

把數組從中間分成兩半,然後看要查找的數據項在數組的哪一半,再次折半,如此下去

漢諾塔

歸併排序

歸併排序需要在存儲器中有另外一個大小等於被排序的數據項數目的數組。
如果初始數組幾乎佔滿整個存儲器,那麼歸併排序將不能工作
------------------

希爾排序

快速排序

把一個數組分爲兩個子數組,然後遞歸的調用自身爲每一個子數組進行快速排序來實現的

基數排序
把關鍵字拆分成數字位,按數字位的值對數據項進行排序
實現基數排序不需要比較操作

劃分數據就是把數據分爲兩組,所有關鍵字大於特定值的數據項在一組,所有關鍵字小於特定值的數據項在另一組

------------------
二叉樹
結合了有序數組和鏈表
在樹中查找數據項的速度和在有序數組中查找一樣快
插入和刪除數據項的速度和鏈表一樣快
二叉樹的每個節點最多有兩個子節點

二叉樹,有兩個子節點,左邊節點的數值小於節點值,右邊的數值大於節點值
二叉樹中如果插入的是隨機數據,執行效果很好。如果插入的是有序數據或者逆序的數據,速度就會變的特別慢

樹可以提供快速的插入、查找和刪除

前綴表達式

bit:binary digit(二進制數字)
二進制:0和1

哈夫曼樹
消息中出現的字符在樹中是葉節點。它們在消息中出現的頻率越高,在樹中的位置就越高。每個圓圈外面的數字就是頻率。非葉節點外面的數字是它子節點的頻率的和。

------------------
紅黑樹
紅-黑樹,是增加了某些特點的二叉搜索樹,是平衡樹
節點都有顏色
在插入和刪除的過程中,要遵循保持這些顏色的不同排列的規則
每個節點不是紅色的就是黑色的
根總是黑色的
如果節點是紅色的,則它的子節點必須是黑色的(反之倒不一定必須爲真)
從根到葉節點或空子節點的每條路徑,必須包含相同數目的黑色節點

自頂向下插入
自底向上插入

當樹沒有分支的時候,它其實就是一個鏈表

applet 小應用程序
------------------
2-3-4樹
2-3-4樹是多叉樹,它的每個節點最多有四個子節點和三個數據項
2-3-4樹和紅-黑樹一樣是平衡樹
它的效率比紅-黑樹稍差
2、3和4的含義是一個節點可能含有的子節點的個數
非葉節點的子節點數總是比它含有的數據項多1
2-3-4樹最多可以有四個子節點的節點,也可以叫4叉樹

B-樹是另一種多叉樹,專門用在外部存儲來組織數據(外部指主存儲的外部,通常指磁盤驅動器)。B-樹中的節點可以有幾十或幾百個子節點

------------------
哈希表
提供快速的插入和查找操作
哈希表是基於數組的,數組創建後難於擴展
如果不需要有序遍歷數據,並且可以提前預測數據量的大小,哈希表在速度和易用性方面是無與倫比的
哈希表不能提供任何形式的有序遍歷,或對最大最小值元素進行存取。
------------------

堆是一種樹
插入速度快
堆是一種特殊的二叉樹
堆是完全二叉樹,除了樹的最後一層節點不需要是滿的,其他的每一層從左到右都是完全滿的
用一個數組實現
每一個節點的關鍵字都大於(或等於)這個節點的子節點的關鍵字
堆主要用於實現優先級隊列
弱序

------------------

無向圖
可以從任意一邊到另一邊

有向圖
只能從一邊移動到另一邊

帶權圖

深度優先搜索
廣度優先搜索

------------------
通用數據結構:數組,鏈表,樹,哈希表
專用數據結構:棧,隊列,優先級隊列
排序:插入排序,希爾排序,快速排序,歸併排序,堆排序
圖:鄰接矩陣,鄰接表
外部存儲:順序存儲,索引文件,B-樹,哈希方法

------------------

參考書:《Java數據結構和算法》Rorbet Lafore 著 計曉雲等譯 中國電力出版社 第二版


發佈了73 篇原創文章 · 獲贊 11 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章