6

免責事項:定数メモリの要件では何も見つかりませんでした。O(N)速度とO(1)メモリのハミング番号

ハミング番号は数字2^i*3^j*5^kです。ここで、i、j、kは自然数です。

O(N)時間とO(1)(定数)メモリでN番目のハミング番号を生成する可能性はありますか?生成中は、ジェネレータを正確に意味します。つまり、結果だけを出力し、前に生成された数値を読み取ることはできません(この場合、メモリは一定ではありません)。しかし、それらのいくつかの定数を保存することができます。

定数メモリを持つ最良のアルゴリズムだけが、優先度キューに基づいてO(N log N)よりも優れているとは限りません。しかし、O(N)時間にアルゴリズムを構築することは不可能であるという数学的証明はありますか?

+0

http://stackoverflow.com/q/12480291/77567 –

+0

興味深い質問ですが、cs.stackexhange.comで答えが得られる可能性があります。これはおそらく不可能であり、証明が必要です。 –

+0

O(1)のメモリO(N log N)時間アルゴリズムは何ですか?あなたが言及しているPQは〜N ^(2/3)スペースを占めます。 (Dijkstraによる)正しい標準アルゴリズムは、O(N)時間である。 O(1)poopとO(1)insertで適切に実行されるPQを使用すると、あなたがおそらく参照している過剰生成のalgoもO(N)になる可能性があります。 –

答えて

4

ここで最初に考慮する必要があるのは、ダイレクトスライス列挙アルゴリズムです。 in this SO answertarget - delta < k*log2_5 + j*log2_3 + i < target + deltaようiが直接知られているようにjkをピッキングしながら徐々に累積対数を計算し、配列部材の所与の対数値の近傍におけるトリプル(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だ:

enter image description here

これは、本質的には、ハミング配列の四面体が(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)スライスの場合は変更されません。

関連する問題