先解釋一下問題,解碼存在乙個困難為同乙個字可能被譯為它的同音字,比如語音輸入「我的手」,「的」可能對應於「的地得」,需要結合語境判斷。
ps. 我看有些答案說這是 viterbi 演算法,可以自行了解。
問題a,解法是乙個帶備忘錄的動態規劃(過程類似於深度遍歷),偽**如下:
input:
v 圖的節點列表
sigma 聲音標籤
s 聲音序列
n =|v|
//圖v中節點數
k =|s|
//聲音序列長度
memo =[1.
.k,1.
.n]viterbi(1
, index of v0)
/** * t 當前聲音序列序號
* x 當前節點序號
*/viterbi
(t, x)
if s.length = t
return x
if memo not null:
return memo[t, x]
for v[i] in v[x]
.outerneighbor
ifsigma
(x, i)
= s[t]
res =
viterbi
((t+
1, i)
if res != no-such-path
memo[t, i]
=(v[x]
, res)
return memo[t, i]
return no-such-path
時間複雜度,計算備忘錄需要 o(k
∣v∣)
o(k|v|)
o(k∣v∣
) 次遞迴函式呼叫,每次函式最多迴圈 ∣v∣
|v|∣v
∣ 次,所以總時間複雜度為 o(k
∣v∣2
)o(k|v|^2)
o(k∣v∣
2).問題b,在問題a的基礎上遍歷全部可能,選出概率最大的:
prob-
viterbi(1
, index of v0)
prob-
viterbi
(t, x)
sols.seq = no-such-path
sols.prob =
0if s.length = t
sols.seq =
(x) sols.prob =
1return sols
if memo[t, i]
not null:
return memo[t, i]
for v[i] in v[x]
.otterneighbor
ifsigma
(x, i)
= s[t]
res = prob-
viterbi
(k+1
, i)ifp
(v[0
], v[1]
)* res.prob >= sols.prob
sols.prob =
p(v[x]
, v[i]
)* res.prob
sols.seq =
(v[x]
, res.seq)
return sols
時間複雜度同問題 演算法導論 思考題 4 3
a.利用主方法可得,t n n的log3 4次方 b.n f n lgn,不能應用主方法 共log3 n 1層,每層代價n lg n 3 的i次方 最後一層共n個 1 的結點,代價為 n t n n lg n 3 的i次方 n n lgn n n log3 2 n o n 又因為t n 最後一層代價...
演算法導論 思考題 8 4
寫一下我的思路,大概是對的,詳細證明不出來。設藍色水壺為a,紅色為b 先取乙個a1,對所有的b做一次比較,可以將b分為兩個部分,一部分大於a1,一部分小於a1 再取乙個a2,將b分為三個部分 再取a3,將b分為四個部分 假設現在b被分成了k個部分,b1,b2,b3.bk,每次取ai,都從b集合的一半...
演算法導論 思考題 4 5
這題實在沒什麼思路,網上找了一下答案。如果一開始就能夠確定好的晶元多於壞的,則可以保證每輪檢測結束好的晶元都多於壞的,一直到最後如果剩2塊晶元,則兩塊肯定都是好的 剩3塊晶元就再檢測一次,如果結果都是好的,就隨意取一片必定是好的 如果結果都是壞的,則剩下的那塊肯定是好的。來證明一下上面的結論 設有x...