Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 恰好k个元素的最小非连续序列_Algorithm - Fatal编程技术网

Algorithm 恰好k个元素的最小非连续序列

Algorithm 恰好k个元素的最小非连续序列,algorithm,Algorithm,我遇到的问题可以归结为: 给定一个N正数数组,找到具有最小和的K元素的非连续序列 Ok ish:只报告总数。额外好处:可以识别挑选的元素(如果多个可以实现相同的总和,则至少有一组索引) (外行术语:从N个值中选择任意K个非相邻元素,使其总和最小) 当然,2*k2** 蛮力-上一步根据非连续性标准得出的指数值的最小和-如果我是对的并且K+2足够了,我可以用蛮力强制一个(K+1)*(K+2)解空间,但正如我所说的。我不确定K+2是否足以满足K>2(如果事实上2*K点是必要的,那么暴力强迫就不存在了-

我遇到的问题可以归结为:

给定一个
N
正数数组,找到具有最小和的
K
元素的非连续序列

Ok ish:只报告总数。额外好处:可以识别挑选的元素(如果多个可以实现相同的总和,则至少有一组索引)

(外行术语:从N个值中选择任意K个非相邻元素,使其总和最小)

当然,
2*k2
**
  • 蛮力-上一步根据非连续性标准得出的指数值的最小和-如果我是对的并且
    K+2
    足够了,我可以用蛮力强制一个
    (K+1)*(K+2)
    解空间,但正如我所说的。我不确定
    K+2
    是否足以满足
    K>2
    (如果事实上
    2*K
    点是必要的,那么暴力强迫就不存在了-二项式系数
    C(2*K,K)
    增长得非常快)
  • 关于如何以最小的时间/空间复杂度实现这一点,有什么聪明的想法吗

    **对于
    K=2
    ,一个非常重要的示例,其中需要4个最接近绝对最小值的值来选择目标和
    [4,1,0,1,4,3,4]
    -不能使用
    0
    值来构建最小和,因为它违反了非连续性标准


    PS-如果您想显示代码片段,C/C++和/或Java将受到欢迎,但任何具有适当语法或伪代码的语言都可以(我认为“适当语法”不包括Perl,不是吗?

    应该有一种动态编程方法来实现这一点


    从左到右沿阵列工作。在每个点i,对于1..k中j的每个值,找到从1..i中选取j个非连续元素的正确答案的值。您可以通过查看i-1、i-2处的答案以及数组[i]的值来计算i处的答案。您想要的答案是长度为n的数组在n处的答案。完成此操作后,您应该能够通过沿数组回溯来确定元素是什么,从而确定每个点的最佳决策是否涉及在该点选择数组元素,从而确定它使用的是数组[i-1][k]还是数组[i-2][k-1]。

    假设输入数字存储在数组a[N]中

    一般的方法是DP:f(n,k)=min(f(n-1,k),f(n-2,k-1)+a[n])

    它需要O(N*K)时间,有2个选项:

    • O(N*K)空间的延迟回溯递归解
    • 用于正向循环的O(K)空间
    在大K的特殊情况下,还有另一种可能性:

    • 使用递归回溯跟踪
    • 使用map(N,map(K,pair(答案,列表(答案索引)))代替大小为N*K的helper数组
    • 保存答案和此答案的索引列表
    • 如果k>N/2,立即返回最大值

    这样,对于K~=N/2,时间比O(NK)要短,类似于O(Nlog(N))。对于较小的K,它将增加到O(N*log(N)Klog(K)),因此在一般方法和特殊情况算法之间做出决定是很重要的。

    我将把这句话重新表述为:在一个数字数组中,找到K个非连续的最小元素(它们产生最小和的事实是找到这些元素的副产品).是否确定所有k元素都必须是非相邻元素?严格地说,非连续序列只意味着任何元素之间至少有一个间隙。@IngoBürk绝对肯定。因此,我确定我提供了外行术语解释,其中强调了非相邻。@FDavidov“我会将其改写为:在一个数字数组中,找到k个非连续的最小元素”可能是,可能不是-我不知道这是如何推动解决方案向前发展的。你想详细说明一下吗?那么,你不明白。好啊生成节点的排序列表(从最小到最大),其中每个条目都包括原始列表中的值及其索引。根据定义,最小的值为。然后,开始检查第二个节点是否与第一个节点相邻,如果不是,则将其添加到节点列表中,否则移动到下一个节点,。。。您不需要计算不同集合的总和并找到产生最小值的集合。现在更清楚了?我不确定[1..K]中的DP over
    j会有什么帮助。为了应用DP,如果我从下一个层次看问题,子问题的答案不能改变。在我提供的示例中,子问题
    j=1
    将目标置于索引2(val
    0
    )。如果我再加上一个,上一个子问题是没有帮助的——要么我保留它并得到一个坏结果,要么把它扔掉,我以前也没有好到哪里去。或也许我不太明白你的意思?@Adriancolomithi:我们正试图计算f(I,j),这是j个元素的最大非连续总和,不需要只使用@j_random_hacker位置的元素就可以实现。一开始有点困惑,因为在阅读文本解释时,我无意中发现了对
    j=1..k
    的依赖性,完全错过了“I-1、I-2处的答案和数组[I]的值”部分。我必须承认,当亚历山大的回答出现时,我的第一反应是“但是……很明显,我怎么会错过呢?”谢谢,我下定决心,看看能从中得到什么。你的肠子感觉如何,对于小K-E,是否可以进行预选扫描并只保留一个序列以无风险地进入DP?毫无疑问,这些价值观的堆积不会对结果产生影响。假设我选择K个最小值+左/右neighs(跟踪它们的索引位置),将它们整理为DP的输入,一种“原始的代表”。。。会有风险吗?我应该寻找更多的K吗?(空间复杂性是我现在正在寻找的,我几乎可以肯定你的建议是正确的)。采用最低K值看起来很有希望,但如果DP的时间很关键,我会选择2*K最低值+neightbors。但如果你都是为了记忆的复杂性