Algorithm 查找大小为k的子序列,使值之间的最小距离最大

Algorithm 查找大小为k的子序列,使值之间的最小距离最大,algorithm,optimization,dynamic-programming,approximation,np-hard,Algorithm,Optimization,Dynamic Programming,Approximation,Np Hard,假设我有一个随机序列(排序数组),其中包含n正浮点。 如何找到大小为k的子序列,以使子序列中所有浮点对之间的最小距离最大化,我的意思是它们处于最远的距离 注意:序列的子序列是序列元素的有序子集,与原始序列具有相同的顺序 约束 n>10^5 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.

假设我有一个随机序列(排序数组),其中包含n正浮点。 如何找到大小为k的子序列,以使子序列中所有浮点对之间的最小距离最大化,我的意思是它们处于最远的距离

注意:序列的子序列是序列元素的有序子集,与原始序列具有相同的顺序

约束

  • n>10^5
  • 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) 选择一个[0],现在在数组中找到ceil(a[0]+x)=Y…,然后找到ceil(Y+x)和 在k-1次上,第k个元素也是[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)。我如何克服这个问题?

    如果有一个解决方案涉及排序,首先要将数组映射到元组数组,元组数组包含元素的值和位置。现在,当您对数组进行排序时,您也知道了原始位置

    然而,我不相信分类最终会对你有所帮助


    我看到的有效方法是针对每个
    0 OK。。。这是一个很好的建议……但是,它很耗时……我想要一个O(n)等级的贪婪算法。这个解决方案是
    O(kn^2)
    。通过大量的工作,可以将其归结为
    O(kn log(n))
    。但我建议在你首先找到一个有效的解决方案之前不要尝试优化它。@IrajShokouhiBahar确保你确实看到了评论。作为记录,我开始试图解释如何加速,但很快发现解释起来很复杂。编写代码将更加复杂。我建议你不要这样。好的。。。你有什么建议?@IrajShokouhiBahar试着按照我描述的思路找到一个解决方案。显然,使用更多类似C的数据结构(如结构数组)而不是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}}
    ]