數據結構:
- 線性表
- 順序表
- 鏈表
- 棧和隊列
- 優先級隊列
- 雙端隊列
- 集合
- 散列表
- 跳錶(Redis利用跳錶實現有序集合Sorted Set)
- 樹
- 二叉樹
- 線索二叉樹
- 樹與森林
- 樹與森林的遍歷
- 堆
- Huffman樹
- 圖
- 圖的遍歷
- 深度優先
- 廣度優先
- 最小生成樹
- Kruskal算法
- Prim算法
- 最短路徑
- 圖的遍歷
- 搜索結構
- 二分查找
- 二叉搜索樹
- 平衡二叉樹(AVL樹)
- 紅黑樹
- 索引結構
- B樹
- B+樹
數據結構
1、AarryList、LinkedList、Stack、Queue常用方法
####1.1 AarryList用法
ava.util.ArrayList < E > 的一些方法 | 描述 |
---|---|
+add(o: E): void | 在list的末尾添加一個元素o |
+add(index: int, o: E): void | 在指定的index處插入元素o |
+set(index: int, o: E): E | 設置指定index處的元素爲o |
+get(index: int): E | 返回指定index處的元素 |
+clear(): void | 從list中刪除所有元素 |
+remove(o: Object): boolean | 刪除list中的第一個元素o,如果元素被刪除,返回true |
+remove(index: int): boolean | 刪除指定index處的元素,如果元素被刪除,返回true |
+size(): int | 返回list中元素個數 |
+isEmpty(): boolean | 如果list不含元素,返回true |
+contains(o: Object): boolean | 如果list含有元素o,返回true |
+indexOf(o: Object): int | 返回list中第一個匹配元素的index |
+lastIndexOf(o: Object): int | 返回list中最後一個匹配元素的index |
1.2 LinkedList用法
增加:
add(E e):在鏈表後添加一個元素; 通用方法
addFirst(E e):在鏈表頭部插入一個元素; 特有方法
addLast(E e):在鏈表尾部添加一個元素; 特有方法
push(E e):與addFirst方法一致
offer(E e):在鏈表尾部插入一個元素 add(int index, E element):在指定位置插入一個元素。
offerFirst(E e):JDK1.6版本之後,在頭部添加; 特有方法 offerLast(E e):JDK1.6版本之後,在尾部添加; 特有方法
刪除:
remove() :移除鏈表中第一個元素; 通用方法
remove(E e):移除指定元素; 通用方法
removeFirst(E e):刪除頭,獲取元素並刪除; 特有方法
removeLast(E e):刪除尾; 特有方法
pollFirst():刪除頭; 特有方法
pollLast():刪除尾; 特有方法
pop():和removeFirst方法一致,刪除頭。
poll():查詢並移除第一個元素 特有方法
查:
get(int index):按照下標獲取元素; 通用方法
getFirst():獲取第一個元素; 特有方法
getLast():獲取最後一個元素; 特有方法
peek():獲取第一個元素,但是不移除; 特有方法
peekFirst():獲取第一個元素,但是不移除;
peekLast():獲取最後一個元素,但是不移除;
pollFirst():查詢並刪除頭; 特有方法
pollLast():刪除尾; 特有方法
poll():查詢並移除第一個元素 特有方法
其他:
boolean contains(Object o)
size()
void clear()
int indexOf(Object o)
int lastIndexOf(Object o)
1.3 Stack用法
Stack的一些方法 | 描述 |
---|---|
push( num) | 入棧 |
pop() | 棧頂元素出棧 |
empty() | 判定棧是否爲空 |
peek() | 獲取棧頂元素 |
search(num) | 判端元素num是否在棧中,如果在返回1,不在返回-1。 |
1.4 Queue用法
方法名 | 描述 | 解釋說明 |
---|---|---|
add | 增加一個元索 | 如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常 |
remove | 移除並返回隊列頭部的元素 | 如果隊列爲空,則拋出一個NoSuchElementException異常 |
element | 返回隊列頭部的元素 | 如果隊列爲空,則拋出一個NoSuchElementException異常 |
offer | 添加一個元素並返回true | 如果隊列已滿,則返回false |
poll | 移除並返問隊列頭部的元素 | 如果隊列爲空,則返回null |
peek | 返回隊列頭部的元素 | 如果隊列爲空,則返回null |
put | 添加一個元素 | 如果隊列滿,則阻塞 |
take | 移除並返回隊列頭部的元素 | 如果隊列爲空,則阻塞 |
2、集合
2.1 散列表
- 散列方法
- 除留餘數法
- 數字分析法
- 平方取中法
- 摺疊法
- 處理哈希衝突的方法
- 開放定址法
- 線性探測法
- 二次探測法
- 僞隨機數探測法
- 再哈希法
- 鏈地址法
- 建立一個公共溢出區
- 開放定址法
2.2跳錶
跳躍表(skiplist)是一種有序數據結構,它通過在每個節點中維持多個指向其他節點的指針,從而達到快速訪問節點的目的。在大部分情況下,跳躍表的效率可以和平衡樹相媲美,並且因爲跳躍表的實現比平衡樹要來得更爲簡單,所以有不少程序都使用跳躍表來代替平衡樹。和鏈表、字典等數據結構被廣泛地應用在Redis內部不同,Redis只在兩個地方用到了跳躍表,一個是實現有序集合鍵,另一個是在集羣節點中用作內部數據結構,除此之外,跳躍表在Redis裏面沒有其他用途。
3、樹
3.1 線索二叉樹
用自己的話說就是:原來我們求一棵二叉樹的前序、中序、後序序列的時候,都必須用到遞歸遍歷相應的二叉樹,否則也得藉助棧等結構來記錄。這樣的話,如果我們想很快的找到某一個節點在某種序列下的前驅或後繼,每次都要遍歷,這顯然十分浪費時間。很自然,要是想避免這個重複工作,那麼我們就需要把所有節點的前驅和後繼記錄下來,這樣每次查找相應的記錄就行了。於是就引出了——‘線索’一詞。沒錯,真的是‘線索’,由線索找到相應節點的前驅和後繼,很形象!
3.2 線索二叉樹相關知識點
- 線索二叉樹前中後序線索化
- 線索二叉樹的遍歷
- 線索二叉樹的插入和刪除
3.3 二叉樹
遞歸遍歷
* 中序遍歷二叉樹(遞歸)
*/
public void PrintBinaryTreeMidRecur(TreeNode<T> root)
{
if (root!=null)
{
PrintBinaryTreeMidRecur(root.left);
System.out.print(root.data);
PrintBinaryTreeMidRecur(root.right);
}
}
非遞歸遍歷
* 中序遍歷二叉樹(非遞歸)
*
* 思路:先將T入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應爲T,
* 出棧,訪問T->data,再中序遍歷T的右子樹。
*/
public void PrintBinaryTreeMidUnrecur(TreeNode<T> root)
{
TreeNode<T> p=root;//p爲當前節點
LinkedList<TreeNode> stack=new LinkedList<>();
//棧不爲空時,或者p不爲空時循環
while(p!=null || !stack.isEmpty())
{
//當前節點不爲空。壓入棧中。並將當前節點賦值爲左兒子
if (p!=null)
{
stack.push(p);
p=p.left;
}
//當前節點爲空:
// 1、當p指向的左兒子時,此時棧頂元素必然是它的父節點
// 2、當p指向的右兒子時,此時棧頂元素必然是它的爺爺節點
//取出並訪問棧頂元素,賦值爲right
else
{
p=stack.pop();
System.out.print(p.data);
p=p.right;
}
}
}
層次遍歷
* 層次遍歷二叉樹(非遞歸)
*/
public void PrintBinaryTreeLayerUnrecur(TreeNode<T> root)
{
LinkedList<TreeNode> queue=new LinkedList<>();
TreeNode<T> p;
queue.push(root);
while(!queue.isEmpty())
{
p=queue.removeFirst();
System.out.print(p.data);
if (p.left!=null)
queue.addLast(p.left);
if (p.right!=null)
queue.addLast(p.right);
}
}
}
3.4 哈夫曼樹的應用
- 最優判定樹
- Huffman編碼
4、 圖
4.1圖的存儲
- 鄰接表
- 鄰接矩陣
4.2 圖的遍歷
- 深度優先遍歷
- 廣度優先遍歷
4.3 最小生成樹
- Kruskal算法
- Prime算法
4.4 最短路徑
- Dijkstra算法
5、二叉搜索樹
- AVL樹
- 紅黑樹
都是爲提高搜索效率而建立的搜索結構
6、索引結構
B樹和B+樹都是平衡多路搜索樹
- B樹
- B+樹
B+tree:是應文件系統所需而產生的一種B-tree的變形樹。
一棵m階的B+樹和m階的B樹的異同點在於:
- 有n棵子樹的結點中含有n-1 個關鍵字; (此處頗有爭議,B+樹到底是與B 樹n棵子樹有n-1個關鍵字 保持一致,還是不一致:B樹n棵子樹的結點中含有n個關鍵字,待後續查證。暫先提供兩個參考鏈接:①wikipedia http://en.wikipedia.org/wiki/B%2B_tree#Overview;②http://hedengcheng.com/?p=525。而下面B+樹的圖尚未最終確定是否有問題,請讀者注意)
- 所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大的順序鏈接。 (而B 樹的葉子節點並沒有包括全部需要查找的信息)
- 所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。 (而B 樹的非終節點也包含需要查找的有效信息)