デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  268  : 記事  0  : コメント  4387  : トラックバック  79

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

最初に謝っておきます。本当なら数種類のソートを組んでいろいろなデータを使って実験すべきです。でも僕の力量ではそこまでできませんでした。

 

mixiの僕の日記を読んだ人なら分かると思うけど、僕は飲み屋で酔っ払いに絡まれやすい。

今を去ること1ヶ月ほど前。新宿で飲んでいたら酔っ払いに絡まれた。奇しくもわんくま勉強会の3次会でのこと。
その酔っ払いさんを仮にRさん。僕をCとするとその会話はこんな感じ。
R:「あのさぁ、あんどちんソートはどうやって選ぶんだ?」
C:「(何故僕指名?)データとか環境で決まるんじゃない?データの量が少なければバブルソートでいいし」
R:「そうじゃなくて、データの来る順番も量も不定の場合、それこそ何百万とかくるかもしれない場合」
C:「うぅん。クイックソートかヒープソートじゃないかなぁ」
R:「それだと組み込みの場合スタックを消費するだろ?」
C:「組み込みでそんな膨大なデータを扱う場合って、僕は経験ないし。組み込みでそんなデータを扱う場合は外部記憶装置に最適化された形でデータが保存されている場合がほとんどだと思うけど。カーナビの住所録とかなんて多分そうじゃないのかな?」
R:「動的に最適なソートを選択するアルゴリズムは無いのか?」
C:「分からないけど、アルゴリズムを選択するためにはデータを舐めなきゃならないだろうから、それ位なら妥当なアルゴリズムでソートするんじゃないかな?それからそういうのは組み込み屋よりDB屋の方が良く知ってるんじゃない?」
R:「DBはエンジン任せだろ?」
C:「だから、DBのエンジン作ってる人。」
R:「組み込みは速度に厳しいから(お前に)聞いてるんだ!」
C:「そう言われても…」

掻い摘んで書くとこんな感じで絡まれたわけですが(すいません。脚色してます)。
言われたような多量のデータまでを想定すると、クイックソートやヒープソートが良いかなぁと思いつつもデータの並びによっては指摘されたとおりスタックの消費量が心配ですね。再帰を使わない方法もありますが。
想定されるデータの形も量も不明確でソートを最適化となると確かに動的に最適なアルゴリズムを選択する必要はありそうです。

1つのデータのサイズが大きい場合は参照テーブル作ってテーブルだけバブルソートでソ ートした方がデータそのものを移動するクイックソートより早い場合もあるでしょう(さいきんエピさんとこでそんな話題があったような)。

更にデータの入り方ってのも影響するわけで、1件1件入ってくるようなものの場合(携帯の住所録とか。最初はまとめて入れるだろうけどその後は新規のデータを1件づつ入れる場合が多いでしょう)2分木で管理したほうが良い場合もあるし。

本来であれば色々書いてみて結果発表すべきですが、今月の勉強会の前には載せたかった話題なので、不完全ですが今日書いておきます。

出来れば色々やって考察を書きたいところですが、1ヶ月ほど考えても結局僕には最適解が答えられないので誰か答えてくれると嬉しいなぁ。

投稿日時 : 2008年2月20日 0:46

コメント

# re: ソートをソート ~酒は飲んでも飲まれるな~ 2008/02/20 5:16 ゆーち
不定量データでソートが必要であれば、間違いなく参照型でツリーを構築しておくべきでしょうね。

複数のソート条件がある時は、その条件の分だけツリーを構築しておくのが吉です。(それ以外はありえねぇという気さえします。)
ツリーは2分木でもいいけど、構造によっては B-Tree とかそんなの選ぶべきケースもあるでしょうね。

最近は、お酒のんでても仕事できるようになってきました。(爆謎


# re: ソートをソート ~酒は飲んでも飲まれるな~ 2008/02/20 10:38 れい
はじめまして、かな?

データ量が不定といっても本当に不定なことはないですよね。
上限下限を必ず見積もります。
本当にデータ量が「任意の自然数」であるならプログラムは組めません。

私の経験では
ヒープソート、
マージソート、
シェル/挿入ソート、
が比較的使いやすいと思います。
クイックソートは実行時間が不定なので用途がありません。

クイックもヒープも、展開すればそれほどスタックを消費しません。
どんな環境なのかに激しく依存しますが、
展開してもスタックが足りないくらいデータ量が多いという状況は
あまり考えられません。

> 動的に最適なソートを選択するアルゴリズムは無いのか?

真に最適なものを選択することは理論上不可能です。
「比較的適しているものを選ぶ」なら可能で、
それは腕の見せ所だと思います。
データ入力時に動的に選ぶのはなかなか難しいです。

# re: ソートをソート ~酒は飲んでも飲まれるな~ 2008/02/20 11:01 R・田中一郎
悪い酒だなぁ。

# re: ソートをソート ~酒は飲んでも飲まれるな~ 2008/02/20 22:47 スーパーあんどちん
>> ゆーちさん
ツリーにした場合の問題は配列的にアクセス出来ないって事もあると思うんですよね。故にソートにこだわったのかと。真意は酔っているときに聞いてみないとわかりませんが。

>> れいさん
はじめまして、ですかね?
仰ることには同意しますし、概ね同じ様なことを僕も説明したのですが聞き入れてもらえませんでした。
おそらく現存するコンピュータを度外視した話です。
アルゴリズム選択ですが、データ数にしきい値を持って選ぶのも1つ案としてあるかなと。



# re: ソートをソート ~酒は飲んでも飲まれるな~ 2008/02/20 22:51 スーパーあんどちん
>> Rさん
ですね。


# 【20080920東京勉強会#24】準備エントリ 2008/08/12 16:05 はつね
【20080920東京勉強会#24】準備エントリ

# 【20080920東京勉強会#24】準備エントリ 2008/08/14 16:15 DHJJ [Hatsune's Journal Japan] blog
【20080920東京勉強会#24】準備エントリ

Post Feedback

タイトル
名前
Url:
コメント: