Re: [問題] 中介數編解碼

看板Prob_Solve (計算數學 Problem Solving)作者 ( )時間12年前 (2012/02/07 00:35), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《tropical72 (藍影)》之銘言: : 下述說明, array index start from 0. : 不知道這有沒有明確定義的名詞 < 其實是在排列演算法裡面看到的 >。 : 現假設一 arr[] = {6,3,4,5,1,2}; : 中介數 n[i] 代表 arr[i] > arr[j] ( for j>i) 之個數, : 白話點,就是元素 a[i] 以右,比 a[i] 還大的個數。 : 以 n[1] 為例,arr[1] 右邊比 arr[1] 大的數有 2 個, n[1]=2; : n[2] ,arr[2] arr[2] 1 , n[2]=1。 : ---- : 這裡做幾個前提假設 : a. 假設 array 數值分佈為 [1,n] 或 [0,n-1] : b. 每個數都剛好會出現一次。 : 問題有三個 : 1. 有辦法快速知道 n[] 值嗎? (可接受額外空間) : 目前作法是 : : for(i=0; i<size; ++i) : for(n[i]=0, j=i+1; j<size; ++j) : n[i]+=(arr[j]>arr[i]); : 因這動作非常頻繁,不知是否有其他作法? 硬爆: 把動作抽象化:我們需要一個支援如下操作的集合S - 動態增(刪)一個數字 - 查詢比 k 小的數字有幾個 那上述迴圈改為 S ← {} for i = n down to 1 n[i] = 查詢 S 中有幾個數字 < a[i] 把 a[i] 加入 S S可以用平衡樹或Binary Index Tree(BIT, 好寫)實現. 或者, BIT 可以維護 [1,i] i≦n 的資訊, 也可以變成維護 [i,n], 1≦i 我們把 a[] 的數字由小到大處理 v[1...n] = 0 for k = 1 to n let a[i] be the kth smallest number in a[] n[i] = 求和: v[i+1...n] v[i]++ 其中 v 可以用 segment tree(???這名稱我不確定 反正對岸稱為線段樹)或 BIT 維護 其實跟上面方法一樣意思...... : 2. 怎麼再解碼回去? (可接受額外空間) : 若 n[] = {1,0,2,1 } ; 我該怎麼解碼解成 : arr[] = {4,5,3,1,2} 或 {3,4,2,0,1}? : const int size=5; : char used[size]={0}; : int i, j, cnt; : for(i=0; i<size-1; ++i){ : cnt = 0; : for(j=size-1; cnt!=n[i]; --j) : if(used[j]==0) ++cnt; : arr[i] = j, used[j]=1; : } : // 最後還要查一次沒用到的 : for(i=0; i<size && used[i]; ++i) ; : arr[size-1] = i; : 目前想法也是豬頭想法,只差無限猴子定理沒搬出來做, : 不知能否有些技巧? 一樣,把要什麼動作寫出來可以知道哪邊可以加速 (註:這個同 http://uva.onlinejudge.org/external/115/11525.html ) S = {1, 2, ..., n} n[] 為輸入的編碼 for i = 1...n a[i] ← S 中第 n[i] 小的數字 從 S 中移除 a[i] 所以我們的 S 需要: - 求出第 k 大的數字是什麼 - 刪除任一個數字 一樣, S 用任一種平衡樹都可以, 用 segment tree 也可以, BIT 上二分搜也可以 BIT上二分搜大致是: BIT紀錄<=k的數字有幾個, 然後對這個二分搜找到所需的數字是誰 附上以前寫的程式碼, 但是當時亂寫的, 只是稍微加快了原先 O(n^2) 的算法, 並不是 O(n lg n) / O(n lg n lg n) 的做法... http://pastie.org/3328428 當時記的好像是"已經刪掉了幾個數" : 3. 假設不成立時,中介數之編解碼是否該重新設計? : 倘若 假設 a. array 數值分佈為 [1,n] 或 [0,n-1] 不成立, : 唯一確定的是 array 元素保證兩兩相異,試問還有什麼技巧可完成? 預處理把 a 中每個數字是第幾大的算出來, 範圍就變 [1,n] : ---- : 這篇發得很像作業文,但純粹是個人進修卡住, : 希望各位先進能不吝給個意見。 : 懇請不吝賜教,小弟感激不盡。 突然發現跟 #1E06h4Uk 有類似處... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.217.33.242

02/07 00:42, , 1F
先推再說,謝謝回覆指導 ^^
02/07 00:42, 1F
文章代碼(AID): #1FC04yWu (Prob_Solve)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1FC04yWu (Prob_Solve)