知識點 : trie樹 ,並查集,堆的操作高效地儲存和查詢字串集合的資料結構
const
int n =
100010
;int son[n][26
],cnt[n]
,idx;
//插入
void
insert
(char str)
cnt[p]++;
//以這個點結尾的字元數
}//查詢
intquery
(char str)
return cnt[p]
;}
實現兩個集合的合併,詢問兩個元素是否在乙個集合中.幾乎 o(1);
原理 : 每乙個集合用一棵樹表示,每個結點儲存它的父親結點,p[x] 表示x的父親結點.
1.判斷樹根 : p[x] = x;
2.求x的集合編號 : while(p[x] != x) x = p[x]; 此時進行優化,路徑壓縮
3.合併 :
注意題目要維護的是啥…
維護size
int p[n]
,size[n]
;//根結點的元素個數
void
init
(int n)
}//返回x的祖宗
intfind_set
(int x)
//合併
intmerge_set
(int x,
int y)
維護與根結點的距離
int p[n]
, d[n]
;//p儲存每個點的祖宗節點, d[x]儲存x到p[x]的距離
intfind
(int x)
return p[x];}
// 初始化,假定節點編號是1~n
for(
int i =
1; i <= n; i ++
)// 合併a和b所在的兩個集合:
p[find
(a)]
=find
(b);
d[find
(a)]
= distance;
// 根據具體問題,初始化find(a)的偏移量
插入:,求集合中的最小值,刪除最小值.本質是二叉樹.刪除任意乙個元素 … 修改任意乙個元素…
用陣列模擬 : a[1]表示根節點,x 的左兒子是 2x , 右兒子是 2x + 1.
up 操作 : 每次找到兩個兒子最小的,與父親交換,直到不用交換.
//插入乙個數heap[++sizee] = x;up(sizee);
//刪除最小值
heap[1] = heap[sizee];sizee–;down(1);
//刪除任意乙個元素
heap[k] = heap[sizee];sizee–;;down(k), up(k);
//修改任意乙個元素
heap[k] = x;down(k), up(k);
int n,m;
int h[n]
,sizee;
int ph[n]
,hp[n]
;//ph儲存第k個插入的點在堆中的位置
//hp儲存下標是k的點是第幾個插入的
void
h_swap
(int a,
int b)
void
down
(int u)
}voidup(
int u)
}int
main()
sizee = n;
//將h按照小根堆排好
for(
int i = n/
2;i;i--
)return0;
}//刪除最小的數
//刪除第k個數
//修改第k個數為x
//插入乙個數
資料結構 第二章總結
線性表是由n 0 個資料元素組成的有限序列。我們學習了線性表上定義的基本運算 有構造空表 initlist l 求表長 listlength l 取結點 getnode l i 查詢 locatenode l x 插入 insertlist l x,i 刪除 delete l i 還學習了順序表 單...
資料結構第二章總結
線性表簡稱表,是n個具有相同型別的資料元素的有限序列。線性表中資料元素的個數稱為線性表的長度。長度為零時稱為空表。線性表中資料元素的型別是同一的。線性表的順序儲存結構稱為順序表。儲存結構是資料及其邏輯結構在計算機中的表示 訪問結構是在乙個資料結構上對查詢操作的時間效能的一種描述。順序表的類的宣告 c...
資料結構導論 第二章
第二章主要說的是線性表,那麼什麼是線性表呢?線性表是一種線性結構,在頭結點無直接前驅有乙個直接後繼,尾節點無直接後繼有乙個直接前驅。1.線性表的順序儲存結構 簡單的說就是把線性表的結點按照它的邏輯結構順序,依次的存放到計算機記憶體中一組連續的儲存單元中。用順序儲存來實現的線性表為順序表。這裡要注意,...