マージソート,ヒープソート,クイックソートとPythonのsort関数の速さを比べた時に速い順にPythonのsort関数,クイックソート,マージソート,ヒープソートなのは,何故ですか?分からないので教えて下さい.よろしくお願いします.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
Step 1. sort 関数 vs クイックソート,マージソート,ヒープソート
Step 1.1. アルゴリズム
Pythonの sort 関数は、KojiDoi 様が書かれている通り TimSort というアルゴリズムで実装されています。このアルゴリズムは、クイックソート, マージソート, ヒープソート, 挿入ソートを混ぜ込んだものです。
なぜ、混ぜ込むと速くなるのか?ということなのですが、それは各ソートアルゴリズムごとに得意な「データの形式」が異なるからです。出くわした「データの形式」に合わせて、アルゴリズムを切り替えています。どのアルゴリズムが、どの「データの形式」を取り扱うのが、得意かは自分も把握はしていません。
ここで言う「データの形式」と言うのは、例としてはよくないですが、クイックソートは一般にデータに偏りがあると遅くなることが知られています。この例なら大抵の教科書には乗っているので、伝わってくれればと感じています。
以下のページに、どの「データ形式」なら速くなるか書かれているので、良いかなと思いました。
Step 1.2. C 言語実装 と Python 実装
Python の組み込み関数 sort
あるいは組み込み型のメソッド list.sorted
は C 言語で実装されています。自分が過去に試していたコードの範囲で言えば(2, 3 くらいしかないですが)、Python で書かれたコードよりも C 言語で書かれた方が 100 倍くらい速くなりました。
100 と言う数字は計算量、オーダー O
の観点からは微々たるものです。知っておいても悪くないかなと思いました。なぜ C 言語の方が速くなるかは、いま頑張って下の記事に書いています。
Step 2. クイックソート vs マージソート vs ヒープソート
Step 2.1. 正確な話
正確な計算量の評価は アルゴリズムイントロダクション と言う書籍で、厳密に計算量を評価しているので、それを参考にされると良いかなと思いました。自分はやったことないですが。
Step 2.2. 感覚的な話
感覚的な説明で言えば、クイックソートは、ソートに当たって無駄なことをしません。クイックソートは、もしその操作を可視化すれば、二分探索木を作るのと同じことをしています。二分探索木を作る作業は、ソートに向けて一直線に、データを並べているのがわかります。
対して、マージソートやヒープソートは、いくらか無駄な手がはいっている感じがします。無駄ってなんだよって感じですが。ヒープ、ヒープソート, マージソートについては、それぞれ以下の記事で可視化しました。もし雰囲気が伝われば幸いです。
実際にアプリなどを使って、手でソートしてみて、「ヒープソートとマージソートは、クイックソートに比べてなんか面倒だな」って感じられた感覚を掴むことができた、と考えて良いのではないでしょうか。
投稿2020/07/03 02:41
編集2020/07/03 02:48総合スコア830
0
投稿2020/06/30 14:26
総合スコア88024
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。