Codelogy

2007年12月16日

ソートアルゴリズム

「一番好きなソートアルゴリズムは何ですか?」
この質問に対する回答により、人間は以下のように分類することができます。

クイックソート
→ 何をおいてもパフォーマンスだろ派
マージソート
→ エレガントなアルゴリズムが好きです派
選択ソート
→ 簡単に書けるのがいいよ派
ボゴソート
→ いくらなんでもひねくれすぎです。

……という冗談はさておき、今回は私が使用しているソート (クイックソートの変種) を紹介します。

1. 一般的なソートアルゴリズムの問題点

例えば、クイックソートが行う比較の回数は、要素数 n に対し O(nlogn) のオーダとなります。(最悪ケースでは O(n2) まで増加しますが、話の本筋とは関係ないので考慮には入れません。)
クイックソートに限らず、広く使用されているアルゴリズムでは、比較時に (必要であれば) 要素値の入れ換えも行います。 従って、要素値のコピー回数のオーダも、比較のそれと同じ O(nlogn) となります。 要素が構造体などデータサイズの大きいものである場合、このコピーにかかる処理コストはかなり大きくなります。

そこで、クイックソートを使いつつ、要素のコピー回数をできるだけ少なくする工夫をしてみました。

>> 続きを読む...

2008年01月03日

素因数の数を数える

素因数分解は、数論の中でも重要かつ難しい問題のひとつとして知られています。 素数で割っていくナイーブな方法から楕円曲線法や数対ふるい法までいくつかのアルゴリズムが考案されていますが、素因数分解そのものではなく、素因数の個数を求めたいだけならば、簡単かつそれなりに高速なアルゴリズムがあります。

>> 続きを読む...

2008年02月07日

平方根を使わないピタゴラス加算

二次元座標上の2点間の距離を求めたいとき、複素数の絶対値を求めたいとき、その他いろいろなときに x = √(a2 + b2) という式を使います(これをpythagorean additionと言うそうです)。これを実装するとき、

sqrt( a*a + b*b )

という文がよく使われますが、この文を無闇に使っていると、あまり嬉しくない事態を引き起こすことになります。

>> 続きを読む...

About アルゴリズム

ブログ「Codelogy」のカテゴリ「アルゴリズム」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはRubyです。

次のカテゴリはコード保守です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。