构造哈希函数
直接地址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法
冲突解决
- 开发地址法
- 再哈希法
- 拉链法
- 建立公共溢出区
设计哈希集合
type MyHashSet struct {
data []list.List
}
func Constructor() MyHashSet {
return MyHashSet{data: make([]list.List, 911)}
}
func hash(key int) int {
return key % 911
}
func (hs *MyHashSet) Add(key int) {
if !hs.Contains(key) {
index := hash(key)
hs.data[index].PushBack(key)
}
}
func (hs *MyHashSet) Remove(key int) {
index := hash(key)
for i := hs.data[index].Front(); i != nil; i = i.Next() {
if i.Value.(int) == key {
hs.data[index].Remove(i)
}
}
}
func (hs *MyHashSet) Contains(key int) bool {
index := hash(key)
for i := hs.data[index].Front(); i != nil; i = i.Next() {
if i.Value.(int) == key {
return true
}
}
return false
}
设计哈希映射
const base = 911
type pair struct {
key int
value int
}
type MyHashMap struct {
data []list.List
}
func Constructor() MyHashMap {
return MyHashMap{data: make([]list.List, base)}
}
func (m MyHashMap) hash(key int) int {
return key % base
}
func (m *MyHashMap) Put(key int, value int) {
index := m.hash(key)
for i := m.data[index].Front(); i != nil; i = i.Next() {
if key == i.Value.(pair).key {
i.Value = pair{key, value}
return
}
}
m.data[index].PushBack(pair{key, value})
}
func (m *MyHashMap) Get(key int) int {
index := m.hash(key)
for i := m.data[index].Front(); i != nil; i = i.Next() {
if key == i.Value.(pair).key {
return i.Value.(pair).value
}
}
return -1
}
func (m *MyHashMap) Remove(key int) {
index := m.hash(key)
for i := m.data[index].Front(); i != nil; i = i.Next() {
if key == i.Value.(pair).key {
m.data[index].Remove(i)
}
}
}