Can we find the mode of an array in O(n)
time without using Additional O(n)
space, nor Hash. Moreover the data is not sorted?
3 に答える
問題は要素の区別の問題1よりも簡単ではありません-したがって、基本的に追加のスペースがない場合-問題の複雑さはTheta(nlogn)
せいぜいです(そしてそれはで行うことができるのでTheta(nlogn)
-それは事実です)。
つまり、基本的に、ハッシュテーブルに余分なスペースを使用できない場合は、並べ替えと反復を行うのが最適です。これはTheta(nlogn)
です。
(1)この問題を実行するアルゴリズムAが与えられた場合、Aを実行しO(f(n))
て、結果の要素が追加の反復で複数回繰り返されることを確認して、の要素の識別性の問題を解決できることを簡単に確認できますO(f(n) + n)
。
適切な状況下では、そうです。たとえば、データが基数ソートに適している場合は、線形時間で一定の余分なスペースのみを使用してソートし、その後、ソートされたデータを線形スキャンしてモードを見つけることができます。
データに比較ベースの並べ替えが必要な場合は、O(N log N)が一般的な場合とほぼ同じであると確信しています。
頻度を数えるだけです。これは空間ではなくO(n)
、空間でありO(k)
、k は範囲内の個別の値の数です。これは実際には一定のスペースです。
時間は明らかに線形 O(n)
//init
counts = array[k]
for i = 0 to k
counts[i] = 0
maxCnt = 0
maxVal = vals[0]
for val in vals
counts[val]++
if (counts[val] > maxCnt)
maxCnt = counts[val]
maxVal = val
ここでの主な問題は、k が定数である可能性がある一方で、非常に巨大になる可能性があることです。ただし、k が小さい場合もあります。とにかく、これは実用的ではありませんが、あなたの質問に適切に答えます。