これらの質問をグーグルとウィキで調べてみましたが、具体的な答えが見つからないようです。私が見つけたもののほとんどは、マスター定理での証明の使用に関連していましたが、より直感的に覚えられる平易な英語の何かを望んでいます. また、私は学校に通っていないため、これらの質問は面接用です。
メモリー:
メモリ使用量の観点からビッグオーを決定するとは、正確にはどういう意味ですか? たとえば、n 項目すべてを格納する必要がある場合に、ヒープソートが O(1) メモリで実行されると見なされるのはなぜですか? ヒープの構造を 1 つしか作成していないためですか? それとも、そのサイズがわかっているため、常に一定のメモリ使用量であるスタック上に作成できるためですか?
速度:
要素の追加が O(1) で行われ、パーコレーションが O(logn) で行われる場合、ヒープの作成はどのように O(n) 時間で行われますか? それは、O(1) で n 個の挿入を行わずに O(n) にし、各挿入後にパーコレートするのが O(logn) であることを意味するのではないでしょうか。したがって、合計で O(n) * O(logn) = O(nlogn) になります。また、ヒープソートのほとんどの実装では、パーコレートしてヒープを作成するのではなく、heapify 関数を使用していることにも気付きました。Heapify は O(nlogn) で n 回の比較を行い、O(1) で n 個の挿入を行うため、O(n) + O(nlogn) = O(nlogn) を取得しますか? 最初のアプローチは、n が小さい場合の 2 番目のアプローチよりも優れたパフォーマンスをもたらすでしょうか?
上記でこれを想定しましたが、O(1)操作をn回実行するとO(n)時間になるというのは本当ですか?それとも n * O(1) = O(1) ですか?