![](/img/trans.png)
[英]Find subset of size k such that the minimum distance between values is maximum
[英]Find subsequence of size k such that the minimum distance between values is maximum
假設我有一個包含n 個正浮點數的隨機序列(排序數組)。 如何找到大小為k的子序列,使得子序列中所有浮點對之間的最小距離最大化,我的意思是它們距離最遠。
注意:序列的子序列是序列元素的有序子集,具有與原始序列相同的順序排序。
約束
例子:
序列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,但是通過排序我松散的序列順序和耗時( O ( n^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}}
]
現在我們發現dist
為3
的最大距離在索引4
處為3.7
。 向后走,我們想要索引4
、 2
和0
。 將它們拉出並反轉它們以獲得[1.1, 6.71, 10.71]
的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.