次の簡単な例のような一連の範囲がある場合...
[
[12, 25], #1
[14, 27], #2
[15, 22], #3
[17, 21], #4
[20, 65], #5
[62, 70], #6
[64, 80] #7
]
...最大に交差するサブセットをどのように計算しますか(言い方はよくわかりませんが、「交差し、カーディナリティが最も高い範囲のサブセット」を意味します)、交差度(そのサブセット内の範囲のカーディナリティ)を決定します)?
論理的には解決できますし、それを素朴なアルゴリズムに変換できるかもしれません。リストを下に進むと、1-5 が交差し、5-7 が交差し、#5 が両方のセットと交差することがわかります。
私が望む結果は、単にサブセットです。これにより、カーディナリティに関する情報が得られ、すべてが交差する限り、セットの交差を簡単に計算できます。上記の例では、 になります[[14, 27],[15, 22],[12, 25],[17, 21],[20, 65]]
。
思いつきで、各範囲をグラフ ノードに変換し、交差する範囲を接続して、最大の全結合グラフを見つけようとするかもしれません。
また、最初から開始し、交差しない要素にヒットするまで、交差する範囲のリストを構築し続け、それぞれに実行中の交差をチェックすることを繰り返し考えていました。その後、新しいリストを開始します。各項目を既存の交差に対して引き続きチェックします。ただし、これが完全かどうかはわかりません。
何かを実装することに挑戦することもできますが (lang は ruby FWIW)、他の人がこの問題をどのように解決するか、また最も効率的でエレガントな方法は何かを知りたいです。
アップデート:
これは、最大クリーク問題の特定のケースであり、NP 困難であり、したがって実際には困難であると思います。近似/実世界での使用に関する提案をいただければ幸いです。
参照: http://en.wikipedia.org/wiki/Maximum_clique /グラフ内のすべての完全なサブグラフを検索
更新 2
ここで、この問題の NP 困難性と NP 完全性の良い証拠を見つけました: http://www.cs.bris.ac.uk/~popa/ipl.pdf
その時はこれで終わりのようです。ごめんなさい!十分に貪欲な近似で作業します。ありがとう。
回答で述べたように、紙がこの問題を説明しているとは思いません...おそらく、範囲に基づいて詳細な情報がここにあります。