精華區beta CSSE 關於我們 聯絡資訊
※ 引述《Hatred (yo)》之銘言: : ※ 引述《mqazz1 (無法顯示)》之銘言: : : given two unsorted arrays X and Y, : : each contains m and n numbers, separately. : : design an algorithm so that, : : given a number d, : : it could determine if there exists two integers i and j, : : such that X[i] + Y[i] = d : 這裡是 X[i] + Y[j] = d 吧? 不然 j 會沒有用到... : : use less than O(m*n) running time : : 我想請問這題大致上從哪方面下手會比較簡易 : : 謝謝 : 或許可以這樣做: : 不妨假設 m<=n, 我們先把 d-X[1], ..., d-X[m] 算出來, 費時 O(m), 接著我們把這 m : 個數排序成一個 array A, 費時 O(m log m). 剩下的就是檢查 Y 裡面每個元素有沒有 : 出現在 A 裡面, 若有則回答 yes, 若完全沒有則回答 no. : 現在因為 A 已經被排序過, 所以判斷 Y 裡面任何一個元素在不在 A 裡面, 都只要 : O(log m) 時間即可 (用 binary search), 所以這步費時 O(n log m). : 總共花的時間是 : m<=n : O(m) + O(m log m) + O(n log m) ====== O(m log n) + O(n log m). Hatred的這個作法不錯,不過你最後的complexity應該是O(m log m) + O(n log n) 我也有一個作法: 先排序X再排序Y: O(m log m) + O(n log n) 然後下一步比較妙 排序後的X: x[0] x[1] x[2] ... x[m-1] 排序後的Y: y[0] y[1] y[2] ... y[n-1] 建兩個index,x-index一開始指x[0], y-index指y[n-1] 然後查看此兩數的和 while(x-index < m && y-index < n) { sum = x[x-index] + y[y-index] if sum > d --y-index else if sum = d current x and y element is a pair which meets the condition else ++x-index } 這個方法可能不是很直覺,但其實是正確的。那個迴圈的complexity 會是O(m)+O(n),其實正確來講是最大為m+n,兩個array頂多被整個iterate 一次而已。 所以complexity仍是O(m log m) + O(n log n)。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 74.68.114.250
LPH66:他的後一步是 for all y in Y search y in X 05/09 01:50
LPH66: A 05/09 01:50
LPH66:所以後面是 O(n log m) 無誤 05/09 01:50
willhunting:對 我打錯了 只有第一個是O(m log m) 05/09 03:23