簡體   English   中英

數組中的元素數量大於給定數量

[英]Number of elements in array greater than given number

好的,我知道這個問題被問了無數次,因為我以各種可能的形式谷歌搜索,但沒有得到答案。

我有一個數組,說A = {10,9,6,11,22}。 我必須找到大於11的元素。

我知道可以使用修改的二進制搜索來完成此操作,但我需要在O(1)時間內完成。 這可能嗎?

(請記住,我們將元素作為輸入,因此在進行輸入時可能需要進行一些預計算。)

  1. 從數組中刪除所有0,並對它們進行計數。 現在您知道輸入0的結果:n-計數。 然后從數組中所有剩余的元素中減去1。 此步驟的目標是使數字在[0,999999999]范圍內。 如果輸入大於0,則也減去1,否則立即返回結果。

  2. 對數字進行排序,然后將它們視為9位數字的字符串(用前導0填充)。

  3. 建樹。 每個節點代表一個數字。 每片葉子必須存儲數量大於其自身的數量。 我認為節點的數量不會太高。 對於最大n = 10 ^ 5,我們可以獲得約5 * 10 ^ 5個節點(10 ^ 5個不同的前綴使我們下降到大約5級,之后我們必須將鏈表鏈接到現有的10 ^ 5個葉子+ 4 * 10個葉子)鏈表的^ 5)。

  4. 現在,您必須遍歷所有非葉子節點,並為子節點中的所有缺失數字創建到下一個較小葉子的直接鏈接。 如果您將鏈接表示為葉子,並且與下一個下一個葉子的計數相同,則大約還有9 * 4 * 10 ^ 5個節點。

  5. 我認為現在理論上您可以得到O(1),因為請求的復雜度不取決於n,並且您將比創建哈希映射時節省的時間少得多。 在最壞的情況下,您必須下降9個節點,這是一個獨立於n的常數。

您還可以考慮先對輸入進行排序,然后將其插入Y-fast特里結構( https://en.wikipedia.org/wiki/Y-fast_trie ),其中每個元素還將指向其在已排序輸入中的索引,因此元素的數量大於或小於它。 Y-fast嘗試使用O(n)空間在O(log log M)時間內支持后繼和前任查找,其中M是范圍。

該答案假設建立數據結構本身不必一定是恆定時間,而只需檢索部分即可。

您可以遍歷數字數組並構建二叉樹。 該樹中的每個節點除包含數值外,還將包含另外兩個數據點。 這些點將是每個節點都大於和小於的元素數。 插入邏輯將很棘手,因為將需要保持此狀態。

在插入期間,在更新每個節點的計數器的同時,我們還可以維護一個按值索引的哈希映射。 鍵將是數組中的數字,而值則可能是包含該數字大於或小於的元素數量的包裝器。 由於哈希圖具有O(1)查找時間,因此可以滿足您的要求。

如果您需要O(1)查找時間,則可以考慮僅選擇一個哈希圖。 請注意,遍歷二叉樹,即使是平衡的,通常也仍然是lg(N)操作。 這可能非常快,但仍不是恆定的。

降低時間復雜度的唯一方法就是增加空間復雜度。

如果數組的元素范圍受到限制,可以說[-R1,R2],則可以在此范圍內構建一個哈希表,指向鏈接列表。 您可以預先計算此hashMap,然后在o(1)中返回結果。

暫無
暫無

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

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