Data Structure
樹狀資料結構
Heap
Map
Set
Disjoint Set
Queue
陣列資料結構
Array
Stack
Deque
Linked-list
Vector
按重要性排序
Heap
Stack
Queue
Vector
Disjoint Set
Deque
Q
為甚麼重要性排行榜沒有Set?
A
因為我不會用
但是你無法方便的掌握他
從最尾端往前遍歷 --> len 維護O(1)
當前最大值 --> 維護O(N)
找某項元素 --> O(N) or O(lgN)
總之就是很麻煩
於是我們想到...
Item 丟進去--> 神秘資料結構
Item 丟進去--> 神秘資料結構
item 丟進去--> 神秘資料結構
然後結果就出來了!!!
一個資料結構會維護一個特性
有一些操作會破壞這個特性
然後我們再想辦法經由固定的手段把特性弄回來
Q
所以神秘資料結構要有甚麼
A
提供限定的操作(For you, For me)
維護你想知道的資訊
--->
-->
-->
從哪裡丟進去 從哪裡拿出來
也可以說是
[先進 後出]
從左邊丟進去 從另一邊拿出來
也可以說是
先進先出 = 排隊
雖然不是很重要
Stack
保存最初的資料
Queue
資料的順序性
Deque
結合以上兩者(這是屁話)
通常拿來維護單調性(遞增or遞減)
特別的 他們被拿來做DFS跟BFS
(資料的遍歷)
DFS&BFS
下一堂會講 <3
push 把元素丟到最上層
top 讀取最上層元素
pop 丟掉最上層元素
你養了 n 頭高矮不一定相同的乳牛,某天你叫他們由左到右排成一列。
找到誰會最先擋住他的視線!!!
這是我們遇到的第一個TLE
這是第一個TLE
往後還會有千千萬萬個TLE
N = 100,000
N^2 = 10,000,000,000
不會很久 大約100秒而已
相信大家都發現了
比較矮的牛根本不會擋到阿
3 1 2 4 ...後面還有很多牛...
[3 1 2]不可能會擋到4後面的牛
因為4最高 又 最後面
所以我們不需要的是....
所以不用的可以______。
之後要把當前的牛_____。
然後_______。
自己想喔揪咪 (或上FB跟大家討論!!)
http://hoj.twbbs.org/judge
HOJ 130 乳牛問題
push 丟進去
front 讀取
pop 丟掉
只有 top 改 front 不一樣
模擬神器
想像一個陣列
我們不紀錄第 x 號元素
但我們可以知道 x 的下一個跟前一個
...
一個元素可以被存取要保證
...
精美的O(N)
Let's Coding!!!
觀察這個圖形(?)(好啦當他是個圖)
...
1對應到2、3
2對應到4、5
3對應到6、7
n對應到...2n跟2n+1
我們定義
2n是n的左小孩(左葉)
2n+1是n的右小孩(右葉)
int left_child (int x){return x*2;}
int right_child (int x){return x*2+1}
int fa(int x){return x/2;}
通常會簡寫成
#define fa(x) x/2
#define lc(x) x*2
Push(x)
把元素放到最底層
不斷跟老爸比較
如果老爸 < 元素
Swap(老爸, 元素)
直到老爸 > 元素
丟掉100
讓下面的遞補上去
(黃色是贏的,橘色是輸的)
最後會 「缺」 哪一格不確定
下次Push會很麻煩
我們希望空在 36 這格上
先把最後一個元素丟上來
Let's Coding!
數字還剛好很小
可是HOJ有 假設有嘛
看相對位置
Next(x)
Prev(x)