資料結構(2)acwing
1.trie樹
- 快速儲存和查詢字串的集合
- 結構特徵:
- 例題:Trie字串統計 ?
2.並查集(近乎O(1))
- 思路
- 將兩個集合合併
- 詢問兩個元素是否在一個集合中
-
基本原理:
每個集合用一顆樹來表示,樹根的編號就是整個集合的編號。每個節點儲存他的父節點,p[x]表示x的父節點
-
問題:
- 問題1:如何判斷樹根:if(p[x] == x)
- 問題2:如何求x的集合編號:while(p[x] != x) x = p[x];
- 問題3:如何合併兩個集合:px是x的集合編號,py是y的集合編號。p[x] = y,直接上圖
優化:
1.路徑壓縮
- scanf使用%s會預設忽略“空格”和"回車",不用%c
- 上程式碼:
3.堆
- 概念:”小根堆“(顧名思義{根小於左右兒子})----》為“完全二叉樹”(最後一行可以不滿,以上全滿),上圖
-
儲存方式(一維陣列儲存)
- x的左兒子:2x
- x的右兒子:2x+1
-
如何手寫一個堆?
-
插入一個數
heap[ ++ size] = x;up(size);
-
求集合中最小值
heap[1];
-
刪除最小值
heap[1] = heap[size];size --;down(1);
-
刪除任意一個元素
heap[k] = heap[size];size --; down(k);up(k);
-
修改任意一個元素
heap[k] = x;down(k);up(k);
-