【教えて】Javaのハッシュテーブルについて「新しいテーブルサイズは (古いサイズ * 2 + 1) になる。これは検索効率を低下させないための工夫である」という記述を見かけましたが、(古いサイズ * 2)ではなくそこに1足す事で具体的にどんな利益があるんですか?
2011-02-27 11:12:56@mzp サイズ0のハッシュテーブルは作らないと思いますし、2のべき乗以外のサイズのテーブルになると&じゃなくて%で目的に至る必要があるので計算負荷がかかります。悪いこと尽くめだと思うのですが。
2011-02-27 11:25:05@kumagi @finalfusion いいえ, 違います. 初期容量は 11 らしいです. しかし, 初期容量を指定できるコンストラクタがあるのでサイズ 0 のものを作ることは可能です. http://t.co/W8P5D9x
2011-02-27 11:33:09@cocoatomo @finalfusion サイズ0のテーブルに要素つっこんだら例外投げるか、強制的にサイズ1にするかぐらいしてもいいんじゃないかと思います。初期容量11は真剣に謎ですね…。
2011-02-27 11:36:33@kumagi @finalfusion (oldSize * 2 + 1) という式で, サイズが 0 だったら 1 にしてますが. そういうことではなく? 初期サイズは謎です. ちなみに ArrayList の初期サイズは 10 です. 謎です.
2011-02-27 11:38:37@cocoatomo @finalfusion サイズが0の時だけifで切って1にする、もしくはテーブルサイズが0なんて例外中の例外は特別扱いしていいんじゃないか、ってことです。
2011-02-27 11:43:58@kumagi @finalfusion う〜ん, 理由は分からないですねぇ. JVM 上では if のコストってそんなに高いんでしょうかねぇ……
2011-02-27 11:47:09@kumagi 少しだけ java.uti.Hashtable のソースを見てみたのですが "newCapacity the new capacity, MUST be a power of two" と書いてあるくらいなので、その +1 というのが間違ってるのかな、と。
2011-02-27 11:28:47@oza_x86 http://www.nurs.or.jp/~sug/soft/super/hash.htm の一番下です。dankogaiさんのブログでは「ここでは新しいハッシュテーブルの大きさは2倍+1要素としています。多くのハッシュテーブルの実装ではそうなっています」と。
2011-02-27 11:33:12@oza_x86 そちらのブログは http://blog.livedoor.jp/dankogai/archives/50961440.html ここです。+1謎い…。
2011-02-27 11:39:54@kumagi 初期サイズ0が許される。でも、デフォルトサイズも11というキリの悪い数字にされてるね。デフォルト負荷率75%も、どうしてそうなってるのかは知らない。
2011-02-27 11:33:18@mindstack 11という数字が謎過ぎる。 load factor 75%はopen addressingを意識してでしょうか… http://en.wikipedia.org/wiki/File:Hash_table_average_insertion_time.png
2011-02-27 11:38:47@kumagi loadfactorに100%も指定できるようだし、そこら辺の処理用に+1配列の冗長性使ってるんじゃないかと推測。
2011-02-27 11:41:46@mindstack なるほど、open addressingに対して100%使用は無限ループになりかねませんし。でもそれを「検索効率を低下させないための工夫」と呼ぶのかは疑わしいです。
2011-02-27 11:45:12@ucq たしかにメルセンヌ数 (メルセンヌ素数ではない!) を 2n+1 すれば次のメルセンス数になるねぇ。それが素数になるかは別として。
2011-02-27 11:40:47