n 要素のマルチセット A (ソートされていない) が与えられた場合、A に多数要素 (つまり、A に n/2 回以上出現する要素) が含まれているかどうかを判断するための O(n) 時間アルゴリズムが必要であるとします。これを O(n) 時間で簡単に解決するには、線形時間選択アルゴリズムを使用して中央値 (x と呼びます) を見つけ、A で x が何回発生するかを数え、カウントが n/2 を超える場合は過半数として返します。 (それ以外の場合、答えは「過半数はありません」です)。ここで、問題の次の一般化を考えてみましょう: A と整数 k < n が与えられた場合、A に n/k 回以上出現する値が含まれているかどうかを判断するアルゴリズムが必要です (そのような値が多数存在する場合、それで十分です)。それらの1つを見つけるために)。これを行うアルゴリズムを設計し、その複雑さを n と k の関数として分析します。この質問に対するあなたの評価は、あなたのアルゴリズムがどれだけ速いかによって決まります (もちろん、それも正しい必要があります)。O(kn) 時間のアルゴリズムには 10 ポイントの部分的な評価点が与えられ、O(n log k) 時間のアルゴリズムには完全な評価点が与えられます。
今、私は問題に対して2つの解決策を考え出しましたが、どちらもO(n log k)の要件を完全には満たしていません。すぐに、O(n log n)アルゴリズムを使用して配列をソートできることがわかりました。次に、要素がn / k回以上線形に繰り返されるかどうかを確認しますが、それはO(n log n)であり、O(n log k)ではありません
また、入力と同じデータ型の配列と k の長さの int を作成することによって行われる O(nk) メソッドを見つけて、ある程度理解しました。次に、各要素を空の要素に入れ、そのカウンターをインクリメントするか、その中の 1 つの要素と一致する場合は、k + 1 番目の一意の要素に到達するまでカウンターをインクリメントし、その時点で 0 に達するまですべてのカウンターを 1 減らします。空と見なされ、新しい要素をその中に配置できます。入力配列の最後まで続きます。次に、完了後に残ったすべての要素をチェックして、それらが n/k 回以上発生するかどうかを確認します。ただし、これには n 個の元の要素を k 個の新しい配列要素すべてに対してチェックする必要があるため、O(nk) になります。O(n log k) でこの問題を解決する方法に関するヒントはありますか? O(nk) アルゴリズムは、彼が私たちに考えさせたい方法に沿っていると思いますが、私は'