繁体   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