推 ric2k1:(咳) 用 array 來做 bst 算是作弊哦~~~ 12/05 10:51
→ a3785lexx:啊..是歐@@... 12/05 11:19
→ a3785lexx:我是因為覺得 1.)印象中教授有介紹過BST存array的index 12/05 11:21
→ a3785lexx:的實作方法,好處是64-bit可以省記憶體 12/05 11:21
→ a3785lexx:2.)其實就算用array事情(++、--)也不會比較簡單...orz? 12/05 11:22
→ a3785lexx:所以覺得作弊的成分好像還好...XDrz 12/05 11:23
→ a3785lexx:只是想到眾多array法中的一種是可以巧妙的不佔記憶體就 12/05 11:28
→ a3785lexx:可以知道到底parent/children在哪裡...所以有點心動XD 12/05 11:28
→ a3785lexx:啊...話說只看內文大概沒有人看的出來我的delete效率 12/05 11:29
→ a3785lexx:差到什麼程度... 簡單來說就是整個do.all跑完大概是 12/05 11:30
→ a3785lexx:教授的2.X倍時間吧.......orz 12/05 11:30
※ 編輯: a3785lexx 來自: 114.37.102.193 (12/05 11:48)
推 ric2k1:oh, 如果你的意思是用 array index 取代 BSTNode*,那是 12/05 11:45
→ ric2k1:沒有關係。背後的操作應該還是 bst 的 operationy 12/05 11:46
推 ric2k1:2.X 倍 OK 呀! size 大一點還是 2.X 倍嗎? 看不懂你最後的 12/05 11:55
→ ric2k1:問題 12/05 11:55
→ a3785lexx:呃...其實就是在size很大的時候會2.X倍 XD 12/05 11:57
→ a3785lexx:恩我最後的問題就是,每級recursive裡面都總要有一個 12/05 11:58
→ a3785lexx:暫時的位置來放東西(目前不知道要怎麼避免) 12/05 11:58
→ a3785lexx:然後就想到recursive萬一跑到幾千幾萬次... 12/05 11:59
→ a3785lexx:這樣就太吃記憶體了。 所以就把他當成參數傳下去 12/05 11:59
→ a3785lexx:然後每級都用&去接他,這樣也許可以省一點??? 12/05 12:00
→ a3785lexx:如果運氣好可能還順便省時間?不過我不知道XDrz 12/05 12:00
推 ric2k1:幾萬次 = 1MB memory? Maybe that's not a problem. 12/05 12:15
→ flax00298:如果改成&可行的話就會少作COPY的時間吧? 12/05 12:44
→ a3785lexx:目前&是可行可是沒有快到哪裡去XD 12/05 12:51
→ a3785lexx:其實我最原始的版本本來是沒有用&recursive的... 12/05 12:51
→ a3785lexx:而且一直涉及iterator<->BSTreeNode<T>*的轉換 12/05 12:51
→ a3785lexx:結果這兩個版本在大資料量的情況下也才差5%...o.O 12/05 12:52
→ a3785lexx:雖然小資料量的情況下會明顯增快很多就是了... 12/05 12:52
→ a3785lexx:雖然我也不知道為甚麼XD 12/05 12:52
→ a3785lexx:呵呵...剛剛作了個小實驗... 12/05 13:27
→ a3785lexx:強迫讓每一級都一定會找一次parent來 12/05 13:28
→ a3785lexx:結果並沒有變慢多少....居然差不到0.1%... 12/05 13:29
→ a3785lexx:所以其實問題根本不是出在我parent找太慢嗎XDrz... 12/05 13:29
→ a3785lexx:還是說因為我加的太突兀了所以被optimized掉了嗎XD 12/05 13:30
→ a3785lexx:倒是在剛進erase的時候就強迫他找兩次parent還比較慢 12/05 13:37
→ a3785lexx:所以說平均而言一次erase其實不會找超過兩次successor 12/05 13:38
→ a3785lexx:嗎?? 12/05 13:38
推 keyboardle:根據演算法.一次delete最多找一次succesor 12/05 14:52
→ keyboardle:因為需要找succesor的case的succesor必只有一子或沒有 12/05 14:53
→ a3785lexx:其實好像偶爾會超過一次的樣子XD?最少我的會啦XD 12/05 15:11
→ a3785lexx:不過根據實驗...平均次數其實還低於1說... 12/05 15:11
→ a3785lexx:這樣就不難理解為甚麼我把原版改變之後效率無法提升了.. 12/05 15:13
→ a3785lexx:原版是效率很爛的recursive...不過既然他recursive的 12/05 15:13
→ a3785lexx:機率不高,當然效能提升有限XDrz 12/05 15:14
→ a3785lexx:不過我不能明白的就是...我在recursive的起點強迫多找 12/05 15:16
→ a3785lexx:兩次parent,結果他所需時間也沒有變三倍...(原本只會 12/05 15:16
→ a3785lexx:找一次) 12/05 15:16
→ a3785lexx:所以拖垮效能的倒底是什麼......orz 12/05 15:17
→ a3785lexx:應該不會是我find寫太爛了吧囧 insert的表現還不錯啊XD 12/05 15:17
推 keyboardle:記憶中random delete的話應該最花時間的是iterator++?? 12/05 15:18
→ a3785lexx:原來是這樣! 恍然大悟! 12/05 15:23
→ a3785lexx:我一直以為random delete是叫erase(const T&)...... 12/05 15:23
→ a3785lexx:畢竟用內部的find絕對會比外面用iterator還要快很多... 12/05 15:24
→ a3785lexx:感謝key大...我終於能夠把差距拉到10秒內了@@" 12/05 16:14
推 herbert570:其實用 array 實作 bst node 效率很快.... 12/05 22:23
推 herbert570:只要操作數字上的運算就可以找到parent 和 child 12/05 22:25
→ herbert570:不過就是要整理樹就是了.....不然記憶體會區段錯誤... 12/05 22:26
→ a3785lexx:嗯嗯我也是這樣想...想array應該很快吧XD? 12/06 02:03
→ a3785lexx:不過我沒有array就已經程式記憶體區段錯誤了....囧 12/06 02:03
推 herbert570:array 很快是因為測資少的緣故... 12/06 03:13