Skiena による本「The Algorithm Design Manual」では、セットのモード(最も頻繁な要素) を計算すると、Ω( n log n ) 下限があると言われています (これは私を困惑させます) だけでなく (正しく推測します)モードを計算するための、より高速な最悪ケースのアルゴリズムは存在しません。下限が Ω( n log n ) であることだけに困惑しています。
Google ブックスで本のページを見る
しかし、確かに、これは場合によっては線形時間 (最良の場合) で計算される可能性があります。たとえば、以下のような Java コード (文字列内で最も頻繁に使用される文字を見つける) によって計算されます。「トリック」は、ハッシュテーブルを使用して出現回数をカウントすることです。これは明らかなようです。
では、問題の理解に欠けているものは何ですか?
編集: (ミステリーが解決されました) StriplingWarrior が指摘するように、比較のみが使用される場合、つまりメモリのインデックス作成がない場合、下限が保持されます。
// Linear time
char computeMode(String input) {
// initialize currentMode to first char
char[] chars = input.toCharArray();
char currentMode = chars[0];
int currentModeCount = 0;
HashMap<Character, Integer> counts = new HashMap<Character, Integer>();
for(char character : chars) {
int count = putget(counts, character); // occurences so far
// test whether character should be the new currentMode
if(count > currentModeCount) {
currentMode = character;
currentModeCount = count; // also save the count
}
}
return currentMode;
}
// Constant time
int putget(HashMap<Character, Integer> map, char character) {
if(!map.containsKey(character)) {
// if character not seen before, initialize to zero
map.put(character, 0);
}
// increment
int newValue = map.get(character) + 1;
map.put(character, newValue);
return newValue;
}