異なる棒から同じ棒を切る


10

あなたは持っている必ずしも不可欠ではない任意の長さの棒を、。n

いくつかのスティックをカットすることで(1つのカットは1つのスティックをカットしますが、何度でもカットできます)、次のようなスティックを取得します。k<n

  • これらのスティックはすべて同じ長さです。k
  • すべてのスティックは、少なくとも他のすべてのスティックと同じ長さです。k

カットを実行した後、スティックを取得することに注意してください。n+CC

必要なカットの数が最小限になるように、どのアルゴリズムを使用しますか?そして、その数は何ですか?

例として、と任意の考えます。次のアルゴリズムを使用できます。k=2n≥2

  • となるような長さの降順でスティックを並べます。L1≥L2≥…≥Ln
  • もしその後、カットスティック2等分に#1。長さ本の棒があり、少なくとも残りの棒同じ長さです。L1≥2L2L1/22…n
  • それ以外の場合()、スティック#1を2つの等しくないサイズおよびます。これで、長さ 2つの棒があり、より長く、他の棒はです。L1<2L2L2L1−L2L2L1−L23…n

どちらの場合も、1回のカットで十分です。

これをより大きなに一般化しようとしましたが、考慮すべき多くのケースがあるようです。エレガントなソリューションを見つけることができますか?k

回答:


6

この問題を解決するための最初の核となる観察は、切断長さ実現可能性であり、l

Feasible⁡(l)=[∑i=1n⌊Lil⌋≥k]、

は区分的に一定で、左連続で、増加しません。必要なカットの数は同様に動作するため、最適な長さを見つけることはちょうどですl

l⋆=max{l∣Feasible⁡(l)}。

さらに、他の回答が提案しているように、すべてのジャンプの不連続性は形式を持っています。これにより、(有限の候補セットをソートした後)二分探索が可能な離散的な1次元の探索問題が残ります。Li/j

さらに、最大よりも短いのみを考慮する必要があることに注意してください。これは常に可能であるためです。 KLik

次に、境界が異なると、アルゴリズムの効率も異なります。j

  • k個1≤j≤kは、2次サイズ(単位)のサーチスペースになります。k
  • L I1≤j≤⌈k/i⌉ in a linearithmic one(仮定すると、はサイズの減少によってソートされると仮定)、およびLi
  • 線形境界でやや複雑な境界。

これを使用して、提案された問題を時間および空間解くことができ。Θ (n + k )Θ(n+klog⁡k)Θ(n+k)

もう1つの観察は、の合計は、「合格」の候補ごとにがずつ、重複を数えることです。これを使用すると、二値検索の代わりにランク選択を使用して、時間と空間で実行されるアルゴリズムを取得できます。これは最適です。 L 1 L I / J Θ (N )Feasiblel1Li/jΘ(n)

詳細については、「Fewest カットによる羨望のないスティック分割のための効率的なアルゴリズム(Reitzig and Wild、2015年)」を参照してください。


結局のところ、スティックを切るという私たちのアプローチからのアイデアは、より一般的な問題または(比例した)配分、実用的な関連性の問題に引き継がれます。それに関する私たちの短い記事を参照してください。
— ラファエル

4

@randomAが示唆するように、2つのフェーズで処理を進めます。まず、カットするスティックのセットを見つけ、次にカットの数を最小限に抑えます。

質問の特別なケースのように、スティックをソート/命名して、ます。これには時間かかります。 O (N ログN )L1≥L2≥⋯≥LnO(nlog⁡n)

@ user1990169が指摘したように、をカットする必要はありません。i≥k

最初のフェーズでは、バイナリ検索を使用して数、を見つけます。これにより、スティックは、サイズ少なくとも個(さらにいくつかの小さな断片)にカットできます。、ただしスティックはサイズ個にカットできません。これには時間かかります。1 ≤ S ≤ K 1 、... 、S K L S 1 、... 、sは- 1つのK L S - 1 O (k個の対数K )s1≤s≤k1,…,skLs1,…,s−1kLs−1O(klog⁡k)

場合、この値は、最適なサイズであり、我々はフェーズ2を省略することができます。Ls−1=Ls

そうでなければ、我々は知っている最適なサイズ満たすとなら次いで等しい大きさの小片にスティックの少なくとも一方を切断から生じます。フェーズ2はを決定します。L S - 1 > O ≥ L S O > L S O OoLs−1>o≥Lso>Lsoo

各スティック、、次のように候補サイズのセットを決定します。サイズピースにカットすると、スティックがピース(存在する場合は短い方を含む)に変わる場合、この候補がstickはすべての値。ここで、およびです。(これらが唯一の候補サイズである理由については、@ user1990169の回答を参照してください。)1 ≤ I ≤ S L S R I L Ii1≤i≤sLsri J≤RILをILijj≤riLij<Ls−1

候補のサイズごとに、それが発生した頻度を維持します。候補のサイズの総数はによって制限されるため、バランスの取れた検索ツリーを使用すると、これはで実行できます。Σ I 、R I ≤ 2 KO(klog⁡k)∑iri≤2k

現在、最も頻繁に発生し、有効なカットにつながる候補サイズは、最適なソリューションを提供するものです。さらに、候補サイズが有効なカットにつながる場合、小さいサイズも有効なカットにつながります。

したがって、再度バイナリ検索を使用して、有効な切断につながる最大の候補の長さを見つけることができ。次に、このしきい値までの候補の長さのセットを反復処理し、でそれらの中で最大の群集長をもつものを見つけます。O (k )O(klog⁡k)O(k)

合計で、最初のソートを無視する(または実行する必要がない場合、またはでランタイムを取得します。O (k log k )O(nlog⁡n)O(klog⁡k)


二分探索ステップでは、「スティックが少なくとも個のサイズカットできるか」をどのように正確にチェックしますか?k L s1,…,skLs
— Erel Segal-Halevi 2014

以下のための計算。これらの値の合計は、取得できるピースの数です。⌊ L I / L S ⌋1≤i≤s⌊Li/Ls⌋
— FrankW 2014

「最も頻繁に発生した候補サイズは...最適なソリューションを提供するサイズです」-なぜですか?
— Erel Segal-Halevi 2014

それが発生するたびに、個のカットで個を与えるスティックがあります。t − 1tt−1
— FrankW

1
カットの総数は最良の場合(に長い限り私以上になることはありません見ることができるように、これらとなどと同じ長さのスティック、ほとんど半分で他のすべてのスティック。(それすべてのカットが適切な長さと残りのスティックを生成するため、超えることは絶対にありません。しかし、少なくとも1つのカットが正しい長さの残りを残すようなサイズを常に選択できるようです。私はそうではありません。ただし、その証拠があります。) kk2 k-1kk2k−1k
— FrankW 2014

1

スティックを長さの降順で注文した後、すべてのスティックがカットされた場合にのみ、スティックがカットされます。L 1、L 2、。。。L i − 1LiL1,L2,...Li−1

ここで、スティック以降はカットしないでください。長さスティックを常に持つことができるためです。L k k L kk<nLkkLk

したがって、今では代わりに、スティック(全体として番目のスティックを追加する可能性があります)と、最悪の場合に必要なカットの最大数ます。k − 1 k = k − 1nk−1k=k−1

切断の最適数である場合にも、は、スティックの少なくとも一組は、それらの間で存在しなければならない 1本のオリジナルスティックから全体として取られなければならないスティックk − 1<k−1k−1(部分または1個のいずれか)つまり、その元のスティックのどの部分も「未確認」のままにしてはなりません。これは、鳩の穴の原理により、1つ以上の有効なスティックを生成する必要がある少なくとも1つのカットが存在する必要があるためです。

次に、2つのネストされたforループを実行できます(両方ともまで)。外側のループは、すべてのパーツを取得する必要があるスティック番号を示し、内側のループは、そのスティックでできているパーツの数を示します。 各サイズについて、スティック以降を順番にカットすることで実現可能なkスティックが得られるかどうかを確認し、可能であれば、現在必要な数が少ない場合は、これまでに必要な最小カットを更新します。i j L ikij
L1LijL1

上記のアルゴリズムの全体の複雑さはO(nlog(n)+k3)


1

高レベルのアイデアは、バイナリ検索になります。

要求されたkスティックのそれぞれのサイズは、少なくとも最小のスティックで最大で最大のスティックになります。このため、中棒のサイズでバイナリ検索を使用して続行し、取得できる数を確認します。このが指定されたより大きい場合、新しい参照候補サイズを選択する必要があることがわかります。そのため、新しいリファレンススティックを使用して、大きいまたは小さいものに移動します。が未満になると停止しますk ′ k k ′ kk′k′kk′k

適切なリファレンススティックが見つかったら、サイズをさらに調整する必要があるコーナーケースがあります。すべてのカットスティックを、カット数とスティックのサイズでソートできます。カット数が最も少なく、サイズが最も小さいものを選択します。このスティックのカット数を1つ減らし、これのサブスティックをすべて同じサイズにします。これは新しい参照サイズになります。この新しいサイズが許容可能なつながるかどうかを確認してください。この場合、実行時間を制限する方法がわかりません。k′

うまくいけば、私は他の答えから有用な何かを見ることができます。


2
あなたのアプローチの基本的な考え方はうまくいくと思います。しかし、アルゴリズムの説明は、十分に明確ではありません。より詳細な疑似コードを追加できますか?
— FrankW 2014

@FrankW実行時間についてはあまり確信が持てません。他の人が何を持っているかを見ていきます。これは非常に興味深い質問です。
— InformedA 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.