テキストを一定の行数に均等に分割します


12

テキストを最大幅の行に均等に分割するための線形時間アルゴリズムがあります。SMAWK(またはKnuth&Plass)を使用し、「均等」という意味:http : //en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness

上記のアルゴリズムに、最大行幅ではなく、テキストを分割する行数を考慮に入れるアルゴリズムまたは凹型コスト関数がありますか?線形時間でも?

つまり、入力が目的の行幅ではなく、目的の行数である改行(または段落の形成、またはワードラップ)アルゴリズムを探しています。

実際には使用できないアプローチを説明するために、各単語ペアの間にN個の単語とN-1個のスペースがあり、Mは目的の行数(M <= N)です。各スペースの後に、最大で1つ(場合によってはゼロ)の改行があります。これで、アルゴリズムは可能な組み合わせのそれぞれにブレークを配置し、「不規則性」を計算して最適なものを返します。もっと速くする方法は?

また、そのような問題には名前がありますか?問題のどの「家族」に属しますか?(たとえば、「ビン梱包」)完全に最適なソリューションが必要ない場合、非常に良いソリューションだけで、はるかに速く解決することは可能ですか?(特定の入力に対して常に同じ、場合によっては最適ではないソリューションがあれば、何らかの形のヒューリスティックが使用可能になります)。

更新

チャンドラチェクリは、「ダイナミックプログラミングに関するクラインバーグとタルドスの章の問題」を提案しました。これは良い読み物でしたが、行数ではなく幅に基づいて改行を処理します。この問題に適応できるかもしれませんが、これは私が今考えていることです。ここにソリューションへの良いリンクがあります、彼らは線形時間でそれを解決するとさえ主張しています:http : //web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf

また、SkienaのThe Algorithm Design Manualには「8.5パーティションの問題」という章がありますが、これはまさにトピックに関連しているように見えますが、今でも読んでいます。(残念ながら、私が理解したことから、それは二次的な時間の複雑さを持っています)


5
素敵な動的プログラミングの問題!次の学期のクラスで宿題として使うかもしれません。
ジェフ

3
@Jɛff E宿題の問題に使用する場合は、回答がWebで公開される前に質問を閉じてください。
ジョー

1
@ジョー:答えに本当に興味がある人として、私は質問をクローズするよりも答えたいと思います。
エシルハナ

2
@ジョー:それは宿題ではなく、私もCSを勉強していません。「宿題レベル」とは何か、問題を解決する方法を想像することさえできない人もいれば、「宿題レベル」と考える人もいます。そうは言っても、答えは1週間で消去されるか、たとえば私のメールに送信されます。そして、「完全な答え」でもないことに感謝します。
エシルハナ

3
ダイナミックプログラミングに関するKleinbergとTardosの章には、行のスラックの合計を最小化するようにフォーマットする問題があります。
チャンドラチェクリ

回答:


4

MO(NlogU)UN2O(logMloglogN)M=Ω(logN)

MM


申し訳ありませんが、私は従うとは思わない。「エッジの重み」は単語の長さですか?「グラフ」はどのように見えますか?ノードがブレークポイントであり、エッジが単語の長さである単なる線形グラフですか?そして、この「Mリンクパス」は、結果のセグメントのエッジの合計が最小になるように分割しますか?しかし、最も重要なことは、最初の文で-ラグネスを個別に計算できるかどうかわかりません。それはおおよそ最長の行と実際の行の違いなので、他の行について何かを知る必要がありますか?最後の行については、上記の15番目のコメントをご覧ください。
エシルハナ

M1N+1(i,j)ij1

@Ecir:基本的に、動的プログラミングに基づくすべてのアルゴリズムでは、線の不規則性を個別に計算できることが必要です。そうでない場合は、私の2番目のアイデアのようなものを使用できます。線幅を推測し、その幅に基づいて解を計算し、より良い解を見つけるために反復します。
ジョウニシレン

ご説明ありがとうございます。もう2つ質問があります。「バイナリ検索」オプションを使用する場合、行数Mを保証するためにできることはありますか?同じ幅の線がなくなるように各線幅に小さなランダムイプシロンを追加すると、ブレークを配置することで解像度を上げることができます。
エシルハナ

また、「Mリンクパス」の場合、両方の論文で、「最小KリンクパスがO(nK)時間で計算できることを示すのは簡単です」と書かれています。私はそれに関するさらなる情報を見つけることができませんでした。問題は、これらの論文は、あまりにも私の小さな頭のために複雑な小さなビットは、私は、...多分より多くの情報、実装を見つけようとしているようです、である
Ecir花

-3

これが役立つかどうかはわかりませんが、このコメントの最後に誰かがPHPで必要なものを実装します。多分あなたはアルゴリズムを理解することができます。


4
コメントでは、必要な行数の後の残りの行を切り捨てています。それらはPHPを使用します。PHP wordwrap()はラッピングに貪欲な(つまり「均等」ではない)アルゴリズムを使用します。それでも、問題はの$width議論をどのように「推測」するかであるwordwrap()。とにかく、返信ありがとう。
エシルハナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.