推 kkdlin:推 08/02 19:26
推 dophin332: 08/02 20:37
推 LetDogDay:推 08/02 20:58
推 stonehomelaa:小錯字 不需要presistance => persistence 08/02 22:23
謝謝,已訂正
→ lovdkkkk:OO 問題 -> 可以用 XX, YY + ABC..., 問題 -> 解法這樣 08/02 22:37
→ lovdkkkk:不過擅常這種的, 不見得擅常 "XX 跟 YY 的差別" 這種問題 08/02 22:37
→ lovdkkkk:(甚至可能反而更不擅常...) 08/02 22:38
→ lovdkkkk:"廣、多、實測、活用" 與 "熟記、深入細節" 08/02 22:40
→ lovdkkkk:有一定程度上的衝突 08/02 22:40
推 chrisyanglom:推這篇 很多人覺得工作用不到的,或許是真的不需要 08/02 22:44
→ chrisyanglom:但也有可能你從來沒有仔細想過是不是可以用到這些東 08/02 22:44
→ chrisyanglom:西去改善自己的程式 其他很多領域也是一樣 08/02 22:45
→ chrisyanglom:當一個人心存反正用到再去查的時候 08/02 22:45
→ chrisyanglom:其實也有可能代表真正要用到的情況他卻沒有想到可以 08/02 22:46
→ chrisyanglom:這樣用 08/02 22:46
→ chrisyanglom:真正看重的不是一個員工會不會implement某個資料結構 08/02 22:48
→ chrisyanglom:而是他是不是能在適當的時機想到要用哪個結構 08/02 22:49
→ chrisyanglom:但如果還需要google才知道這些結構是什麼 08/02 22:49
→ chrisyanglom:我覺得應該很難自己判斷何時需要用 08/02 22:50
→ lovdkkkk:我覺得前面講估狗的指的是很細節的部份 08/02 22:51
→ lovdkkkk:就是例如排序, 知道有 quick 跟 merge 比較快 08/02 22:51
→ lovdkkkk:但是兩者差別不是很清楚這種 08/02 22:52
→ lovdkkkk:至少我是這個意思, 之所以提到沒學過去估狗也很快是強調 08/02 22:55
→ lovdkkkk:對沒學過的人來說都不難, 學過只是忘記的人回熟更沒問題 08/02 22:57
→ chrisyanglom:所以說有實力的面試官應該要能分辨得出是不是死背的 08/02 23:01
→ chrisyanglom:另外如果真的理解的人,面試前花點時間準備一下 08/02 23:01
→ chrisyanglom:也不會太麻煩吧,就像我們也要整理履歷自傳一樣 08/02 23:02
→ chrisyanglom:如果只知道quick、merge比較快,再問下去卻都不知道 08/02 23:03
→ chrisyanglom:反而容易讓人懷疑是用背的,不是嗎? 08/02 23:04
→ lovdkkkk:嗯嗯, 對, 知道方向的話有複習應該就 ok 才對 08/02 23:05
→ lovdkkkk:痾, 不過那是我都沒複習下最記得的事耶 XDD 08/02 23:06
推 chrisyanglom:哈哈,我好像也是,面試突然被問到如果又有點緊張 08/02 23:07
→ chrisyanglom:我也不確定是不是能馬上想起來 08/02 23:07
→ chrisyanglom:可是話說回來,我認為比我厲害的那些高手 08/02 23:08
→ chrisyanglom:我覺得有可能不需要準備也能從容回答,因為他們已經 08/02 23:08
→ chrisyanglom:可以運用自如了,就像公車搭久了就不用特別查時刻表 08/02 23:09
→ chrisyanglom:所以關鍵還是能不能判斷出是死背還是真的懂XD 08/02 23:10
→ pest:推 08/02 23:14
推 greatroy:每每看到這類討論,總覺得台灣的軟體業其實是很有希望的 08/02 23:24
→ greatroy:但不知為何,我們遇到的國內軟體廠商卻完全不是這麼一回 08/02 23:24
→ greatroy:事... 08/02 23:25
→ greatroy:一家號稱國內前幾大的軟體公司,卻連支轉檔程式寫了半年 08/02 23:26
→ greatroy:到現在都快8個月了,還不時出現問題... 08/02 23:26
→ greatroy:希望各位有志之士,有機會的話可以留個名合作, 08/02 23:28
→ greatroy:省的老是遇到這種XXX的廠商. 08/02 23:28
推 chrisyanglom:因為大學時認識資工領域最強的幾個朋友幾乎都出國了 08/03 05:24
→ michaelz:這更新得要O(n)吧 constant time應該不行 08/03 19:20
不知道是不是問題spec不清楚造成誤解
試著以C++說明…
定義資料結構
struct Player {
int playerId;
int lastKillTime;
PlayerNode* killNode; // A pointer to killList. See below
PlayerNode* rankNode; // A pointer to rankList. See below
}
struct PlayerNode { // Doubly linked list
Player* player;
PlayerNode* prev;
PlayerNode* next;
}
hash_map<int, Player*> playerMap;
PlayerNode* killList; // list中越前面的玩家,最後殺人時間越晚
PlayerNode* rankList; // list中越前面的玩家,留在排行榜越短,名次越低
注意程式永遠保持playerMap, killList, rankList元素個數相同。
有在playerMap中的玩家就是在排行榜上的人。
幾個use case:
* 玩家殺人時
先透過playerMap查詢是不是已在榜上O(1) time
1.若不在榜上
建立Player資料並插入playerMap O(1)
再將兩個PlayerNode插入killList和rankList的前端 O(1)
Player和兩個PlayerNode間要互相記住對方的指標
並更新lastKillTime為目前timeStamp。
2.若在榜上
從Player中取出killNode,將killNode從killList中移除 O(1)
再將killNode插回killList前端。
並更新lastKillTime為目前timeStamp。
* 玩家被殺時
先透過playerMap查詢是不是已在榜上O(1)
1.若不在榜上則不需處理
2.若在榜上則從hash table及兩個linked list中分別移除節點 O(1)
* server可每秒觸發「清除排行榜上一分鐘沒殺人的玩家」
從killList後端向前走訪。
檢查Player上的lastKillTime是否已在一分鐘前。
若已過期則清分別在hash map及兩個linked list中清除,並繼續走訪。
若未過期則可停止檢查。
除非edge case(一堆人最後殺人時間相同),否則average是constant time。
* 查找某玩家前後五名的玩家
就從rankList向前後走5個節點就好。 O(1)
====
這個例子或許不夠真實跟完備,造成一些誤解。
但我想說明的是,這並不是一個面試問題。
基本功扎實的人,在解決實際問題時,更有機會找到不一樣的解法。
推 stonehomelaa:資工的強者大多不是出國就是去ic design 08/03 22:34
※ 編輯: yzugsr (111.248.88.223), 08/04/2014 00:19:46
※ 編輯: yzugsr (111.248.88.223), 08/04/2014 00:21:26
推 bleed1979:map查詢插入時間複雜度。。。 這個map實作是用那種DS? 08/04 03:42
前面有寫hash map,查詢和插入都amortized O(1)
推 lovdkkkk:這分數怎麼算啊, 看起來規則好像變了 @@ 08/04 08:13
→ lovdkkkk:變成越接近最後一瞬間殺人的排名越高 08/04 08:14
抱歉規則寫的不夠清楚(我加了一句話,但原本想表達的意思沒變)
進排行榜越久的人分數越高,越接近最後一瞬間殺人的
例如殺人事件以「A殺人 -> B殺人 -> C殺人 -> A被殺 -> C殺人」順序發生
排行綁上是先B再C,A因為被殺所以被踢出去了
但如果接下來大家都殺不到人,那B會先因為一分鐘規則而被踢出排行榜
※ 編輯: yzugsr (61.230.7.161), 08/04/2014 10:44:18
→ lovdkkkk:所以是沒有 "總分" 這回事, 本來以為會根據什麼算總分 XD 08/04 12:28
推 FukadaKyoko:推 沒用到不代表用不到 只是問題深淺的差異 08/04 14:33
推 kimmyariel:推... 08/04 23:35