1. 程式人生 > 實用技巧 >知識點整理-資料結構

知識點整理-資料結構

一、資料結構

1.DFS序:訪問一棵有根樹時DFS訪問結點的順序。設樹結點個數為\(n\)
❤(1)入棧序:設將訪問的結點依次存到一個棧中,結點入棧的順序。
❤(2)出棧序:結點出棧的順序。
→入、出棧序的長度均為\(n\)
❤(3)尤拉序:沿著邊走,經過的結點的順序。
→長度為\(2n-1\)。尤拉序中相鄰的點在樹上一定相鄰。

2.STL set
❤(1)set<Typename> S宣告集合,儲存型別為Typename的元素。
❤(2)S.insert(x)插入元素x
❤(3)S.erase(x)刪除元素x,若未找到x則什麼也不做。
❤(4)S.size(x)返回集合元素數量;S.empty()

返回集合是否為空。
❤(5)set<Typename>::iterator i宣告迭代器。
→迭代器的作用:通過它遍歷集合中的所有元素。相當於for(int i=1;i<=n;i++)中的i。它支援operator++operator--以訪問集合中的下/上一個元素。我們可以通過for(set<Typename>::iterator i=S.begin();i!=S.end();i++)for(auto i:S)來遍歷set中的所有元素。注意直接使用時(也就是for迴圈內部)要通過解引用運算子*i,i->來訪問元素本身。
❤(6)(i=)S.upper_bound(x),S.lower_bound(x)
二分查詢大於/大於等於x的第一個元素,返回迭代器。
❤(7)(i=)S.find(x)找尋x並返回它的迭代器,若為找到則返回末尾迭代器S.end()

3.ST表求LCA
❤(1)求樹的尤拉序,設待求兩點\(u,v\)在尤拉序第一次出現的位置為\(P_u,P_v\)
❤(2)在尤拉序的子段[P_u,P_v]上找到一個尤拉序最小的點,它即是\(LCA(u,v)\)
❤(3)因此我們可以通過ST表求出[P_u,P_v]中最小的值。

4.2-Pointer
問題:給定一個升序數列\(A\),求其中的兩個數字是它們的和為給定的數\(x\)
❤(1)設l,r\(A\)的頭指標和尾指標。
❤(2)若A[l]+A[r]>x

,則r向左移,否則l向右移。
重複這一步,知道找到A[l]+A[r]=x。可以證明,如果存在一組解,那麼它一定能找出來。

練習題:洛谷P1106,P1638,SP1805.