演算法導論 思考題15 7 解碼演算法

2021-10-21 14:51:38 字數 1779 閱讀 8423

先解釋一下問題,解碼存在乙個困難為同乙個字可能被譯為它的同音字,比如語音輸入「我的手」,「的」可能對應於「的地得」,需要結合語境判斷。

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...