Fix the code of hash map chaining.

This commit is contained in:
krahets 2023-08-01 17:05:40 +08:00
parent 55615ab61d
commit 6da6d24193
7 changed files with 79 additions and 61 deletions

View file

@ -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--;
} }
/* 扩容哈希表 */ /* 扩容哈希表 */

View file

@ -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;
}
}
} }
/* 扩容哈希表 */ /* 扩容哈希表 */

View 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()
}

View file

@ -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
} }
/* 扩容哈希表 */ /* 扩容哈希表 */

View file

@ -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

View file

@ -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--;
} }
/* 扩容哈希表 */ /* 扩容哈希表 */

View file

@ -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):
"""扩容哈希表""" """扩容哈希表"""