簡體   English   中英

在 O(1) 時間內用 Java 初始化一個數組

[英]Initializing an array in Java in O(1) time

是否可以在 O(1) 時間內在 java 中初始化一個數組。 在 C\C++ 中這是可能的,因為該語言不會自動將數組初始化為 0。據我所知,在 Java 中,沒有辦法跳過自動初始化步驟。

澄清一下,我的意思是使用具有所有數組功能的專用數據結構,並增加了在恆定時間內(以 O(1) 復雜度)將所有數組元素初始化為某個值(如零)的能力。 這通常使用 3 個未初始化的數組和一個計數器來完成。

有關此方法的更多信息https://eli.thegreenplace.net/2008/08/23/initializing-an-array-in-constant-time

在 Java 中,您不能分配未初始化的數組。

您可以使用 Unsafe.allocateMemory 方法分配未初始化的內存,該方法將返回一個指針,但這是一個私有 API ,可能隨時變得不可用,並且它已經部分不可用JEP 403

T[] arr = new T[n]; 將使用默認值初始化數組:null (Object, false (boolean), 0 (int) 等等。

你可以做T[] arr = {a, b, c}; T[] arr = new T[]{a, b, c}; . 可能實施得更好——但事實並非如此。

現在考慮:

int[] arr = new int[100_000];
Arrays.fill(arr, 13);

盡管被Arrays.fill覆蓋,新數組anewarray的 jave 字節碼指令通常會將許多元素歸零。 盡管 JIT 或 AOT 編譯器可能會優化真實機器指令中的組合代碼。

速度損失是相對的,因為執行速度仍然很快,通常應該進一步處理數組元素。

對於稀疏數組,還有其他數據結構,例如Map<Integer, Integer> 布爾數組可以使用更緊湊和更快的BitSet

在 C 中,數組分配不一定會將元素歸零:數據可能會被統一化,或者更糟糕的是 - 回收內存。 出於這個原因,java初始化數組:更好的代碼質量。

java中有一些不安全的內存特性,但是使用它們是沒有意義的。 但是,您可以在最新的 Java 版本中使用非 Java 堆內存。 使用java中的計算,通常會更慢。 所以最好在非常關鍵的情況下使用 C。

在 Java、C 和 C++ 中,您可以創建一個提供數組功能的數據結構,而無需在實際需要之前為元素分配內存。 有時會針對不會使用大多數元素的非常大的數組執行此操作。 稀疏數組和稀疏矩陣就是示例。 它以增加訪問元素所需的時間為代價減少了初始化時間。 我將在這篇文章的其余部分考慮一個稀疏數組。

假設SparseNode具有int indexdouble value和可能的其他實例變量。 index指示如果它在一個普通數組中它會在哪里。 SparseArray類可能包括以下方法: public void setValue (int index, double value)public double getValue (int index) 我將忽略拋出異常的可能性。

如果SparseArrayLinkedList支持,則使用這些方法中的任何一種都可能涉及對元素的順序搜索,直到找到具有匹配索引的元素或確定該元素不在數組中。

如果未找到該元素, getValue方法將返回默認值,對於大多數稀疏數組應用程序,該值為零。 set方法會將元素添加到列表中。

在鏈表中,您可以指定新元素的位置以保持它們的順序。 如果數組元素不在列表中,則搜索將提前終止,盡管搜索仍然是 O(n) 時間復雜度。

與對getValuesetValue的每次調用使用順序搜索相比,有一些方法可以提高性能。 如果元素保持有序,則可以使用二進制搜索。 另一種可能性是使用搜索樹,或者作為另一個答案建議,使用散列函數的結構。

暫無
暫無

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

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