2011-05-19
常識を覆すソートアルゴリズム!その名も"sleep sort"!
TwitterのTLで知ったのだが、少し前に海外の掲示板で"sleep sort"というソートアルゴリズムが発明され、公開されたようだ。このアルゴリズムが面白かったので紹介してみる。
Genius sorting algorithm: Sleep sort
1 Name: Anonymous : 2011-01-20 12:22
諸君!オレは天才かもしれない。このソートアルゴリズムをみてくれ。こいつをどう思う?
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
example usage:
./sleepsort.bash 5 3 6 3 6 3 1 4 7
2 Name: Anonymous : 2011-01-20 12:27
>>1
なん…だと…。こいつ、動くぞ!
っておい!0..218382のリストのソートに218382秒も待たされるのかよ!
3 Name: Anonymous : 2011-01-20 12:31
>>2
まあ、最悪のケースだとそうなるな。
4 Name: Anonymous : 2011-01-20 12:45
これの計算量はどんなもんだろう?
5 Name: Anonymous : 2011-01-20 12:56
#!/bin/bash
function f() {
sleep $(echo "$1 / 10" |bc -l)
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
最適化に成功したぞ!
ただしsleepが浮動小数点数を受け付けるシステムじゃないと動かないので注意な。
6 Name: Anonymous : 2011-01-20 13:10
>>4
そうだな…正直よくわからんが、O(入力値の中の最大値)なんじゃないか。
7 Name: Anonymous : 2011-01-20 14:16
O(入力値の中の最大値 + n)じゃないかな。スレッドの生成に比例した時間が余計に掛かるだろ。
しかしこれはすばらしい。
...
これは面白い!まさかsleepを利用してソートができるとは!実行してみると確かに値がソートされていることがわかる。スレッドはこのあともしばらく続き、C#・Erlang・Lisp・C・Perlなどの言語でも実装されたようだ。
せっかくなので私もPerlで実装してみた。上記掲示板でのオリジナル実装とは異なり、サブルーチンとして独立させているので汎用的に使える。
#!perl use strict; use warnings; use Time::HiRes qw(sleep); use IO::Select; use Data::Dumper; sub sleep_sort { my @input = @_; my @output; my $watcher = IO::Select->new(); my @children; foreach my $value(@input) { my $pid = open my $io, '-|'; defined($pid) or die $!; if($pid == 0) { sleep $value / 10; print $value; exit; } else { $watcher->add($io); push @children, $pid; } } while($watcher->count > 0) { foreach my $io( $watcher->can_read(0) ) { $watcher->remove($io); push @output, <$io>; close $io; } } waitpid $_, 0 for @children; return @output; } print Dumper([ sleep_sort @ARGV ]); __END__ $ perl sleep-sort.pl 1 3 5 2 4 $VAR1 = [ '1', '2', '3', '4', '5' ];
スレッドやファイバを使っても実装できるだろうが、今回はopen()によるforkとIO::Selectを使ってみた。
トラックバック - http://d.hatena.ne.jp/gfx/20110519/1305810786
- サイログ。MiyakoとかRubyとかなんとか+Miyako ACCESS MAP - [Rub...
- ひよこ3分07秒のノート - 話題のソートアルゴリズム「sleep sort」...
- mizchi log - Pythonでスリープソート書いてたら multiprocessing ...
- kazuhoのメモ置き場 - Re [http://d.hatena.ne.jp/gfx/20110519/130...
- SND-L/KSND - [.NETプログラミング]
- Penguin note. - スリープ
- Sleep sort in Go
- おし、プログラミング - Boost C++でSleep sort
- ほくそ笑む - Java で sleep sort (および Java のマルチスレッドの...
- 岡山県北でがんばるフリーエンジニアのメモ - 常識を覆す”sleep sor...
- 4chan発のソートアルゴリズム”Sleep sort”をCommon Lispで
- Ehrenの日記 - sleep sortが面白い
- yasuhoの隠れ家 - sleep sort - Javaで実装してみた(笑)
- http://www.donzoko.net/cgi-bin/tdiary/20110520.html#p02
- 第2.5地区 - sleep sortってオモロイね
- Bug Catharsis - F#でsleep sort
- Life is very short - elispで 「sleep sort」を実装してみた
- どせいたんさき 2号。 - 比較しないソートアルゴリズム ― sleep s...
- OpenGL sort
- Maeの(Mae向きな)日記 - sleep sort
- How to disappear completely - ちょっと乗り遅れな気がするけどSle...
- 社長じゃないよ - Pythonでスリープソートっぽいことをやる。
- 日々の御伽噺 - ざっくりSleepsortをPythonで書いてみようとしたら...
- このブログは証明できない。 - 天才的ソートアルゴリズム”sleep sor...
- このブログは証明できない。 - 天才的ソートアルゴリズム”sleep sor...
- 99円のへたれ学習帳 - [書いてみた]sleep sort
- 念願のPGになってみた。むずい。 - sleep sort ....?
- スリープソートの評価関数
- メモだらけ - SleepSort
- Change the worlds - sleep sortをRubyで実装してみた。
- 斬新なソートアルゴリズム : Sleep Sort を Java で実装してみた
- kissrobberの日記 - クラウド時代の新しいソートアルゴリズムTask Q...
- みちしるべ - GroovyでSleep Sortを実装する
- hp12c - sleep sortに対抗してrunning sortだ!(失敗に終わる編)
- マクロツイーター - 画期的なソートアルゴリズム: TeXsort
- 果報は寝て待て―RubyでSleep sort
- 蟲!虫!蟲! - [Python]SleepSort、BogoSortに続く画期的なソート...
- hp12c - 新ソートアルゴリズム「配列挿入ソート」だ!
リンク元
- 4849 http://b.hatena.ne.jp/
- 4590 http://twitter.com/
- 2141 http://b.hatena.ne.jp/hotentry
- 1794 http://www.i-mezzo.net/news/
- 1780 http://www.ig.gmodules.com/gadgets/ifr?exp_rpc_js=1&exp_track_js=1&url=http://www.hatena.ne.jp/tools/gadget/bookmark/bookmark_gadget.xml&container=ig&view=default&lang=ja&country=JP&sanitize=0&v=2730be8ce031040b&parent=http://www.googl
- 1239 http://b.hatena.ne.jp/hotentry/it
- 1226 http://reader.livedoor.com/reader/
- 967 http://www.yuyak.com/1339
- 941 http://www.google.co.jp/url?sa=t&rct=j&q=ソート アルゴリズム 最新&source=web&cd=1&sqi=2&ved=0CB4QFjAA&url=http://d.hatena.ne.jp/gfx/20110519/130581078
- 832 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CCEQFjAA&url=http://d.hatena.ne.jp/gfx/20110519/1305810786&rct=j&q=sleep sort&ei=Ah_VTeaQA4SsugOdzKGTDA&usg=AFQjCNFaKBQao1LChtf450-klmWWDfxi1Q&sig2=7z7nHHODFHoJlr0iUnJZzA


