給定n個元素和數字k的排序數組,是否有可能找到發生超過k次的元素(n)時間?如果發生超過k次的不止一個號碼,其中任何一個都可以接受。查找在log(n)時間內排序數組中至少出現k次的元素
如果是,如何?
編輯: 我能夠在線性時間內解決這個問題,我很高興在這裏發佈該解決方案 - 但在n中解決這個問題相當簡單。儘管我在log(n)中工作時完全陷入了困境,而這正是我的問題所在。
給定n個元素和數字k的排序數組,是否有可能找到發生超過k次的元素(n)時間?如果發生超過k次的不止一個號碼,其中任何一個都可以接受。查找在log(n)時間內排序數組中至少出現k次的元素
如果是,如何?
編輯: 我能夠在線性時間內解決這個問題,我很高興在這裏發佈該解決方案 - 但在n中解決這個問題相當簡單。儘管我在log(n)中工作時完全陷入了困境,而這正是我的問題所在。
這裏是O(n/k log(k))
解決方案:
i = 0
while i+k-1 < n: //don't get out of bounds
if arr[i] == arr[i+k-1]:
produce arr[i] as dupe
i = min { j | arr[j] > arr[i] } //binary search
else:
c = min { j | arr[j] == arr[i+k-1] } //binary search
i = c
的想法是,你在指數i+k-1
檢查元素,如果在指數i
匹配元素 - 不錯,這是一個傻瓜。否則,您不需要檢查i
到i+k-1
之間的所有元素,只有與arr[i+k-1]
具有相同值的那個元素。
你要回頭看看爲這個元素的最早的指數,但可以保證通過下一次迭代超過指數i+k
,使得這個算法O(n/k)
的迭代總數,各佔O(logk)
時間。
這是漸近比線性時間算法更好,尤其是用於k
大值(其中該算法衰減到O(logn)
對於其中k
是在O(n)
,像例如案例 - 發現重複至少與頻率元件0.1)
好問題。你到目前爲止有什麼? – biziclop
這不是如何工作。您至少需要提供您所嘗試的內容。 – npinti
順便說一下,如果'k'很大,線性解也可以非常快,因爲它只需要'n/k'元素檢查。 – biziclop