mirror of
https://github.com/krahets/hello-algo.git
synced 2024-12-25 00:06:28 +08:00
Fix the code of hash map chaining.
This commit is contained in:
parent
55615ab61d
commit
6da6d24193
7 changed files with 79 additions and 61 deletions
|
@ -72,12 +72,13 @@ class HashMapChaining {
|
||||||
public void remove(int key) {
|
public void remove(int key) {
|
||||||
int index = hashFunc(key);
|
int index = hashFunc(key);
|
||||||
// 遍历桶,从中删除键值对
|
// 遍历桶,从中删除键值对
|
||||||
foreach (Pair pair in buckets[index].ToList()) {
|
foreach (Pair pair in buckets[index].ToList()) {
|
||||||
if (pair.key == key) {
|
if (pair.key == key) {
|
||||||
buckets[index].Remove(pair);
|
buckets[index].Remove(pair);
|
||||||
|
size--;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
size--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 扩容哈希表 */
|
/* 扩容哈希表 */
|
||||||
|
|
|
@ -78,8 +78,13 @@ class HashMapChaining {
|
||||||
int index = hashFunc(key);
|
int index = hashFunc(key);
|
||||||
List<Pair> bucket = buckets[index];
|
List<Pair> bucket = buckets[index];
|
||||||
// 遍历桶,从中删除键值对
|
// 遍历桶,从中删除键值对
|
||||||
bucket.removeWhere((Pair pair) => pair.key == key);
|
for (Pair pair in bucket) {
|
||||||
size--;
|
if (pair.key == key) {
|
||||||
|
bucket.remove(pair);
|
||||||
|
size--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 扩容哈希表 */
|
/* 扩容哈希表 */
|
||||||
|
|
62
codes/go/chapter_hashing/hash_collision_test.go
Normal file
62
codes/go/chapter_hashing/hash_collision_test.go
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
// File: hash_collision_test.go
|
||||||
|
// Created Time: 2022-12-14
|
||||||
|
// Author: msk397 (machangxinq@gmail.com)
|
||||||
|
|
||||||
|
package chapter_hashing
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHashMapChaining(t *testing.T) {
|
||||||
|
/* 初始化哈希表 */
|
||||||
|
hmap := newHashMapChaining()
|
||||||
|
|
||||||
|
/* 添加操作 */
|
||||||
|
// 在哈希表中添加键值对 (key, value)
|
||||||
|
hmap.put(12836, "小哈")
|
||||||
|
hmap.put(15937, "小啰")
|
||||||
|
hmap.put(16750, "小算")
|
||||||
|
hmap.put(13276, "小法")
|
||||||
|
hmap.put(10583, "小鸭")
|
||||||
|
fmt.Println("\n添加完成后,哈希表为\nKey -> Value")
|
||||||
|
hmap.print()
|
||||||
|
|
||||||
|
/* 查询操作 */
|
||||||
|
// 向哈希表输入键 key ,得到值 value
|
||||||
|
name := hmap.get(15937)
|
||||||
|
fmt.Println("\n输入学号 15937 ,查询到姓名 ", name)
|
||||||
|
|
||||||
|
/* 删除操作 */
|
||||||
|
// 在哈希表中删除键值对 (key, value)
|
||||||
|
hmap.remove(12836)
|
||||||
|
fmt.Println("\n删除 12836 后,哈希表为\nKey -> Value")
|
||||||
|
hmap.print()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHashMapOpenAddressing(t *testing.T) {
|
||||||
|
/* 初始化哈希表 */
|
||||||
|
hmap := newHashMapOpenAddressing()
|
||||||
|
|
||||||
|
/* 添加操作 */
|
||||||
|
// 在哈希表中添加键值对 (key, value)
|
||||||
|
hmap.put(12836, "小哈")
|
||||||
|
hmap.put(15937, "小啰")
|
||||||
|
hmap.put(16750, "小算")
|
||||||
|
hmap.put(13276, "小法")
|
||||||
|
hmap.put(10583, "小鸭")
|
||||||
|
fmt.Println("\n添加完成后,哈希表为\nKey -> Value")
|
||||||
|
hmap.print()
|
||||||
|
|
||||||
|
/* 查询操作 */
|
||||||
|
// 向哈希表输入键 key ,得到值 value
|
||||||
|
name := hmap.get(13276)
|
||||||
|
fmt.Println("\n输入学号 13276 ,查询到姓名 ", name)
|
||||||
|
|
||||||
|
/* 删除操作 */
|
||||||
|
// 在哈希表中删除键值对 (key, value)
|
||||||
|
hmap.remove(16750)
|
||||||
|
fmt.Println("\n删除 16750 后,哈希表为\nKey -> Value")
|
||||||
|
hmap.print()
|
||||||
|
}
|
|
@ -89,10 +89,10 @@ func (m *hashMapChaining) remove(key int) {
|
||||||
if p.key == key {
|
if p.key == key {
|
||||||
// 切片删除
|
// 切片删除
|
||||||
m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)
|
m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)
|
||||||
|
m.size -= 1
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.size -= 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 扩容哈希表 */
|
/* 扩容哈希表 */
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
. "github.com/krahets/hello-algo/pkg"
|
. "github.com/krahets/hello-algo/pkg"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestHashmap(t *testing.T) {
|
func TestHashMap(t *testing.T) {
|
||||||
/* 初始化哈希表 */
|
/* 初始化哈希表 */
|
||||||
hmap := make(map[int]string)
|
hmap := make(map[int]string)
|
||||||
|
|
||||||
|
@ -55,58 +55,6 @@ func TestHashmap(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHashMapChaining(t *testing.T) {
|
|
||||||
/* 初始化哈希表 */
|
|
||||||
hmap := newHashMapChaining()
|
|
||||||
|
|
||||||
/* 添加操作 */
|
|
||||||
// 在哈希表中添加键值对 (key, value)
|
|
||||||
hmap.put(12836, "小哈")
|
|
||||||
hmap.put(15937, "小啰")
|
|
||||||
hmap.put(16750, "小算")
|
|
||||||
hmap.put(13276, "小法")
|
|
||||||
hmap.put(10583, "小鸭")
|
|
||||||
fmt.Println("\n添加完成后,哈希表为\nKey -> Value")
|
|
||||||
hmap.print()
|
|
||||||
|
|
||||||
/* 查询操作 */
|
|
||||||
// 向哈希表输入键 key ,得到值 value
|
|
||||||
name := hmap.get(15937)
|
|
||||||
fmt.Println("\n输入学号 15937 ,查询到姓名 ", name)
|
|
||||||
|
|
||||||
/* 删除操作 */
|
|
||||||
// 在哈希表中删除键值对 (key, value)
|
|
||||||
hmap.remove(12836)
|
|
||||||
fmt.Println("\n删除 12836 后,哈希表为\nKey -> Value")
|
|
||||||
hmap.print()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHashMapOpenAddressing(t *testing.T) {
|
|
||||||
/* 初始化哈希表 */
|
|
||||||
hmap := newHashMapOpenAddressing()
|
|
||||||
|
|
||||||
/* 添加操作 */
|
|
||||||
// 在哈希表中添加键值对 (key, value)
|
|
||||||
hmap.put(12836, "小哈")
|
|
||||||
hmap.put(15937, "小啰")
|
|
||||||
hmap.put(16750, "小算")
|
|
||||||
hmap.put(13276, "小法")
|
|
||||||
hmap.put(10583, "小鸭")
|
|
||||||
fmt.Println("\n添加完成后,哈希表为\nKey -> Value")
|
|
||||||
hmap.print()
|
|
||||||
|
|
||||||
/* 查询操作 */
|
|
||||||
// 向哈希表输入键 key ,得到值 value
|
|
||||||
name := hmap.get(13276)
|
|
||||||
fmt.Println("\n输入学号 13276 ,查询到姓名 ", name)
|
|
||||||
|
|
||||||
/* 删除操作 */
|
|
||||||
// 在哈希表中删除键值对 (key, value)
|
|
||||||
hmap.remove(16750)
|
|
||||||
fmt.Println("\n删除 16750 后,哈希表为\nKey -> Value")
|
|
||||||
hmap.print()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSimpleHash(t *testing.T) {
|
func TestSimpleHash(t *testing.T) {
|
||||||
var hash int
|
var hash int
|
||||||
|
|
||||||
|
|
|
@ -80,10 +80,12 @@ class HashMapChaining {
|
||||||
List<Pair> bucket = buckets.get(index);
|
List<Pair> bucket = buckets.get(index);
|
||||||
// 遍历桶,从中删除键值对
|
// 遍历桶,从中删除键值对
|
||||||
for (Pair pair : bucket) {
|
for (Pair pair : bucket) {
|
||||||
if (pair.key == key)
|
if (pair.key == key) {
|
||||||
bucket.remove(pair);
|
bucket.remove(pair);
|
||||||
|
size--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
size--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 扩容哈希表 */
|
/* 扩容哈希表 */
|
||||||
|
|
|
@ -66,7 +66,7 @@ class HashMapChaining:
|
||||||
if pair.key == key:
|
if pair.key == key:
|
||||||
bucket.remove(pair)
|
bucket.remove(pair)
|
||||||
self.size -= 1
|
self.size -= 1
|
||||||
return
|
break
|
||||||
|
|
||||||
def extend(self):
|
def extend(self):
|
||||||
"""扩容哈希表"""
|
"""扩容哈希表"""
|
||||||
|
|
Loading…
Reference in a new issue