mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 06:07:20 +08:00 
			
		
		
		
	Fix the code of hash map chaining.
This commit is contained in:
		@ -75,9 +75,10 @@ class HashMapChaining {
 | 
				
			|||||||
        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--;
 | 
					                size--;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* 扩容哈希表 */
 | 
					    /* 扩容哈希表 */
 | 
				
			||||||
 | 
				
			|||||||
@ -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) {
 | 
				
			||||||
 | 
					      if (pair.key == key) {
 | 
				
			||||||
 | 
					        bucket.remove(pair);
 | 
				
			||||||
        size--;
 | 
					        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--;
 | 
					                size--;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* 扩容哈希表 */
 | 
					    /* 扩容哈希表 */
 | 
				
			||||||
 | 
				
			|||||||
@ -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):
 | 
				
			||||||
        """扩容哈希表"""
 | 
					        """扩容哈希表"""
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user