从不同的棍子上砍下相等的棍子


10

您有个任意长度的棍子,不一定是整数。ñ

通过切割一些木棍(一次切割可切割一根木棍,但我们可以根据需要进行多次切割),您希望得到木棍,使得:ķ<ñ

  • 所有这些棒的长度相同;ķ
  • 所有的至少与其他所有条一样长。ķ

请注意,执行切割后,我们获得了。Çñ+CC

您将使用哪种算法以使必要切割的次数最少?那是什么号码?

例如,取和任何。可以使用以下算法:Ñ 2ķ=2ñ2

  • 按长度的降序对摇杆进行排序,以使。大号1个大号2大号ñ
  • 如果则将木棒#1切成两等份。现在有两个长度为棒,其长度至少等于其余的棒。大号1 / 2 2 ... Ñ大号1个2大号2大号1个/22ñ
  • 否则(),将木棒#1切成两个不等长的和。现在有两个长度为棒,长度大于,其他两个棒为。L 2 L 1L 2 L 2 L 1L 2 3 n大号1个<2大号2大号2大号1个-大号2大号2大号1个-大号23ñ

在两种情况下,一次切割就足够了。

我试图将其推广为更大的,但是似乎有很多情况需要考虑。您能找到一个优雅的解决方案吗?ķ

Answers:


6

解决此问题的第一个核心发现是切割长度的可行性,

可行=[一世=1个ñ大号一世ķ]

是分段恒定的,连续的且不递增的。由于必要切割的数量表现相似,因此找到最佳长度仅仅是

=最大值{可行}

此外,由于其他答案已经提出,所有的跳跃不连续性的形式为。这给我们留下了一个适合二元搜索的离散一维搜索问题(在对一组有限的候选进行排序之后)。大号一世/Ĵ

注意此外,我们只需要考虑是比短 -largest一个,因为这一个是总是可行的。 ķ大号一世ķ

然后,不同边界导致算法效率不同。Ĵ

  • ķ1个Ĵķ产生一个平方大小(以)的搜索空间,ķ
  • 大号1个Ĵķ/一世线性(假设按减小的大小排序),并且大号一世
  • 线性边界的边界要稍微多一些。

使用此方法,我们可以在时间和空间解决提出的问题。Θ n + k Θñ+ķ日志ķΘñ+ķ

一个进一步的观察是在和在长通过对每一候选 “通过”,计数重复。使用此方法,我们可以使用等级选择而不是二进制搜索来获得在时间和空间上运行的最佳算法。1 大号/ Ĵ Θ Ñ FË一个s一世bË1个大号一世/ĴΘñ

在我们的文章《用最少的割线实现无羡慕的棒分割高效算法》(Reitzig和Wild,2015年)中找到详细信息。


事实证明,我们从切木棍的方法出发的想法会转嫁到更普遍的问题或(比例)分配问题上,即实际相关的问题。请参阅我们的简短文章
拉斐尔

4

正如@randomA建议的那样,我们将分两个阶段进行:我们首先找到将要切割的木棍组,然后最小化切割的次数。

就像问题中的特殊情况一样,我们对棒进行排序/命名,以便。这需要时间。 ø Ñ 登录Ñ L1L2LnO(nlogn)

正如@ user1990169指出的那样,我们永远不必裁切。iķ

在第一阶段,我们采用二进制搜索来查找号码,,使棒可以切成至少尺寸的片(加上一些小件) ,但不能将木棍切成个大小为碎片。这将花费时间。1 小号ķ 1 ... 小号ķ 大号小号 1 ... s ^ - 1 ķ 大号小号- 1 Ö ķ 日志ķ s1sķ1,,sķLs1,,s1个ķ大号s-1个Øķ日志ķ

如果,则此值为最佳大小,我们可以跳过第二阶段。大号s-1个=大号s

否则,我们知道最佳尺寸满足,如果则是通过将至少一根木棍切成相等大小的块而得到的。第二阶段将确定:大号小号- 1 > ö 大号小号 ö > 大号小号 ö öØ大号s-1个>Ø大号sØ>大号sØØ

对于每个棒,,确定一组候选的尺寸如下:如果切割成尺寸的片转动棒插入片(包括较短的,如果有的话),则该候选此stick是所有值,其中和。(有关为什么这些是唯一的候选大小,请参见@ user1990169的答案。)1 小号大号小号ř 大号一世1个一世s大号s[R一世 Ĵ[R大号大号一世ĴĴ[R一世大号一世Ĵ<大号s-1个

保持每个候选大小的发生频率。使用平衡搜索树,这可以在,因为候选大小的总数受约束。Σ ř 2 ķØķ日志ķ一世[R一世2ķ

现在,最常出现并导致有效切割的候选尺寸是为我们提供最佳解决方案的尺寸。此外,如果任何候选尺寸导致有效切割,则任何较小尺寸也将导致有效切割。

因此,我们可以再次使用二进制搜索来找到导致有效切入的最大候选长度。然后我们迭代候选长度的集合,直到该阈值,并在找到其中最大的一个。O k O(klogk)O(k)

如果我们忽略(或不必这样做)初始排序,则总共可以得到或的运行时。O k log k O(nlogn)O(klogk)


在二分查找步骤中,您如何精确地检查“棒可以切成至少k个大小为L s的碎片”?1,,skLs
Erel Segal-Halevi 2014年

对于计算大号/ 大号小号。这些值的总和就是您可以获得的件数。1isLi/Ls
FrankW

“最经常出现的候选人人数...是为我们提供最佳解决方案的候选人人数”-为什么?
Erel Segal-Halevi 2014年

每次发生时,我们都有一根棍棒,可将片切割成t 1tt1
FrankW 2014年

1
切割总数为最佳情况下 2kk2棒等长的,最多一半的其他棒,只要这些而据我所看到的将不会超过ķ-1。(绝对不会超过k,因为每个切口都会产生正确长度和剩余长度的棍子。但是似乎,我们总是可以选择大小,以便至少一个切口留下正确长度的剩余部分。我不会但是,没有证据。)k2k1k
FrankW 2014年

1

在按长度顺序从小到大订购了棒之后,只有在所有棒L 1L 2,...都被切割时,棒才被切割L i 1被切掉。L一世L1,L2,...Li1个

现在,由于,我们将不再对棒L k进行任何切割,因为我们总是可以拥有长度为L k的 k条棒。ķ<ñ大号ķķ大号ķ

ñķ-1个ķ=ķ-1个

<ķ-1个ķ-1个

ķ一世Ĵ
大号一世Ĵ大号1个

ØñØGñ+ķ3


1

高级的想法是二进制搜索。

ķķķķķ

ķ

希望我能从其他答案中看到有用的东西。


2
我认为您的方法的基本思想将奏效。但是您对算法的描述不够清楚,无法确定。您能否添加更详细的伪代码?
FrankW

@FrankW虽然我不太确定运行时间。我会看看别人有什么,这是一个很有趣的问题。
通知2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.