春招筆記(十五) 資料結構第一部分

2021-09-12 12:58:55 字數 4156 閱讀 9977

資料結構:資料之間相互存在的一種或多種特定關係的元素的集合。

邏輯結構分類:集合結構,線性結構,樹形結構,圖形結構。

物理結構分類:順序儲存,鏈式儲存 。

1.二叉樹

先來看看什麼是樹。樹中基本單位是結點,結點之間的鏈結,稱為分支。一棵樹最上面的結點稱之為根節點,而下面的結點為子結點。乙個結點可以有0個或多個子結點,沒有子結點的結點我們稱之為葉結點。

二叉樹是指子結點數目不超過2個的樹,它是一種很經典的資料結構。而二叉搜尋樹(bst)是有序的二叉樹,bst需要滿足如下條件:

若任意結點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;

若任意結點的右子樹不空,則右子樹上所有節點的值均大於或等於它的根節點的值;(有些書裡面定義為bst不能有相同值結點,本文將相同值結點插入到右子樹)

任意結點的左、右子樹也分別為二叉查詢樹

typedef struct btnode btnode;

* 每個節點最多只有乙個父節點

* 節點擁有子樹數稱為節點的度

*度為0的節點稱為葉子節點。

*樹的度樹內部個節點度的最大值

* 節點的層次從根開始定義,根為第一層總層數即為樹的深度

* 森林是不相交的樹的集合

* **滿二叉樹**:每個節點都有個子節點,所有葉子都在同一層

* **完全二叉樹**:完全二叉樹是由滿二叉樹而引出來的。對於深度為k的,有n個結點的二叉樹,當且僅當其每乙個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應時稱之為完全二叉樹。

* 前序遍歷(根節點-左節點-右節點) ,中序遍歷(左節點-根節點-右節點),後序遍歷(左節點-右節點-根節點)。

* 除了迭代,棧也可以實現二叉樹的遍歷

* **搜尋(查詢)二叉樹**:任何乙個結點,它的左子樹的所有結點都比這個根結點要小,它的右子樹的所有結點都比這個根結點要大。

* 如果一棵二叉樹按照中序遍歷得到的序列時有序的,那麼這棵二叉樹一定是搜尋二叉樹。

* treeset:

* 內部填裝資料需要繼承comparable<>方法,並實現compareto方法。

* compareto方法返回1,表示新插入的元素比被比較元素大,會插在樹的右側;如果為0表示相同,會捨棄該值。

* treemap:

* 本質為紅黑樹

2.棧

* 後進先出

* 棧的經典應用:

* 波蘭表示式 : 中綴表示式轉字尾表示式(數字輸出,運算子進展,括號匹配出戰,棧頂優先順序低出棧)。

* 字尾表示式的計算。

* 通過維護 node 連線來實現

3.佇列

* linkedlist實現了queue的介面

* 先進先出。先出的一端為隊頭,另一端為隊尾。

* linkedlist就是天生的佇列實現。

4.順序儲存方式線性表(arraylist)

* 順序儲存方式線性表(arraylist):查詢效率高,插入刪除效率低(arraylist刪除元素後,後面元素會向前位移)

* arraylist的本質是維護了乙個物件陣列,對arraylist的增刪改查即對陣列進行操作

* 1. list介面中有sort方法,需要實現comparator方法就能進行排序

* 2. list介面繼承collection,collection整合iterable

* 3. system.arraycopy  是用於複製陣列的native方法,應學會使用。

*  vector:

*  向量佇列,它是jdk1.0版本新增的類。

*  和arraylist類似,內部維護乙個物件陣列。

*  vector 實現了randmoaccess介面,即提供了隨機訪問功能。

*  vector中的操作是執行緒安全的,但比arraylist稍微慢。

5.  鏈式儲存方式線性表(linkedlist)

* 鏈式儲存方式線性表(linkedlist):插入效率高,查詢效率低

* 通過內部維護連線 node物件 來實現鏈式儲存結構

6.雜湊表

* key存在set集合中(set中資料不能相同),value存在collection中(可以相同)。

* 無序集合,多執行緒下不安全

* hashmap預設初始化大小16,負載因子0.75

* hashmap元素的key可以為空,key對應的index可以相同(鍊錶)

* jdk 1.8 以前 hashmap的實現是陣列+鍊錶,即使雜湊函式取得再好,也很難達到元素百分百均勻分布。

* 針對這種情況,jdk 1.8 中引入了 紅黑樹(查詢時間複雜度為o(logn))來優化這個問題,

* 紅黑樹是自動平衡的二叉查詢樹,通過變色,左轉,右轉來實現平衡。

7.鏈式雜湊表

* node每個節點新增頭尾指標,構成雙向鍊錶

* lrucache的實現(linkedhashmap預設插入排序,需要配置乙個布林值accessorder來設定呼叫排序)。

* linkedhashmap的實現就是hashmap+linkedlist的實現方式,以hashmap維護資料結構,以linklist的方式維護資料插入順序。

* next是用於維護hashmap指定table位置上連線的entry的順序的,before、after是用於維護entry插入的先後順序的。

* 迭代hashmap的順序並不是hashmap放置的順序,linkedhashmap有順序,插入順序或者呼叫順序,預設採用插入。

* 執行緒不安全

* 該迴圈雙向鍊錶的頭部存放的是最久訪問的節點或最先插入的節點,尾部為最近訪問的或最近插入的節點,迭代器遍歷方向是從鍊錶的頭部開始到鍊錶尾部結束,在鍊錶尾部有乙個空的header節點,該節點不存放key-value內容,為linkedhashmap類的成員屬性,迴圈雙向鍊錶的入口。

* header的目的是為了記錄第乙個插入的元素是誰,在遍歷的時候能夠找到第乙個元素。

* 注意這個header,hash值為-1,其他都為null,也就是說這個header不放在陣列中,就是用來指示開始元素和標誌結束元素的。

8.圖

* 圖的鄰接表的實現

* 圖中的元素稱為頂點,頂點之間的連線叫做邊,邊分為無向邊和有向邊,有向邊也稱為弧,弧有弧頭和弧尾。

* 弧有與之對應的數字,成為權。

* 任意兩點之間是聯通的,稱為連通圖。

* 圖中乙個頂點可以連線無數個頂點

* 無向圖定點的邊數叫度,有向圖頂點的邊數叫出度和入度。

* 圖的實現:1. 鄰接矩陣(乙個一維陣列表示頂點資訊,乙個二維陣列儲存弧的資訊)。

* 圖的實現:2.  鄰接表(散鏈列表)

* 圖-臨接矩陣實現

* 圖的兩種遍歷:深度優先遍歷,廣度優先遍歷

* 圖的最小生成樹的兩種演算法:普利姆演算法,克魯斯卡爾演算法

* 最短路徑:迪傑斯特拉演算法

* 最小生成樹:

* 普利姆演算法:

* 獲取乙個頂點a和它連線的頂點陣列x,然後連線權值最小的頂點b,並將b連線的頂點陣列合併到x,

* 仍從x中找出權值最小的頂點連線,以此類推。

* 最小生成樹

* 克魯斯卡爾演算法:

* edge edge0 = new edge(int begin,int end, int weight);

* begin為邊的起始頂點,end為邊的結束頂點,weight為邊的權重

* 通過構建邊的陣列來進行計算。

* 思想:按權重從小到大遍歷,構成回環的邊捨棄

* 最短路徑:

* 迪傑斯特拉演算法:

* 獲取乙個頂點a和它連線的頂點陣列x,然後連線最小權值(m)的頂點b,然後將b頂點的陣列p整合到陣列x(陣列p相加m和陣列x取最小值)

linux筆記第一部分

開源系統,可以自由傳播,目前後台服務端絕大部分都是linux程式執行平台,主要是因為以下幾點 unix的優秀特性 linux的常用版本redhat和centos,目前主流使用的centos7 centos6安裝鏈結 因linux不同於windows,所以linux事實上並沒有和windows一樣的c...

Axure RP 第一部分

axure rp是乙個專業的快速原型設計工具。axure 發音 ack sure 代表美國axure公司 rp則是rapid prototyping 快速原型 的縮寫。axure rp是美國axure software solution公司旗艦產品,是乙個專業的快速原型設計工具,讓負責定義需求和規格...

演算法導論第一部分筆記

一 偽 規範總結 1 縮排表示塊的結構 實際上這個我們可以聯想python來理解 2 while 後面跟上end比較好,for to downto 後面則不需要 3 大部分都類似於c的 4 部分操作可以由英文來代替 5 一般不使用全域性變數,復合資料往往組織為物件來進行操作 二 演算法複雜度 跳過 ...