![](/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.