hash算法与拉链法解决冲突

Posted kerwing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hash算法与拉链法解决冲突相关的知识,希望对你有一定的参考价值。

<?php
class HashNode {
    public $key;
    public $value;
    public $nextNode;
    
    public function __construct($key, $value, $nextNode = NULL)
    {
        $this->key = $key;
        $this->value = $value;
        $this->nextNode = $nextNode;
    }
}

class HashTable{
    private $buckets;
    private $size = 10;
    
    public function __construct()
    {
        $this->buckets = [];
    }
    
    private function hashfunc($key)
    {
        $strlen = strlen($key);
        $hashval = 0;
        for ($i = 0; $i < $strlen; $i++) {
            $hashval += ord($key[$i]);
        }
        return $hashval % $this->size;
    }
    
    public function insert($key, $value)
    {
        $index = $this->hashfunc($key);
        //新创建一个节点
        if (isset($this->buckets[$index])) {
            $newNode = new HashNode($key, $value, $this->buckets[$index]);
        } else {
            $newNode = new HashNode($key, $value, NULL);
        }
        $this->buckets[$index] = $newNode; //保存新节点
    }
    
    public function find($key)
    {
        $index = $this->hashfunc($key);
        $current = $this->buckets[$index];
        while (isset($current)) {
            if($current->key == $key){
                return $current->value;
            }
            var_dump($current);die;
            $current = $current->nextNode;
        }
        return NULL;
    }
}

解释:

1.使用Hash函数计算关键字的Hash值,通过Hash值定位到Hash表的指定位置

2.如果此位置已经被其他节点占用,把新节点的$nextNode指向此节点,否则把新节点的$nextNode设置为NULL

3.把新节点保存到Hash表的当前位置

4.遍历当前链表,比较链表中每个节点的关键字与查找关键字是否相等

以上是关于hash算法与拉链法解决冲突的主要内容,如果未能解决你的问题,请参考以下文章

课堂练习——Hash 20162305

Java散列表以拉链法解决冲突问题(以电话簿为例)

Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)链地址法再哈希建立公共溢出区

Python11集合与字典的实现

数据结构刷题2023.02.15小记

HASH方法课下补分博客