トップページ⇒tech
48コメント15KB

コームソート vs ヒープソート

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
コームソートとヒープソートの処理時間を
比較したのですが、データ数が16M(16×1024×1024)
のとき、以下のようになりました。

処理時間 CPU使用率
コームソート(スレッド1つ) 46.35 sec 99.6 %
(スレッド8つ) 17.05 sec 317.8 %
ヒープソート(スレッド1つ) 75.58 sec 99.3 %
(スレッド8つ) 15.55 sec 320.4 %

結果から、スレッドが1つ(データを並列化しない)のとき、
コームソートが、スレッドが8つ(データを8分割し、並列に処理する)
のとき、ヒープソートが高速になりました。
なぜ、このような処理時間になってしまったか、原因を
教えて頂けませんでしょうか?
0002デフォルトの名無しさんNGNG
コームソートって知らない。
コンドームソート?

あとソートアルゴリズムは入力の傾向によっても
性能に違いが出て来るからデータの量だけじゃアレかも。
0003デフォルトの名無しさんNGNG
>>2
Comb Sortで検索してみましょう。
0004どーせバカだよNGNG
シェルソートとどう違うのかよくわからなかった...
00051NGNG
>>2
どうもありがとうございました。
確かにそうですね。データの中身によりますね。
ただ、それだけなんでしょうかねー?
0006デフォルトの名無しさんNGNG
コンドームソーニューと
ナマソーニューはどちらが処理速度が速いでしょうか?
検証してください。
00071NGNG
それも興味ありますねー。
(主旨とは外れますが。。。)
こちらの方もだれか実証してください。
0008デフォルトの名無しさんNGNG
>>6
ハード(セイキ)の硬さや長さ、太さに依存する。
処理速度の臨界値は未調査。
0009デフォルトの名無しさんNGNG
ようするにコンドームソーニューより
ヒープソーニューの方が
並列向きだったということでわ?
最初のばらつき具合でも変わるきがするけど。

最初のデータを色々と変えて試したら
おもしろいかもね。
0010召喚士NGNG
マルチスレッドにすると、遅くなるということは、
シングルスレッドのときはCPUキャッシュが効いて速くなってるということでは?

つまりコームソートは(どんなロジックか知らないけど)、
連続したデータを読み込む傾向が強くて、データがキャッシュに入っている事が多いとか?
0011マージソート信者NGNG
どんな場合でもマージソート使うから関係ない。
0012召喚士NGNG
うんうん。
でも、メモリが少ないときはシェルソートかも。
0013デフォルトの名無しさんNGNG
コムソートは極端にメモリ少ないとき使える
0014デフォりトの名無しさんNGNG
コンドームは極端に精液少ないときでも使ったほうがイイ!
0015デフォルトの名無しさんNGNG
コームソートは書くのも簡単だし、大概シェルソートより速い(自分で実験してみた)のに、アルゴリズム本とか
読んでもなぜか載ってないですね。
ソート姦数とかがない環境でちょっとソートしなくちゃいけないときなんか便利なんですけどね。
0016デフォルトの名無しさんNGNG
なにはともあれ安定なソートが便利なことが多いよ。
そういう意味でとりあえずマージソートって意見は結構わかる。
0017デフォルトの名無しさんNGNG
>>15
日頃どういう文章を書いているのかよくわかる変換だな
0018デフォルトの名無しさんNGNG
あ、あれってコームソートって読むのか。
昆布ソートって読んでいたよ。
0019デフォルトの名無しさん NGNG
で、>>7
の件はどうなったの?
0020デフォルトの名無しさんNGNG
コーム=くし  
0021デフォルトの名無しさんNGNG
安定なソートってマージソートより
インデックス付きクイックソートのが速くない?
0022デフォルトの名無しさんNGNG
>>21
それだと比較回数が最悪2倍にならない?インデックスのメモリも必要だし。
まあ、2倍ぐらいならマージソートより速い場合が多いかな。
0023デフォルトの名無しさんNGNG
メモリ要らない、ベクターじゃなくてリストでも使える、
クイックと違ってクリティカルに遅い状況がない
ってなわけで、コームマンセー野郎です。

もっとも、頭悪いんで、バブルしかアルゴリズムを
理解してないのが原因なのだが。
0024デフォルトの名無しさんNGNG
コーマンとヒップのどちらを基準とするかの命題
0025デフォルトの名無しさんNGNG
こんなん出ましたけど。

ソートアルゴリズムを熱く語ろう♪
ttp://piza.2ch.net/tech/kako/978/978149371.html
0026デフォルトの名無しさんNGNG
>>23
コームソートをリストに適用するのってどうやるの?
0027デフォルトの名無しさんNGNG
>>26
バブルソートならリストに適用できると思う。
問題は、10/13の位置がすぐに特定できないってのだと思う。
だけど、最初の3回以降は、幅が半分以下になるので、
それ以降はソート中にカウンターを用意して次のスタート位置を保存。

これでニュアンスわかるかな…。
0028デフォルトの名無しさんNGNG
>>26
http://www.s34.co.jp/cpptechdoc/article/sort/index.html#4
002926NGNG
>>27-28
ありがとー。
みんな頭いいね
0030デフォルトの名無しさんNGNG
コムソート11
0031デフォルトの名無しさんNGNG
>1
CPUクロックで性能測るってのはイマイチ。
出来れば、プログラム中にステップカウンタをつけて
比較回数等を出し、それを提示して欲しい。
0032デフォルトの名無しさんNGNG
リストのコムソート、思ったより速いですね。
コムソート程度のスピードが出せる他のリスト向け
ソートアルゴリズムって無いですか?
0033デフォルトの名無しさんNGNG
>>32
リストにはマージしかないだろ
0034デフォルトの名無しさんNGNG
Σ(゚д゚lll)ガーン
0035デフォルトの名無しさんNGNG
スレ違いですまないが、コームソートがよくわからん。
挿入ソートを改良してシェルソートができたように、
バブルソートを改良してコームソートができたと思っていいのか?
だとしたら、シェルソートが平均 O(N^1.25) 程度かかるのに、
なんでコームソートが O(N*logN) なんだ?

コームソートの文献情報とかない?(論文でも可。)
なんか、Google で引いても録なのが出てこない。
0036デフォルトの名無しさんNGNG
>>35
以下、昔懐かしいZob-BBSにあった発言のコピペ(関係者いたらごめん)
---------------------------------------------------------------
 コムソートとは...

 このソートアルゴリズムを見たのは、日経バイト1991年11月号です。バイト誌の翻訳
記事。
 あおり文句を引用すると、
・世界で最初に標準的な地位を得たソート・アルゴリズムであるバブル・ソートの欠点
は,実行速度が遅い事である。
・しかし,このアルゴリズムも2〜3行程度プログラムを追加する事で,劇的に速度が
向上する。
・この高速なバブル・ソートならば,コーディングやデバッグが簡単なので,他の高速
なソート・アルゴリズムも太刀打ちできないだろう。
 だそうです。
 実際どんな事をやっているのかというと、バブル・ソートでは隣り合う要素同士の比
較だったのを、ギャップサイズ離れた要素と比較する事によって、浮き上がってくるバ
ブルを高速に移動させてやろうという事です。
 最初のギャップは要素数を1.3で割ったものを使用し、以下、1回のストロークが完了
するたびにギャップを1.3で割ったものを使用します。商が1未満になると、それ以降の
ギャップは1とし、要素の位置がまったく変化しなくなったら終わり。歯の荒いものから
細かいものへと何本もクシを使って髪をとかしていくのに似ている事から、コムソート
と名付けたという事です。
 この1.3という収束率は、色々なリストに対して行ったベンチマークによって得られた
最適な値だそうです。また同様のベンチマークによって、ギャップが9または10になった
時に11に変更するという処理を付け加えることで、さらに処理速度を向上させる事がで
きるようです。この処理を付け加えたコムソートをコムソート11と呼びます。

 以前このソートアルゴリズムを見て、どんなもんだろうな..と思ってた時にk.mitobe
さんが組んでくれたプログラムをアップしておきます。コムソート11のモジュールも入
っているので、さらに詳しく知りたい人はこちらのソースを参照して下さい。
 ちなみに、バブルソートと挿入ソートには(あまりに遅いので)ウェイトが入っていま
せんが、その他のソートにはウェイトが入っています。また、要素の交換が発生する度
にGVRAMへの書き込みが発生するので、ソートアルゴリズムの速度比較にはなりません(
交換と比較の比率によって有利・不利がある)。あくまでもアルゴリズムを視覚的に捉え
るためのものだと思って下さい。
---------------------------------------------------------------
0037デフォルトの名無しさんNGNG
>コーディングやデバッグが簡単なので,他の高速
>なソート・アルゴリズムも太刀打ちできないだろう。
これが意味不明なんだが...
イントロソートが最速。
0038デフォルトの名無しさんNGNG
>>35
参考になるかどうかわからないけど……。

ttp://www.bsdclub.org/~motoyuki/d/d200005c.html#26-1

ただ、この文中の「quick sort よりも高速」ってのはどうなんだろうな。
条件にもよりそうな気がするが。
0039ageNGNG
age
0040デフォルトの名無しさんNGNG
もとの日経バイトの記事が出たとき読んだよ。
quick sortより速いってのは元のByteの記事にはなくて、
日本人のライターが自分で実験して付け加えたんだが、
その実験がムチャクチャ。

整数だけソートできる、インラインで書いたcomb sort
と、qsortを呼び出した結果の時間を比較してた。

qsortより速いというのは眉唾だろ。んでsage。
0041デフォルトの名無しさんNGNG
//クイックソートの最悪パターンを回避
for (i=0;i<NUM;i++) //乱数を埋め込む
data[i]=(data[i]<<16)+ (rand() & 0xffff);
qsort(data,NUM,sizeof(data[0]),comp);
for (i=0;i<NUM;i++) //データを元のビット位置に戻す
data[i]=data[i]>>16;
/*このように、クイックソートを呼び出す前に、データを上にシフトして空いた下位ビットに乱数を埋め込んでおけば、
データに同じ値がたくさん入っているような最悪パターンでもマージソートよりも高速にソートできます。
 ただし、乱数のために数倍メモリを食います。*/
0042デフォルトの名無しさんNGNG
>>41
どっちかっつーと呼び出し側のテクだね。
rand()をiに変えたら安定ソートになりそう。
0043デフォルトの名無しさんNGNG
比較によらないソート=ビンラディソート
0044デフォルトの名無しさんNGNG
バケツソートは使えるよ。
数値の並べ替えなら最強。
工夫すれば文字列にも使える。そしてかなり早い。
0045デフォルトの名無しさんNGNG
シェルソートは?
0046デフォルトの名無しさんNGNG
sirane-yo
0047デフォルトの名無しさんNGNG
揚げ
0048デフォルトの名無しさんNGNG
>>47

駄スレあげんなヴォケ!!
■ このスレッドは過去ログ倉庫に格納されています