Standing on the Shoulder of Linus

Home / 2011 / 5月 / 23 / スリープソートに渡す値を工夫する

スリープソートに渡す値を工夫する

スリープソートについて考えてみました。値の時間だけ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 楽天ウェブサービス

関連

Posted in math | Tagged プログラム, 単調増加
← ブログをfacebook対応にするためにfunctions.phpに記述するコード 第1回 ラジカルワークショップ参加しました →

アーカイブ

人気の投稿とページ

  • キンドル本を印刷する(PDFに変換する)方法
  • 名古屋駅から国際センターまでの道のり(徒歩)
  • AGPL ライセンス(GPLとは似ているが違いもある)
  • 問い合わせフォーム改善: 選択肢により条件分岐し、項目の表示非表示を変更する
  • JP-Secure SiteGuard WP Pluginは不正ログイン防止に役立つか

プロフィール

水野史土:月70万PVホームページ制作会社のレスキューワーク株式会社で、PHPソフトウェアのサポートを行っている。concrete5コミュニティリーダー、Novius OSコアコード貢献者でもある。 詳しくは管理者詳細参照。
大好評WordPress書籍「WordPressユーザーのためのPHP入門 はじめから、ていねいに。」サポートページ

Copyright © 2015 Standing on the Shoulder of Linus.