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组,并以移动的最小距离进行移动 例如: 初始位置为[4,4,7],k=3时,最小成本为0 [4,4,7]和k=2:最小成本为0 [1,2,5,7]和k=2:最小成本为1+2=3 我一直在尝试使用贪婪的方法(通过计算哪一步最短),但这不起作用,因为每一步都涉及两个元素,它们可以以任何方式移动。我还没有制定出动态规划方法,

您有一组n个对象,它们的整数位置是给定的。一组对象是位于同一位置的一组对象(不一定是该位置的所有对象:一个位置可能有多个组)。对象可以向左或向右移动,目标是移动这些对象以形成k组,并以移动的最小距离进行移动

例如:

  • 初始位置为[4,4,7],k=3时,最小成本为0
  • [4,4,7]和k=2:最小成本为0
  • [1,2,5,7]和k=2:最小成本为1+2=3

我一直在尝试使用贪婪的方法(通过计算哪一步最短),但这不起作用,因为每一步都涉及两个元素,它们可以以任何方式移动。我还没有制定出动态规划方法,但我正在研究它。

据我所知,问题是:

我们在一条线上有n个点。 我们想把k位置放在这条线上。我称之为目的地。 将n个点中的每个点移动到k个目的地之一,使距离之和最小。我称之为总成本。 目的地可以重叠

一个明显的事实是,对于每个点,我们应该在左侧查找最近的目的地,在右侧查找最近的目的地,然后选择最近的目的地

另一个重要的事实是,所有目的地都应该在积分榜上。因为我们可以在直线上向右或向左移动它们,以到达一个点,而不增加总距离

根据这些事实,考虑DP解决方案:

DP[i][j]指第一个i点所需的最低总成本,此时我们只能使用j个目的地,并且必须在第i点上放置一个目的地

要计算DP[i][j],请在第i个点之前固定目的地(我们有i个选项),并为每个选项(例如第k个点)计算第i个点和添加的新点(第k个点)之间的点所需距离。将其与DP[k][j-1]相加,找出所有k的最小值


初始状态(如j=1)和最终答案的计算留作练习

任务0-按非降序排列对象的位置

让我们将
“中心”
定义为对象移动到的位置。

现在我们有两个观察结果

  • 对于N个位置,“中心”将是最接近这些N个位置平均值的位置。
    例如,设1,3,6,10为位置。那么平均值=5。最近的位置是6。因此,这些元素的中心是6。当所有元素都需要分组为一组时,这为我们提供了移动成本最低的位置

  • 让N个位置“最优”分组为K组
    当添加第N+1个对象时
    ,则只会干扰第K组,即前K-1组保持不变。

  • 根据这些观察,我们构建了一种动态规划方法

    Let Cost[i][k] and Center[i][k] be two 2D arrays. 
    Cost[i][k] = minimum cost when first 'i' objects are partitioned into 'k' groups
    Center[i][k] stores the center of the 'i-th' object when Cost[i][k] is computed.
    
    设{L}为i-L,i-L+1,…i-1中具有相同中心的元素。

    (中心[i-L][k]=中心[i-L+1][k]=…=中心[i-1][k])

    这些是计算第i个元素时需要考虑的唯一对象(来自观察2)

    现在

    computecost()可以通过查找中心(从观察1)轻松找到

    时间复杂性:

    Sorting O(NlogN)
    Total Cost Computation Matrix = Total elements * Computecost = O(NK * N)
    Total = O(NlogN + N*NK) = O(N*NK)
    
    让我们看看k=1

    对于k=1和n奇数,所有点都应移动到中心点。对于k=1和n偶数,所有点都应移动到任一中心点或它们之间的任何点。“中心”是指两边的点数,即中间值

    您可以看到这一点,因为如果您选择一个目标点x,其右侧的点比左侧的点多,那么x右侧的新目标1将导致成本降低(除非右侧比左侧多出一个点,且目标点是一个点,在这种情况下,n为偶数,且目标位于两个中心点上/之间)

    如果你的点已经被排序,这是一个O(1)运算。如果没有,我相信这是O(n)(通过顺序统计算法)

    一旦你找到了所有的点都要移动到的地方,你就可以找到成本了


    因此,无论点是否排序,这都是O(n)。

    这个问题是的一维实例,可以这样说。给定一组点x_1…x_n,将这些点划分为k个集S_1…S_k,并选择k个位置y_1…y_k,以最小化所有x_i的和,其中y_f(i) 是x_i被分配到的集合的对应位置

    由于中间值是,因此每个位置y_j将是相应集合S_j中元素x的中间值(因此称为k-中间值).由于您正在查看整数值,因此有一个技术问题,即如果S_j包含偶数个元素,则中值可能不是整数,但在这种情况下,选择中值上方或下方的下一个整数将给出相同的绝对距离总和

    解决k-中位数(以及相关的和更常见的问题)的标准启发式是迭代的,但这不能保证产生最优甚至好的解决方案。解决一般度量空间的k-中位数问题是NP难的,找到k-中位数的有效近似是一个开放的研究问题。谷歌搜索例如,“k-中值近似”将导致一系列给出近似方案的论文。

    在一维中,事情变得更容易,您可以使用动态规划方法。中描述了相关一维k-means问题的DP解决方案,R中的源代码可用。有关详细信息,请参阅本文,但其思想与@SajalJain提出的基本相同,并且可以轻松地进行调整以解决k-medi问题ans p
    Sorting O(NlogN)
    Total Cost Computation Matrix = Total elements * Computecost = O(NK * N)
    Total = O(NlogN + N*NK) = O(N*NK)
    
    D(j,m) = min (D(j-1,q) + Cost(x_{q+1},...,x_m)
    
    Cost(x_1,...,x_h) = Cost(x_2,...,x_h) + median(x_1...x_h)-x_1   if h is odd
    Cost(x_1,...,x_h) = Cost(x_2,...,x_h) + median(x_2...x_h)-x_1   if h is even