2 つの区間で十分であることの証明:別の区間に適切に含まれる区間を選択しても意味がありません。一般性を失うことなく、区間を [a1, b1], ..., [an, bn] とし、a1 < ... < an とします。別の間隔を適切に含む間隔がない場合、b1 < ... < bn. i < j < k の場合、([ai, bi] 交差 [aj, bj] 交差 [ak, bk]) = ([ai, bi] 交差 [ak, bk]) が成立し、結合についても同じであるため、 3 つ以上の間隔を選択する理由はありません。
O(n log n)-time アルゴリズム:再定式化された問題は、(d - a) * (b - c) を最大化する間隔 [a, b] および [c, d] を見つけることです。交差しないでください。私たちのアルゴリズムは O(n log n) の前処理を行うことで、O(log n) 時間で各間隔の最良の仲間を見つけることができます。
[a, b] のベストメイトを探してみましょう。いくつかの代数を実行します: (d - a) * (b - c) = d*b - d*c - a*b + a*c. a、b は固定されているため、-a*b 項を削除して、すべての区間 [c, d] で内積 <(a, b, 1), (d, c, -d*c)> を最大化できます。ベクトルのセット (d, c, -d*c) は固定されているため、これは基本的に、静止多面体と (a, b, 1) に垂直な移動平面の衝突をシミュレートしています。Edelsbrunner と Maurer ( 3 次元で極値を見つけ、平面で郵便局の問題を解決する、1984 年) のおかげで、時間 O(n log n) で前処理し、このタイプのクエリを異なる a と b について解決するアルゴリズムがあります。 O(log n) 時間で。
残念なことに、少なくとも 2 つの間隔を選択する必要がありますが、最良の "解決策" は、それ自体で最も長い間隔である可能性があります。面倒ですが、Edelsbrunner (マウラー) を拡張して、同じ実行時間で 2 番目に極端な点を見つけることは可能であると確信しています。