Shunting Yard (調車場)演算法,是可以把infix(算符中綴)表示法轉換成reverse polish(算符後綴)表示法。比如
這個中綴 (9*8)+(6/3)
變成
後綴 9 8 * 6 3 / +
反過來說,有沒有演算法是可以把 RPN (後綴) 轉成 Infix (中綴) 呢?
2011/05/16
[programming]RedBlackTree
紅黑樹兩個條件
如果將[1,2,...15]共15個key插入紅黑樹,最後紅黑樹的外形,不會像是完美的(optimal)二元樹(Binary Search Tree)一樣是個對稱的金字塔。紅黑樹會變得左邊高度2,右邊高度5。
看起來好像不太好,你很怕[16.17.18]等key加上去,樹右方會無限制地變長。但實際上插入[16,17]後,樹右方仍只有5。
再加入[18]後,紅黑樹就開始左旋,讓左方分攤一節高度。右邊高度還是只有5。
因為有一、二的條件限制,樹左邊是3黑子,那樹右邊至多是[黑紅黑紅黑紅],如果再繼續加上去的話,樹就會左旋,讓樹左邊分攤重量。
因此,紅黑樹的最長一邊(此例中為右邊)最多不會超過2⌈logN⌉,紅黑樹的search複雜度是在O(logN)。
紅黑樹跟一般的二元樹有何不同?
- 兩個紅子不能互為親子
- 由根(root)至每個葉(leaf)的路徑(path)上,黑子數相同
如果將[1,2,...15]共15個key插入紅黑樹,最後紅黑樹的外形,不會像是完美的(optimal)二元樹(Binary Search Tree)一樣是個對稱的金字塔。紅黑樹會變得左邊高度2,右邊高度5。
看起來好像不太好,你很怕[16.17.18]等key加上去,樹右方會無限制地變長。但實際上插入[16,17]後,樹右方仍只有5。
再加入[18]後,紅黑樹就開始左旋,讓左方分攤一節高度。右邊高度還是只有5。
因為有一、二的條件限制,樹左邊是3黑子,那樹右邊至多是[黑紅黑紅黑紅],如果再繼續加上去的話,樹就會左旋,讓樹左邊分攤重量。
因此,紅黑樹的最長一邊(此例中為右邊)最多不會超過2⌈logN⌉,紅黑樹的search複雜度是在O(logN)。
紅黑樹跟一般的二元樹有何不同?
- 由於條件二,紅黑樹會算每一側的黑子數,所以不會過於偏斜
- 紅黑樹允許紅子參雜在其中一側,而且只算黑子數,所以不會為了力平衡,使得旋轉次數太多。又由於條件一,避免兩個紅子互為親子,所以不會發生[黑紅紅紅紅...紅]的情況。
Labels:
programming
2011/05/04
[iPhone]iPhone耳機壞了
今天去健身中心一邊跑步一邊用iPhone聽音樂,汗水一直流沒時間擦汗。
回家坐公車想要用iPhone聽音樂時,我沒碰iPhone,但它竟然會自動跳到語音控制,亂撥電話給其他人,如果我把耳機拔掉後又正常了。
有可能是汗水弄濕,也有可能是收納線材時,捲上魚骨棒時捲壞的。
我現在想要買新耳機,可是怕原廠耳機會否因為被汗水淋濕而弄壞。有比較防水,但又有線控與麥克風功能的iPhone耳機嗎?
另一點是健身中心的跑步機會溢出靜電,跑步時如果不觸碰跑步機的金屬部份,靜電就會經由耳機傳到耳朵,耳朵一直被電。我想要跑步時把iPhone掛在手臂上,請問那種配件叫什麼?
回家坐公車想要用iPhone聽音樂時,我沒碰iPhone,但它竟然會自動跳到語音控制,亂撥電話給其他人,如果我把耳機拔掉後又正常了。
有可能是汗水弄濕,也有可能是收納線材時,捲上魚骨棒時捲壞的。
我現在想要買新耳機,可是怕原廠耳機會否因為被汗水淋濕而弄壞。有比較防水,但又有線控與麥克風功能的iPhone耳機嗎?
另一點是健身中心的跑步機會溢出靜電,跑步時如果不觸碰跑步機的金屬部份,靜電就會經由耳機傳到耳朵,耳朵一直被電。我想要跑步時把iPhone掛在手臂上,請問那種配件叫什麼?
Labels:
iPhone
2011/05/02
[Puzzle]人過大佛寺*4=寺佛大過人,猜數字
Palindrome:
abcde*4 = edcba
[a,b,c,d,e] are five distinct decimal digits.
Use python to do brutal force searching:
The final answer is 87912/4 = 21978. So, 21978*4 = 87912.
abcde*4 = edcba
[a,b,c,d,e] are five distinct decimal digits.
Use python to do brutal force searching:
#!/usr/bin/env python revStr = lambda s:s[len(s)-1:0:-1]+s[0] revInt = lambda n:int(revStr(str(n))) isPalin = lambda a,b:revInt(a)==(b) is4div = lambda n:n%4==0 biglist = range(1,99999) quadMul = filter(is4div, biglist) isQuoPalin = lambda n:isPalin(n/4,n) blist = filter(isQuoPalin, quadMul) """ >>> print blist [8712, 87912] """
The final answer is 87912/4 = 21978. So, 21978*4 = 87912.
Labels:
Puzzle
Subscribe to:
Posts (Atom)