簡體   English   中英

具有特定值的數組

[英]Array with specific values

給定一個n的大小的數組,其中:1/2的數組具有單個(未知)值。 陣列的1/4具有單個(未知)不同的值。 等等為1 / 8,1 / 16,1 / 32給出一個算法來對數組進行排序。 您不能使用查找中值算法

所以我想的是:只有logn不同的值有一個簡單的解決方案在O上使用二進制堆(n * loglogn)它看起來像是一個需要在O(n)中解決的問題

這是一種可能的方法:

  • 掃描數組並在分攤的 O(n)時間內在哈希表中存儲元素頻率(有log n個不同的元素); 這是可行的,因為我們可以在攤銷的O(1)時間內進行插入 ;
  • 現在在這些log n元素上運行經典的排序算法:這在確定性O(log n log log n)時間內是可行的,比如使用堆排序或合並排序;
  • 現在展開已排序的數組---或創建一個新數組並使用排序數組和哈希表填充它 - 使用哈希表中的頻率; 這在O(n)攤銷時間是可行的。

因此,整個算法以攤銷的O(n)時間運行,即,它通過消除重復和擴展排序的陣列來主導。 空間復雜度為O(n)。

這基本上是最佳的,因為您需要“觸摸”所有元素以打印排序的數組,這意味着我們在運行時間上具有匹配的下限Omega(n)。

我們的想法是使用多數算法,該算法取O(n)然后發現什么是“半”值從數組中刪除它然后再在新數組上再做n + n / 2 + n / 4 + n / 8 + ..... <2n => O(n)

遍歷數組一次,保留哈希映射以查看值。 就像你說的那樣,只有log(n)不同的值。

現在你有了所有不同值的列表 - 對它們進行排序將需要lon(n)*log(log(n))

一旦你有了排序的uniq,就像它很容易構建原始數組:最大值將需要n/2單元格,第二個需要n/4 ,依此類推。

總運行時間為O(n + lon(n)*log(log(n)) + n) ,即O(n)

暫無
暫無

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

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