簡體   English   中英

找到大小為 k 的子序列,使得值之間的最小距離最大

[英]Find subsequence of size k such that the minimum distance between values is maximum

假設我有一個包含n 個正浮點數的隨機序列(排序數組)。 如何找到大小為k的子序列,使得子序列中所有浮點對之間的最小距離最大化,我的意思是它們距離最遠。

注意序列的子序列是序列元素的有序子集,具有與原始序列相同的順序排序。

約束

  1. n>10^5
  2. n>k>2

例子

序列a[]={1.1,2.34,6.71,7.01,10.71}和k=3,子序列={1.1,6.71,10.71},10.71和6.71之間的最小距離為4。

錯誤的子序列

{1.1,7.01,10.71},最小距離為 3.7

{1.1,2.34,6.71},最小距離為 1.24

我想出了一個解決方案:

1) 排序數組

2) select a[0],現在在數組中找到 ceil(a[0]+ x) = Y....然后 ceil(Y+ x) 等等 k-1 次,第 k 個元素也是 a[n -1]

要找到 x:

dp[i,j] 是從前 i 個元素中選擇 j 個元素的 x。

最后我們想要 dp[n][k] 這是 x

但是我在查找 x 和重新排序索引時遇到了問題。

dp[i,j] = max( min( dp[k,j-1], dp[i]-A[k] ) )

超過 k=1 到 i-1,i=2 到 n,j=2 到 i

dp[i][1] = 0 超過 i = 1 到 n

我想更正動態編程解決方案,雖然我知道可以通過對 x 的二進制搜索找到 x,但是通過排序我松散的序列順序和耗時( On^2 ))。我如何克服這個問題?

如果有一個涉及排序的解決方案,首先要將 map 數組轉換為一個元組數組,其中包含一個值和一個 position 的元素。 現在,當您對數組進行排序時,您也知道原始位置。

但是我不相信排序最終會幫助你。

我看到的有效方法是對於每個0 <= i < n ,對於每個1 < j <= min(k, i+1) ,存儲最小距離和前一個條目以獲取長度為j的最佳子序列,結束於i

然后,您尋找長度為k的最佳子序列。 然后解碼子序列。

使用 JSON 表示法(為了清楚起見,而不是因為我這是正確的數據結構),以及您的示例,您可能會得到這樣的數據結構:

[
    {"index": 0, "value": 1.1},
    {"index": 1, "value": 2.34,
        "seq": {2: {"dist": 1.34, "prev": 0}},
    {"index": 2, "value": 6.71,
        "seq": {2: {"dist": 5.61, "prev": 0},
                3: {"dist": 1.34, "prev": 1}},
    {"index": 3, "value": 7.01,
        "seq": {2: {"dist": 5.91, "prev": 0},
                3: {"dist": 1.34, "prev": 1}},
    {"index": 4, "value": 10.71,
        "seq": {2: {"dist": 9.61, "prev": 0},
                3: {"dist": 4, "prev": 2}}
]

現在我們發現dist3的最大距離在索引4處為3.7 向后走,我們想要索引420 將它們拉出並反轉它們以獲得[1.1, 6.71, 10.71]的解決方案

暫無
暫無

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

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