簡體   English   中英

在 Java 中對包含百萬個數字的數組進行排序

[英]Sorting an array containing million numbers in Java

這是一個面試問題,我正在尋找專家可以以更好的方式回答...

如何對 Java 中包含百萬個數字的數組進行排序?

謝謝!

面試問題永遠沒有正確答案。 面試官教你問開放式問題,看看你是如何思考和推理問題的。 反過來,您應該展示思考的過程,並證明您可以以“軟件工程方式”進行思考。

像這樣的東西:

  1. 哦……一百萬個數字……
  2. 我認為它們很簡單,所以 100 萬將需要大約 4 兆字節的 memory
  3. (嗯......可能我在這里錯了,long 需要 8 個字節,所以它將是 8 MB...... - 現在對於那個問題來說並不那么重要)。
  4. 我們能夠將其加載到 memory 並使用現成的算法 Arrays.sort(long[])
  5. (我確實知道我的工具和核心庫)。
  6. 不會有額外的 memory 和 O(n*log(n)) 復雜度(順便說一句,6 000 000 次操作)。
  7. 你能做得更快嗎?
  8. 哦...我記得我聽說過基數排序 - 該算法為我們提供了 o(k*n) 復雜度,其中 k 是有效位數的數量(長時間它將是 integer(20 億 = 9 位)= 18 的兩倍數字)所以它將是 18 * 100 萬 = 哦......它會慢 3 倍,我不確定算法需要多少額外的 memory。
  9. 如果我們有太多的數據會溢出可用的 memory?
  10. 我們將數據分成 l 個大小為 m 的塊,因此每個塊都適合 memory
  11. 我們將分別對每個塊進行排序並將結果存儲到文件中
  12. 排序文件的合並將以 o(m) 的速度進行
  13. 我們將需要執行 l-1 這樣的合並
  14. 等等

如果數字在有限范圍內,請使用 100 萬的 boolean 數組。 這將使 memory sage 降低到 125 mb。 使用索引作為數字和值作為真或假。 取消現有數組,並將其填充為通過 boolean 數組讀取。

我們可以將條目放在NavigableHashMap中,它以排序的方式保存數據。 因此,在放置鍵時檢查是否已經存在鍵,然后將值增加 1。現在在提取數據時打印鍵值的倍數。 只是在這種情況下,我們只運行一次數組,即 O(N)。

使用 JVM “專家”方式:

Arrays.sort(numberArray);

因為它是整數,並且有一百萬個 - 基數排序,就地排序以及與可用 CPU 一樣多的線程

在數組中存儲數百萬個數據並不是一個好主意 它可能會導致 MemoryOutOfBounds 異常。 這將導致性能問題。 但是如果你想對數組進行排序

int[] intArray = new int[] {4, 1, 3, -23};
Arrays.sort(intArray);
// [-23, 1, 3, 4]

String[] strArray = new String[] {"z", "a", "C"};
Arrays.sort(strArray);
// [C, a, z]

// Case-insensitive sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
// [a, C, z]

// Reverse-order sort
Arrays.sort(strArray, Collections.reverseOrder());
// [z, a, C]

// Case-insensitive reverse-order sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(Arrays.asList(strArray));
// [z, C, a]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM