簡體   English   中英

給定一個已排序的數組和一個正整數 k,求區間 (100(i-1)/k, 100(i)/k] 中整數的個數為 1 <= i <= k

[英]Given a sorted array and a positive integer k, find the number of integer in the interval(100(i-1)/k, 100(i)/k] for 1 <= i <= k

給定一個已排序的數組 A[1..n] 和一個正整數 k,計算區間 (100(i-1)/k, 100(i)/k] 中整數的個數,因為 1 <= i <= k並將其存儲在另一個數組 G[1..k] 中

假設數組 G 已經創建(不是算法中的輸入)並且 G 中的元素被初始化為 0。

另外,還有一個輔助函數Increase(i, count),可以找到A[i]對應的區間(G[?]),並通過count增加G[?]的值;

例如,一個已排序的數組 [1,11,25,34,46,62,78,90,99] 和 k = 4

所以結果應該是 G[1] = 3, G[2] = 2, G[3] = 1, G[4] = 3 其中 G[1] 是一個區間 (0,25] G[2] - > (25,50] G[3] -> (50,75] G[4] -> (75,100]

有沒有分治算法來解決這個問題? 而不是線性解決它?

更高級:另外,如果我們不能直接訪問數組 A 中的元素,並且有一個函數 Compare(x, y) 如果 A[x] 和 A[y] 在相同的區間內返回真。 如何解決? 我可以嘗試使每個組調用最多 log n 次增加並且有 k 個組因此運行時間為 O(k log n )?

我在這一點上的觀察:如果 A[i] 和 A[y] 在 i < y 的同一區間內,則 i < j < y 的元素 A[j] 也將在同一區間內。

最簡單的次線性方法(假設 k << n)是執行 (k+1) 二進制搜索,每個邊界值一個,產生近似 (k lg n) 比較算法。

通過智能地將探針組合在一起,這可以降低到大約 (k (1 + lg (n/k)))。

暫無
暫無

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

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