資料結構:
是指相互之間存在一種或多種特定關係的
資料元素
的集合。聽起來是不是很抽象,簡單理解:資料結構就是描述物件間邏輯關係的學科。比如:佇列就是一種先進先出的邏輯結構,棧是一種先進後出的邏輯結構,家譜是一種樹形的邏輯結構!(初學資料結構的時候很不理解為什麼有「棧」這個東西;佇列很容易理解---無論購物就餐都需要排隊;棧可以認為就是個棧道---只允許乙個人通過的小道,而且只能從一端進入,然後再從這端返回,比如你推了個箱子進去啦,第二個人也推個箱子進去,此時只能等後進來的這個人拉著箱子出去後,你才能退出。)
資料儲存結構:它是計算機的乙個概念,簡單講,就是描述資料在計算機中儲存方式的學科;常用的資料儲存方式就兩種:順序儲存,非順序儲存!順序儲存就是把資料儲存在一塊連續的儲存介質(比如硬碟或記憶體)上----舉個例子:從記憶體中拿出第100個位元組到1000個位元組間的連續位置,儲存資料;陣列就是典型的順序儲存!非順序儲存就是各個資料不一定存在乙個連續的位置上,只要每個資料知道它前面的資料和後面的資料,就能把所有資料連續起來啦;鍊錶就是典型的非順序儲存啦!
陣列、鍊錶、堆疊和佇列是最基本的資料結構,任何程式都會涉及到其中的一種或多種。
陣列是最最基本的資料結構,很多語言都內建支援陣列。陣列是使用一塊連續的記憶體空間儲存資料,儲存的資料的個數在分配記憶體的時候就是確定的:
圖 1.1 包含n
個資料的陣列
訪問陣列中第
n 個資料的時間花費是
o(1)
但是要在陣列中查詢乙個指定的資料則是
o(n)
。當向陣列中插入或者刪除資料的時候,最好的情況是在陣列的末尾進行操作,時間複雜度是
o(1)
,但是最壞情況是插入或者刪除第乙個資料,時間複雜度是
o(n)
。在陣列的任意位置插入或者刪除資料的時候,後面的資料全部需要移動,移動的資料還是和資料個數有關所以總體的時間複雜度仍然是
o(n)
。圖 1.2
向陣列中插入資料
鍊錶是在非連續的記憶體單元中儲存資料,並且通過指標將各個記憶體單元鏈結在一起,最後乙個節點的指標指向
null
。鍊錶不需要提前分配固定大小儲存空間,當需要儲存資料的時候分配一塊記憶體並將這塊記憶體插入鍊錶中。
在鍊錶中查詢第
n 個資料以及查詢指定的資料的時間複雜度是
o(n)
,但是插入和刪除資料的時間複雜度是
o(1)
,因為只需要調整指標就可以:
圖 2.1
鍊錶圖 2.2
向鍊錶中插入乙個資料
圖 2.3
從鍊錶中刪除乙個資料
像上面這樣的鍊錶結構在插入和刪除的時候程式設計會比較困難,因為需要記住當前節點的前乙個節點,這樣才能完成插入和刪除。為了簡便通常使用帶有頭節點的鍊錶:
圖 2.4
帶有頭節點的單鏈表
上面的鍊錶是單鏈表,此外還有雙鏈表,就是節點中包含指向下乙個節點的指標和指向上乙個節點的指標:
圖2.5
雙向鍊錶
不帶有頭節點的雙向鍊錶在插入和刪除資料的時候也不會出現單鏈表那樣的問題。此外還有一種鍊錶是迴圈鍊錶,它是將雙向鍊錶的頭尾相接:
圖 2.6
雙向迴圈鍊錶
向迴圈雙向鍊錶和迴圈鍊錶中插入或者從中刪除資料只是多移動幾個指標。
堆疊實現了一種後進先出的語義
(lifo)
。可以使用陣列或者是鍊錶來實現它:
圖 3.1
堆疊對於堆疊中的資料的所有操作都是在棧的頂部完成的,只可以檢視棧頂部的資料,只能夠向棧的頂部壓入資料,也只能從棧的頂部彈出資料。
佇列實現了先入先出的語義
(fifo)
。佇列也可以使用陣列和鍊錶來實現:
圖 4.1
佇列佇列只允許在隊尾新增資料,在隊頭刪除資料。但是可以檢視隊頭和隊尾的資料。還有一種是雙端佇列,在兩端都可以插入和刪除:
圖 4.2
雙端佇列
1.每個節點至多只有兩個子樹的結構,在父節點中有指向左右子樹的指標
2.遍歷方式
(1)先序遍歷:根–左–右
(2)中序遍歷:左–根–右
(3)後序遍歷:左–右–根
3.查詢二叉樹:左子樹的值小於根節點的值,右子樹的值大於根節點的值,在插入資料時,從根節點開始往下比較,小於比較值則放在左邊,大於比較值放在右邊。插入乙個值的時間複雜度是o(logn)
平衡二叉樹:左右子樹的高度差的絕對值不超過1
資料結構 簡介
資料元素 是組成資料有一定意義的基本單位,比如乙個人的基本資訊包括姓名 性別 年齡等 資料物件 是性質相同的資料元素的集合,比如正整數資料物件n 資料結構 是資料的組織形式,即資料元素之間存在的一種或幾種特定關係 資料型別 是用來刻畫一組性質相同的資料及其上的操作。可以分為原子型別和結構型別。抽象資...
資料結構簡介
程式設計 資料結構 演算法。集合結構 資料間沒有對應關係 集 線性結構 資料間一對一的關係 表 樹形結構 資料間一對多的關係 樹 圖形結構 資料間多對多的關係 圖 順序結構 資料在儲存空間連續儲存 鏈式結構 資料在儲存空間不連續儲存 每一種具體資料儲存可以是兩種結構的組合,如陣列為順序線性儲存 鍊錶...
LRU Cache資料結構簡介
lru是least recently used的縮寫,意思是最近最少使用,它是一種cache替換演算法。什麼是cache?狹義的cache指的是位於cpu和主存間的快速ram,通常它不像系統主存那樣使用dram技術,而使用昂貴但較快速的sram技術。廣義上的cache指的是位於速度相差較大的兩種硬體...