LoginSignup
1
2

More than 5 years have passed since last update.

Goでのアルゴリズムクイックリファレンス第2版(ハッシュに基づいた探索)

Posted at

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。アルゴリズムクイックリファレンス 第2版を読んで各種アルゴリズムをGoで実装して行きます。

前回: Goでのアルゴリズムクイックリファレンス第2版(二分探索)

今回はハッシュ関数

ハッシュ関数 (ハッシュかんすう、hash function) あるいは要約関数とは、あるデータが与えられた場合にそのデータを代表する数値を得る操作、または、その様な数値を得るための関数のこと。ハッシュ関数から得られた数値のことを要約値やハッシュ値または単にハッシュという。

計算量は、最良と平均はO(1)で最悪がO(n)となる。
高速でデータを取り出したい場合によく使われる

package main

import "fmt"

var table [][]int

func loadTable(a *[]int) {
    table = make([][]int, len(*a))
    for _, e := range *a {
        h := hash(e, len(*a))
        if table[h] == nil {
            table[h] = make([]int, 0)
        }
        table[h] = append(table[h], e)
    }
}

func hash(key int, size int) int {
    var h int
    for i := 0; i < key+1; i++ {
        h = (h*137 + i) % size
    }
    return h
}

func search(a *[]int, t int) bool {
    h := hash(t, len(*a))
    list := table[h]
    if list == nil {
        return false
    }
    for _, v := range list {
        if v == t {
            return true
        }
    }
    return false
}

func main() {
    a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    loadTable(&a)
    fmt.Println(a)
    fmt.Printf("0:%t\n", search(&a, 0))
    fmt.Println(a)
    fmt.Printf("2:%t\n", search(&a, 2))
    fmt.Println(a)
    fmt.Printf("12:%t\n", search(&a, 12))
}

今回はhash関数を作成するところで以下のサイトを参考にさせていただきました。

次回はブルームフィルタの予定です。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2