最大のものを見つけることの複雑さ


7

以下は、私がそうであると信じるものでこれを行うための私のアルゴリズムです O(n)時間、そしてそれに対する私の証拠。私の教授はそれが実行されることに同意しませんO(n) 代わりにそれが実行されると考えています Ω(n2)時間。証明自体またはスタイルに関するコメント(つまり、私のアイデアは明確かもしれませんが、プレゼンテーションは明確ではありません)。

元の質問:

与えられた n 数、最大を見つける mn そのうちに o(nlogn)。あなたは他に何も想定しないm

私の答え:

  1. 最初に並べ替え m配列の要素。これにはO(1) 時間、これは完全に依存しているため mではなく n
  2. それらをリンクされたリストに格納します(ソートされた順序を維持します)。これもかかりますO(1) 時間と同じ理由で。
  3. 配列内の他のすべての要素について、リンクリストの最小要素より大きいかどうかをテストします。これにはO(n) 時間として n 比較を行う必要があります。
  4. 数値が実際に大きい場合は、リンクされたリストの最初の要素(最小のもの)を削除し、リストを並べ替えられた順序で保持する場所に新しい数値を挿入します。これにはO(1) それは定数(m)上記のリストは拡大しません。
  5. したがって、アルゴリズムの全体的な複雑さは O(n)

リンクされたリストとは対照的に赤黒ツリーを使用すると、定数の点でより効率的であることを知っています(定数の上限が O(mlog2(m)) とは対照的に m (比較を容易にするために)ツリーの最下部の要素へのポインタを保持するという問題は非常に実行可能ですが、そのときは私には起こりませんでした。

私の証拠は何ですか?それを提示するより標準的な方法はありますか?


1
"より良い O(nlogn)「それは大雑把です。 Θ(nlogn)?質問の別の問題は、それが明確ではないことですm固定されています。
ラファエル

@ラファエル、私が持っているものを送ります。彼の意味がわからない。それが本当にであると仮定しますO(nlog2(n)) かどうかに関して m修正されました、私にはわかりません。複雑さを計算するとき、私はそれがそうであると仮定しましたが、その仮定の根拠はありませんでした。
soandos

1
@soandos:それからあなたは教授に尋ねます。あなたも私たちも、半分の質問で作業することは期待できません。ところで、あなたが引用する実際の表現には別の問題があります:すべてのアルゴリズムはO(1)入力サイズを100億に固定すると、
ラファエル

1
@soandos:私はあなたの更新を「引用」に組み込んだ。ルイスとジョーの答えはあなたの問題に十分に対処します(私見)。そしてもちろん、許されざる者はその運動を解決します。
ラファエル

1
@soandosもしあなたが望んでいたものがエクササイズの解決策であったなら(許されて感謝します)、あなたは最初からそれを要求したはずです。代わりに、「私のアルゴリズムですO(n)そして、どうすれば証明を改善できますか?」
Joe

回答:


17

ここにあります O(n) 問題を解くアルゴリズム。

  1. 最悪のケースを使用する O(n) を決定するための選択アルゴリズムnm+1-次数統計。しましょうk この数であり、これは m 私たちが決定しようとしている最大の数。

  2. 次に、ピボットの周りに配列を分割します kQuickSort パーティションの使用関数。このステップはO(n) あまりにも。

  3. 出力 m 最大数:これらは k そして、手順2でパーティションによって生成された上部サブ配列のすべての数値。


1
いいね。1.、2。で選択したアルゴリズムによっては、すでに実行されている場合があります。
ラファエル

5

あなたのアルゴリズムは Θ(n+mn)時間。あなたの教授が何かを探しているのではないかと思いますO(n+nlogm) 時間、おそらくヒープを使用することによって...

教授との不一致の原因は、彼または彼女が考えていないように見えることです m質問の言い方にかかわらず、定数です。そうでない場合は、Θ(m) よりずっと悪い Θ(logm)


赤黒木はその時間はかかりませんか?
soandos 2012

4
この答えはOP に彼の推論でどこが間違っているのを伝えていません。それを明確にできますか?
Juho 2012

質問の更新を参照
soandos

1

正しさ
プレゼンテーションから欠落は正確性を確立するために、ループ不変である:あなたが最大の維持しますmリンクリストでこれまでに検出された要素。したがって、アルゴリズムの終わりまでに、すべての要素をテストたので、最大のm配列の要素。アルゴリズムはまだ正しいですが、説明の冒頭にリンクリストの目的を記載すると、その正確さがより明確になります。

実行時間
log10(10 billion)=10、(ベース2の場合は約33です)は、1,000万よりはるかに小さいです。与えられた例では、m 何倍も大きい logn、したがって、あなたが安全にそれを想定することはできないと思います m 一定です。

あなたはあるアルゴリズムを提供する必要があります o(nlogn) 限り m=o(n)。リンクリストと線形検索をバランスのとれたバイナリ検索ツリーまたは最小ヒープに置き換えると、この実行時間を実現できます。O(mlogm+nlogm)=O(nlogm)=o(nlogn)。(仮定m=o(n)、それ以外の場合、ランタイムは Θ(nlogn)

表記に慣れていない場合、直感の背後にある o(nlogn) です <O(nlogn)、ただし表記の詳細については、cs.SE対応する質問を参照してください。


質問の更新を参照
soandos

あなたの答えは尋ねられたものに最も近い答えのようですが、私はあなたが単にと言うことができると思います メートル=/2 OPのアルゴリズムにより、 Θ2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.