給定乙個操作序列,包括insert(x)和extract-min,運算元x∈[1,n]4,8,e,3,e,9,2,e,e
將第i次extract-min的數儲存在extract[i]中
建立乙個優先佇列,給定乙個操作,馬上在優先佇列中做出相應改變即可
演算法解釋:將樣例輸入看成s1,e,s2,e,s3,e,s4,e,其中s1=,s2=,s3=,s4={},為不相交的集合。i從小的開始找,如樣例輸入中最小的是2,呼叫find-set(2),屬於s3,所以extract[3]=2,隨後,呼叫union(s3,s4),把s3合併到s4中。
演算法的執行效率:o(n*α(n))
維護乙個具有make-tree、graft、find-depth操作的森林f=新建乙個並查集森林s=,每個si對應於乙個ti,si中的結點額外儲存了乙個偽距離d
make-tree類似於make-set:node.p = node,node.d = 0
find-depth類似於find-set:在遞迴的過程中重置路徑上結點的d,並把結點指向根節點
graft類似於union:把a接到b上,a.d = b.d+1
毫無疑問,o(m*α(m))
不同於思考題,這裡貼出乙個講義上的lca演算法:預處理每個結點:o(lgn),對於每個詢問o(lgn)①計算出每個結點x的第2^k個祖先,並儲存在anc[x][k]中:以上是本人的一點思考,如有錯誤還請指出~②對於每個詢問(p,q),不妨設p.depth < q.depth。將q向上移動,調整至p.depth = q.depth
③for k = lgn to 0,若p、q的第2^k祖先相同,則嘗試更小的k;若不同,則將p、q移至第2^k的祖先處
④重複這一過程,直到p=q
演算法導論 思考題 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...