資料結構:資料之間相互存在的一種或多種特定關係的元素的集合。
邏輯結構分類:集合結構,線性結構,樹形結構,圖形結構。
物理結構分類:順序儲存,鏈式儲存 。
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 一般不使用全域性變數,復合資料往往組織為物件來進行操作 二 演算法複雜度 跳過 ...