Re: [問題] 演算法問題

看板Prob_Solve (計算數學 Problem Solving)作者 (...)時間10年前 (2014/10/04 14:40), 10年前編輯推噓3(300)
留言3則, 3人參與, 最新討論串6/8 (看更多)
※ 引述《cutekid (可愛小孩子)》之銘言: : 給一字串全由字母 A-Z 組成 : 將其依字母順序由小到大排序 : 限定只能相鄰字母兩兩交換 : 問至少要交換幾次 : 能排序完成 : Ex. : Input : DCBA : Output: 6 : 請問這有好的算法嗎 : 謝謝 :) 相鄰交換 -> 逆序數 -> 修改merge sort來計算逆序數 -> 基於兩兩比較的排序法都可以算逆序數 這套流程,推文已經講得很清楚了 這裡講另外一個基於 counting sort 與 prefix sum 的方法 int n = 4; char str[] = "DCBA"; int count[26] = {}; int ans = 0; for (int i = 0; i < n; ++i) { int index = str[i] - 'A'; count[ index ] ++; // ans += sum( count[index + 1] ... count[26 - 1] ); for (int j = index + 1 ; j < 26; ++j) ans += count[j]; } print ans; 時間複雜度 O(n * 26) = O(n) 或者也可以用 binary indexed tree,時間複雜度 O(n * lg(26)) = O(n) 或者也可以用其他的 prefix sum 演算法 由於輸入是有界整數,我猜應該可以做到 O(n * lglg(26)),不過還是 O(n) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.250.88.236 ※ 文章網址: http://www.ptt.cc/bbs/Prob_Solve/M.1412404852.A.586.html ※ 編輯: DJWS (111.250.88.236), 10/04/2014 14:47:36

10/06 08:18, , 1F
推(Y)
10/06 08:18, 1F

10/13 09:00, , 2F
已暈 推一下 慢慢看 @_@
10/13 09:00, 2F

10/17 16:08, , 3F
10/17 16:08, 3F
文章代碼(AID): #1KBvPqM6 (Prob_Solve)
討論串 (同標題文章)
文章代碼(AID): #1KBvPqM6 (Prob_Solve)