Algorithm 以最少的移动次数将集合划分为k个组
您有一组n个对象,它们的整数位置是给定的。一组对象是位于同一位置的一组对象(不一定是该位置的所有对象:一个位置可能有多个组)。对象可以向左或向右移动,目标是移动这些对象以形成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 我一直在尝试使用贪婪的方法(通过计算哪一步最短),但这不起作用,因为每一步都涉及两个元素,它们可以以任何方式移动。我还没有制定出动态规划方法,
- 初始位置为[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+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