古典的バイナリサーチアルゴリズムにバグ ― 2006年06月05日 09時49分36秒
ASAHIネット(http://www.asahi-net.or.jp)のjouwa/salonからホットコーナー(http://www.asahi-net.or.jp/~ki4s-nkmr/ )に転載したものから。
---
bajaさんから。
--- ここから ---
こんにちは、bajaといいます。
ちょっと面白い記事を見かけましたのでお知らせします。
古典的Binary Searchのアルゴリズムにバグがあったという話がGoogleReserch
の記事に載っていました。
実際SunのJDKのインプリも間違っていて修正されているようです。
今はプログラムの仕事はしていないので勘違いがあるかもしれませんが、サー
チをする対象の配列の数が2の30乗(10億)を超えてしまうとうまく動かない、
ということでしょうか?
それにしてもずいぶん長い間見つからなかったものですね。
--- ここまで ---
その記事は、
http://googleresearch.blogspot.com/
GoogleResearchのブログ
にある、
Extra, Extra - Read All About It: Nearly All Binary Searches and
Mergesorts are Broken
です。
バグは、バイナリサーチの分割点のピボットを計算するところ
int mid =(low + high) / 2;
で、low + highがオーバーフローするってことです。
普通これは問題にならないんです。いまのほとんどのマシンは、intが32bit
だから、このアルゴリズムで、2 ^ 31 - 1というintの最大値を超えるような
ことはないから。
でも、著者Joshua Blochが遭遇したのは、最大値を超えた現象だったんです
ね。
Joshua Blochさんって聞いたことあるなあと思ったら、Effective Javaの著
者ですね。Sunにいたはずなのに、Googleに移ってたんですね。調べたら、
2004年ですね。
http://www.theserverside.com/news/thread.tss?thread_id=27163
Joshua Bloch leaves Sun and joins Google
なお、「Effective Java」は、Javaプログラマ必読です。参考になることは
多かったです。Effectiveシリーズはほかもなかなかよくて、ぼくは、
「Effective C++」「More Effective C++」も勉強になりました。
http://www.amazon.co.jp/exec/obidos/ASIN/4894714361/showshotcorne-22/ref=nosim
ジョシュア・ブロック著、 柴田芳樹訳「Effective Java プログラミング言語
ガイド」
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/showshotcorne-22/ref=nosim
Scott Meyers著、吉川邦夫訳「Effective C++ 【改訂第2版】」
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/showshotcorne-22/ref=nosim
Scott Meyers著、安村通晃、飯田朱美、伊賀聡一郎訳「More Effective C++―
最新35のプログラミング技法」
Googleは面白いこと、サイエンスをやってるから、いい人材がどんどん集ま
ってますね。ぼくが知ってるだけでも、Unix屋のRob Pike、Lisp屋のPeter
Norvigとかね。
Microsoftは元々研究やサイエンスはやってなくて、その後Microsoft
Researchを作ったけど、やっぱ、Microsoftにお世話になりたくない人は、
Googleなんでしょう。
Microsoftはどうしても商売ばっかり、それも独禁法違反のヤクザ会社のイ
メージがあるし(いま必死でテレビCMを流していいイメージを作ろうとしてい
ます)。Googleは大学の研究室の延長みたいな感じがしますからね。
そんなGoogleのやり方を、単にベスト&ブライテスト戦略だといってしまう
と底が浅いかなと。「Web進化論」はそんな臭いがぷんぷんします。^-^;
http://www.amazon.co.jp/exec/obidos/ASIN/4480062858/showshotcorne-22/ref=nosim
梅田望夫著「ウェブ進化論 本当の大変化はこれから始まる」
Peter NorvigのAIプログラミングの本には、SICPなどにあるバグの話が出て
ます。これも今回のと似た話で、みんな長い間そのまま使ってきたアルゴリズ
ムで、Norvigさんが指摘したそうです。また時間ができたら、書きますね。
この記事に出ている「Programming Pearls」の初版は、以前、「プログラム
設計の着想」として翻訳が出ていました。いまは、
http://www.amazon.co.jp/exec/obidos/ASIN/4894712369/showshotcorne-22/ref=nosim
ジョンベントリー著、小林健一郎訳「珠玉のプログラミング―本質を見抜いた
アルゴリズムとデータ構造」
です。
この本は、ソフトウェアをやる以上、必読書です。問題の捉え方、発想がい
かに大事か痛感させられます。幾何学で補助線一本うまく引くだけで問題が簡
単になるように、問題をどう捉えるか、その発想ひとつで、アホみたいに簡単
に解けることがあることを気づかせてくれます。
この記事にあるように、merge sortもだめだろうというんだから、ピボット
を同じ手法で選んでいるquick sortなど、分割統治型のものは、たぶん、全部、
だめね(もちろんピボットの選び方はいろいろあるから、影響ないものもある
だろう)。
それにしてもGoogle的世界では、2^30 の要素数が当たり前になってきてる
のね。すると、こういう何十年も見つからないバグが出ちゃうんですね。
バイオインフォマティクスも超大量のデータを扱うので、気をつけよう。
ついでといってはなんですが、先の記事の下にある
Statistical machine translation live
も面白い話で、この統計的機械翻訳という手法は、いままでの翻訳アルゴリズ
ムよりかなりいい訳が出るというので注目されています。
いま出ている日経サイエンス2006年7月号には、「ここまできた機械翻訳」
という記事があり、この手法の解説が載ってます。もちろん、「Statistical
machine translation live」を書いたFranz Ochの名前も出てます。というか、
彼がこの手法の開拓者です。
この前、コンピュータ将棋でBonanzaというメモリとプロセッサパワーさえあ
れば、比較的単純な手法でやるプログラムが優勝しましたが、統計的機械翻訳
の手法も似てます。
例が多ければだんだんよくなるという、大数の法則というか、中心極限定理
というか。\(^O^)/
だんだん、人間がやることなくなってくるよなあ。
http://www.amazon.co.jp/exec/obidos/ASIN/415011501X/showshotcorne-22/ref=nosim
カート・ヴォネガット・ジュニア著、浅倉久志訳「プレイヤー・ピアノ」(ハ
ヤカワ文庫SF)
をまた買ってきて読んでみようかな。
ほかに、この号には、「トポロジカル量子コンピューター」の記事もあって、
これはまた奇想天外な面白い話。意外なことに?、Microsoftがこの研究に力
を入れています。
---
bajaさんから。
--- ここから ---
こんにちは、bajaといいます。
ちょっと面白い記事を見かけましたのでお知らせします。
古典的Binary Searchのアルゴリズムにバグがあったという話がGoogleReserch
の記事に載っていました。
実際SunのJDKのインプリも間違っていて修正されているようです。
今はプログラムの仕事はしていないので勘違いがあるかもしれませんが、サー
チをする対象の配列の数が2の30乗(10億)を超えてしまうとうまく動かない、
ということでしょうか?
それにしてもずいぶん長い間見つからなかったものですね。
--- ここまで ---
その記事は、
http://googleresearch.blogspot.com/
GoogleResearchのブログ
にある、
Extra, Extra - Read All About It: Nearly All Binary Searches and
Mergesorts are Broken
です。
バグは、バイナリサーチの分割点のピボットを計算するところ
int mid =(low + high) / 2;
で、low + highがオーバーフローするってことです。
普通これは問題にならないんです。いまのほとんどのマシンは、intが32bit
だから、このアルゴリズムで、2 ^ 31 - 1というintの最大値を超えるような
ことはないから。
でも、著者Joshua Blochが遭遇したのは、最大値を超えた現象だったんです
ね。
Joshua Blochさんって聞いたことあるなあと思ったら、Effective Javaの著
者ですね。Sunにいたはずなのに、Googleに移ってたんですね。調べたら、
2004年ですね。
http://www.theserverside.com/news/thread.tss?thread_id=27163
Joshua Bloch leaves Sun and joins Google
なお、「Effective Java」は、Javaプログラマ必読です。参考になることは
多かったです。Effectiveシリーズはほかもなかなかよくて、ぼくは、
「Effective C++」「More Effective C++」も勉強になりました。
http://www.amazon.co.jp/exec/obidos/ASIN/4894714361/showshotcorne-22/ref=nosim
ジョシュア・ブロック著、 柴田芳樹訳「Effective Java プログラミング言語
ガイド」
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/showshotcorne-22/ref=nosim
Scott Meyers著、吉川邦夫訳「Effective C++ 【改訂第2版】」
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/showshotcorne-22/ref=nosim
Scott Meyers著、安村通晃、飯田朱美、伊賀聡一郎訳「More Effective C++―
最新35のプログラミング技法」
Googleは面白いこと、サイエンスをやってるから、いい人材がどんどん集ま
ってますね。ぼくが知ってるだけでも、Unix屋のRob Pike、Lisp屋のPeter
Norvigとかね。
Microsoftは元々研究やサイエンスはやってなくて、その後Microsoft
Researchを作ったけど、やっぱ、Microsoftにお世話になりたくない人は、
Googleなんでしょう。
Microsoftはどうしても商売ばっかり、それも独禁法違反のヤクザ会社のイ
メージがあるし(いま必死でテレビCMを流していいイメージを作ろうとしてい
ます)。Googleは大学の研究室の延長みたいな感じがしますからね。
そんなGoogleのやり方を、単にベスト&ブライテスト戦略だといってしまう
と底が浅いかなと。「Web進化論」はそんな臭いがぷんぷんします。^-^;
http://www.amazon.co.jp/exec/obidos/ASIN/4480062858/showshotcorne-22/ref=nosim
梅田望夫著「ウェブ進化論 本当の大変化はこれから始まる」
Peter NorvigのAIプログラミングの本には、SICPなどにあるバグの話が出て
ます。これも今回のと似た話で、みんな長い間そのまま使ってきたアルゴリズ
ムで、Norvigさんが指摘したそうです。また時間ができたら、書きますね。
この記事に出ている「Programming Pearls」の初版は、以前、「プログラム
設計の着想」として翻訳が出ていました。いまは、
http://www.amazon.co.jp/exec/obidos/ASIN/4894712369/showshotcorne-22/ref=nosim
ジョンベントリー著、小林健一郎訳「珠玉のプログラミング―本質を見抜いた
アルゴリズムとデータ構造」
です。
この本は、ソフトウェアをやる以上、必読書です。問題の捉え方、発想がい
かに大事か痛感させられます。幾何学で補助線一本うまく引くだけで問題が簡
単になるように、問題をどう捉えるか、その発想ひとつで、アホみたいに簡単
に解けることがあることを気づかせてくれます。
この記事にあるように、merge sortもだめだろうというんだから、ピボット
を同じ手法で選んでいるquick sortなど、分割統治型のものは、たぶん、全部、
だめね(もちろんピボットの選び方はいろいろあるから、影響ないものもある
だろう)。
それにしてもGoogle的世界では、2^30 の要素数が当たり前になってきてる
のね。すると、こういう何十年も見つからないバグが出ちゃうんですね。
バイオインフォマティクスも超大量のデータを扱うので、気をつけよう。
ついでといってはなんですが、先の記事の下にある
Statistical machine translation live
も面白い話で、この統計的機械翻訳という手法は、いままでの翻訳アルゴリズ
ムよりかなりいい訳が出るというので注目されています。
いま出ている日経サイエンス2006年7月号には、「ここまできた機械翻訳」
という記事があり、この手法の解説が載ってます。もちろん、「Statistical
machine translation live」を書いたFranz Ochの名前も出てます。というか、
彼がこの手法の開拓者です。
この前、コンピュータ将棋でBonanzaというメモリとプロセッサパワーさえあ
れば、比較的単純な手法でやるプログラムが優勝しましたが、統計的機械翻訳
の手法も似てます。
例が多ければだんだんよくなるという、大数の法則というか、中心極限定理
というか。\(^O^)/
だんだん、人間がやることなくなってくるよなあ。
http://www.amazon.co.jp/exec/obidos/ASIN/415011501X/showshotcorne-22/ref=nosim
カート・ヴォネガット・ジュニア著、浅倉久志訳「プレイヤー・ピアノ」(ハ
ヤカワ文庫SF)
をまた買ってきて読んでみようかな。
ほかに、この号には、「トポロジカル量子コンピューター」の記事もあって、
これはまた奇想天外な面白い話。意外なことに?、Microsoftがこの研究に力
を入れています。
最近のコメント