[英]Array with specific values
給定一個n的大小的數組,其中:1/2的數組具有單個(未知)值。 陣列的1/4具有單個(未知)不同的值。 等等為1 / 8,1 / 16,1 / 32給出一個算法來對數組進行排序。 您不能使用查找中值算法
所以我想的是:只有logn不同的值有一個簡單的解決方案在O上使用二進制堆(n * loglogn)它看起來像是一個需要在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.