Slightly different FillFactor - minseok127/HashSimulator GitHub Wiki
Introduce
Distribution wiki ๋ฐ FillFactor wiki์์๋ root-square-mean์ ํตํด FillFactor๋ฅผ ์ ๋ํ์ต๋๋ค.
ํ์ง๋ง ์ง์ root-square-mean์ ํตํด ์์์ ์ ๊ฐํด๋ดค์ ๋, ๊ฐ์ f๋ฅผ ์ ๋ํ์ง ๋ชปํ์์ต๋๋ค.
๊ทธ๋์ ์์ ํ์ด์ง๋ค๊ณผ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก FillFactor์ ๋น์ทํ์ง๋ง ๋ค๋ฅธ ์์์ ์ ๋ํด๋ณด๊ฒ ์ต๋๋ค.
Contents
What is a Work?
์ด๋ค bin์ 5๊ฐ์ data๊ฐ ๋ค์ด์๋ค๊ณ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
Hash Table์ด Chaining Rule์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ์ ๋,
Linked List์ 1๋ฒ์งธ Data์ ์ ๊ทผํ๊ธฐ ์ํด์๋ 1๊ฐ์ ๋ ธ๋๋ฅผ ํ์ธํ๋ฉด ๋ฉ๋๋ค.
Linked List์ 2๋ฒ์งธ Data์ ์ ๊ทผํ๊ธฐ ์ํด์๋ 2๊ฐ์ ๋ ธ๋๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
Linked List์ 3๋ฒ์งธ Data์ ์ ๊ทผํ๊ธฐ ์ํด์๋ 3๊ฐ์ ๋ ธ๋๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
...
์ด์ฒ๋ผ bin์ ๋ค์ด์๋ ์ด๋ ํ data์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๊ทธ data๊ฐ Linked List์ ์์นํ index๋งํผ์ ํ์ธ์ ํด์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ bin์ ๋ค์ด์๋ ๋ชจ๋ data์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฑ์ฐจ์์ด์ ํฉ๋งํผ์ ํ์ธ์ด ํ์ํฉ๋๋ค.
์ฃผ์ด์ง ๋ชจ๋ key๋ค์ ๋ํด์ ์ด์ ๋์ํ๋ data๋ค์ ์ฐพ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ํ์ธ์ ์๋ฅผ Work๋ผ๊ณ ์ ์ํ๊ฒ ์ต๋๋ค.
Assume
์ด์ ํ์ด์ง์ ๊ฐ์ ๋ณ์๋ค์ ์ฌ์ฉํฉ๋๋ค.
Ideal Work
Hash Table์์ Ideal Distribution์ Uniform Distribution์ ๋๋ค.
Uniform Distribution์ Work๋ฅผ Ideal Work(IW)๋ผ๊ณ ์ ์ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ด์์ ์ธ table์ด F๊ฐ์ bins๋ง ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ฉด IW๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
double c = k / f // f๊ฐ์ bins์ ๊ฐ๊ฐ ๋ถ๋ฐฐ๋ data ์
double IW = f * (c * (c + 1) / 2) // ์ฌ์ฉํ๋ bins์ ๊ฐ์ * ๊ฐ bins๋ง๋ค ๊ธฐ๋๋๋ work
Real Work
Testํ Hash Function์ผ๋ก๋ถํฐ ๋ง๋ค์ด์ง Distribution์ Work๋ฅผ Real Work(RW)๋ผ๊ณ ์ ์ํ๊ฒ ์ต๋๋ค.
double RW = 0;
for (int i = 0 ; i < N; i++) {
RW += (bin[i] * (bin[i] + 1)) / 2 // bin[i]๋ i๋ฒ์งธ bin์ ๋ค์ด์๋ data์ ์
}
๊ทธ๋ฐ๋ฐ ์ด ๊ณ์ฐ์ ์์์ผ๋ก ๋ํ๋ด๋ณด๋ฉด
ฮฃ bi * (bi + 1) / 2 = (ฮฃ bi^2 + ฮฃ bi) / 2
์ด์ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ฮฃ bi = k ๋ก ํํํ ์ ์๊ธฐ ๋๋ฌธ์(๋ชจ๋ bin์ ๋ค์ด์๋ data์ ์๋ ์ ์ฒด key์ ๊ฐ์์ ๊ฐ์)
RW = (ฮฃ bi^2) / 2 + (k / 2) ๋ก ํํํ ์ ์์ต๋๋ค.
Derive
์ฃผ์ด์ง k๊ฐ์ key๋ค์ ๋ํด์ Real Distribution๊ณผ f๊ฐ์ bin์ ์ฌ์ฉํ๋ Ideal Distribution์ Work๊ฐ ๊ฐ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
(ฮฃ bi^2) / 2 + (k / 2) = f * (k/f)((k/f) + 1)/2
=> (ฮฃ bi^2) + k = k * k / f + k
=> (ฮฃ bi^2) = k * k / f
=> f = k * k / (ฮฃ bi^2)
์ด์ ๊ฐ์ด f๋ฅผ ์ ๋ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ r์ bins๋ค์ root-square-mean์ด๊ธฐ ๋๋ฌธ์
r = ( (b1^2 + b2^2 + ... + bn^2) / n )^(1/2)
n * r * r = b1^2 + b2^2 + ... + bn^2
์ด๋ฏ๋ก f = k * k / (n * r * r) ์ผ๋ก ํํํ ์ ์์ต๋๋ค.
Conclusion
double f = (k*k - 1) / (n*r*r - k); // smhasher's f
double f = k * k / (n * r * r); // my f
์ด๋ฒ ํ๋ก์ ํธ์์๋ ์ ๋ ๊ณผ์ ์ ์ดํดํ ๋ ๋ฒ์งธ f๋ฅผ ์ด์ฉํ์ฌ FillFactor๋ฅผ ๊ณ์ฐํ๊ฒ ์ต๋๋ค.