亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這種獲取排序列表中最接近數字的方法是否最有效?

這種獲取排序列表中最接近數字的方法是否最有效?

慕工程0101907 2023-05-17 15:43:05
我有大量整數數組(大小在 10'000 到 1'400'000 之間)。我想讓第一個整數大于一個值。該值永遠不會在數組內。我一直在尋找各種解決方案,但我只發現:估計每個值并且不是為排序列表或數組設計的方法(時間復雜度為 O(n))。遞歸的和/或不是為非常大的列表或數組設計的方法(雖然在其他語言中具有 O(n) 或更多時間復雜度,所以我不確定)。我設計了自己的方法。這里是 :int findClosestBiggerInt(int value, int[] sortedArray) {    if( sortedArray[0]>value ||            value>sortedArray[sortedArray.length-1] )   // for my application's convenience only. It could also return the last.        return sortedArray[0];    int exp = (int) (Math.log(sortedArray.length)/Math.log(2)),        index = (int) Math.pow(2,exp);    boolean dir; // true = ascend, false = descend.    while(exp>=0){        dir = sortedArray[Math.min(index, sortedArray.length-1)]<value;        exp--;        index = (int)( index+ (dir ? 1 : -1 )*Math.pow(2,exp) );    }    int answer = sortedArray[index];    return answer > value ? answer : sortedArray[index+1];}它具有 O(log n) 時間復雜度。對于長度為 1'400'000 的數組,它將在 while 塊內循環 21 次。不過,我不確定它是否可以改進。沒有外部包的幫助,有沒有更有效的方法?節省任何時間都是很好的,因為這種計算經常發生。
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

沒有外部包的幫助,有沒有更有效的方法?節省任何時間都是很好的,因為這種計算經常發生。


那么這里是一種使用映射而不是數組的方法。


      int categorizer = 10_000;

      // Assume this is your array of ints.

      int[] arrayOfInts = r.ints(4_000, 10_000, 1_400_000).toArray();

您可以像這樣將它們分組在地圖中。


       Map<Integer, List<Integer>> ranges =

            Arrays.stream(arrayOfInts).sorted().boxed().collect(

                  Collectors.groupingBy(n -> n / categorizer));

現在,當你想找到下一個更高的元素時,你可以獲得包含該數字的列表。


假設您想要下一個大于 982,828 的數字


      int target = 982,828;

      List<Integer> list = map.get(target/categorizer); // gets the list at key = 98

現在只需使用您喜歡的方法處理列表即可。一張紙條。在某些情況下,您的最高數字可能會出現在緊隨其后的其他列表中,具體取決于差距。您需要考慮到這一點,也許可以通過調整數字的分類方式或搜索后續列表來解決。但這可以大大減少您正在使用的列表的大小。


查看完整回答
反對 回復 2023-05-17
  • 1 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號