ここで最初に考慮する必要があるのは、ダイレクトスライス列挙アルゴリズムです。 in this SO answer、target - delta < k*log2_5 + j*log2_3 + i < target + delta
ようi
が直接知られているようにj
とk
をピッキングしながら徐々に累積対数を計算し、配列部材の所与の対数値の近傍におけるトリプル(k,j,i)
(ベース2)を列挙する。
は従って近い目標値にk*log2_5 + j*log2_3 + i
と時系列のN 2/3・ワイドスライスを生成N 2/3 -time ALGO(あるので、これらのトリプルを形成します従ってO(N)アモールにN配列部材を製造する製造番号ごとO(1)時間を意味する、Hamming sequenceトリプル )を充填しtetrahedronのクラスト時間およびO(N 2/3)-空間。これはベースラインのDijkstraのアルゴリズムよりも改善されていません 同じ複雑さを持っていても、非償却とより良い定数因子です。
O(1) -spaceにするには、シーケンスに沿って進むにつれてクラストの幅を狭くする必要があります。しかし、地殻が狭ければ狭いほど、トリプルを列挙するときにミスが増えるでしょう - これはあなたがのために頼んだ証です。一定のスライスのサイズは、全体O(N 5/3)償却時間、O(1)ためO(1)スライス当たりO(N 2/3)作業を意味します空間アルゴリズム。Nから -time、N 2/3 -space N から空間、N 5/3:
これらは、このスペクトル上の2つのエンドポイントであります - 時、償却。
ここ対数垂直スケールと、the image from Wikipediaだ:
これは、本質的には、ハミング配列の四面体が(i,j,k)
は側面から見た、(i*log2, j*log3, k*log5)
として空間に延伸トリプルあります。真の3D画像であるならば、画像は少し斜めです。
編集: 私が彼らが -enumerationsをK、jで順不同で製造されているようスライスは、ソートする必要があることを忘れてしまったようです。これはO(N 2/3ログN)時間、O(N 2/3)空間にスライスアルゴリズムによって順序でシーケンスのN番号を生成するための最良の複雑さを変更し、ダイクストラを作りますそこに勝者をアルゴリズム。ただし、O(N 5/3)の上限は、O(1)スライスの場合は変更されません。
http://stackoverflow.com/q/12480291/77567 –
興味深い質問ですが、cs.stackexhange.comで答えが得られる可能性があります。これはおそらく不可能であり、証明が必要です。 –
O(1)のメモリO(N log N)時間アルゴリズムは何ですか?あなたが言及しているPQは〜N ^(2/3)スペースを占めます。 (Dijkstraによる)正しい標準アルゴリズムは、O(N)時間である。 O(1)poopとO(1)insertで適切に実行されるPQを使用すると、あなたがおそらく参照している過剰生成のalgoもO(N)になる可能性があります。 –