スリープソートについて考えてみました。値の時間だけsleepすることで並べ替えるものです。値の絶対位置が決まっているので、そこに置くと、結果的にソートできている、という感じですかね。問題は、大きい値だと、sleep時間が長くなることです。
要は、値x
のとき、sleep(x)
なのですが、x
を直接評価しなくても良いです。x<y
ならばf(x)<f(y)
となるような関数(単調増加関数)であれば良いですね。
例えば、f(x)=log(1+x)
とすれば、x>0
の範囲でf(x)>0
(sleep時間は正でないと困る)で、f(0)=0
, f(10)≈1
, f(100)≈2
となります。sleep(f(x))
のほうが、必要な時間は少ないでしょう。
さらに、f(x)=x/(1+x)
とすれば、0<f(x)<1
なので、最大1秒で完了します。
もちろん、実際にはsleepを大量実行するので、その点は考慮しなくてはなりません。(他のブログを見ると、実装上の問題を論じているケースが多いようです)
元の値から、実際にsleepに渡す値に変換する関数は、理論上は単調増加でありさえすれば良いです。しかし、差が非常に小さいと、時間差が少なく、ソートミス(処理時間差の影響が大きくなる)可能性があります。これを回避するには、f(x)=ax/(b+x)
として、a
, b
の値を上手く設定すれば良さそうですが、ソート対象の値をある程度知る必要があるのでは?(クイックソートでピボットの選択を上手くするようなもの?)と思います。この辺はまた次の機会に考えてみたいと思います。
楽天で検索
【楽天ブックスならいつでも送料無料】数学ガール [ 結城浩 ]
1944円
結城浩 SBクリエイティブ発行年月:2007年06月 ページ数:332p サイズ:単行本 ISBN:9784797341379 第1章 数列とパターン/第2章
楽天ブックス
Supported by 楽天ウェブサービス