• PHP 实现HASH表


    Hash 表又称散列表,通过关键字Key 映射到数组中一个位置来访问记录
    Hash 函数的作用是把任意长度的输入,通过HASH算法变换成固定长度的输出,该输出就是HASH值
    HASH表的时间复杂度为O(1)
    下文使用直接取余法实现
    创建一个hashtable
    class HashTable{
         
        private $buckets;          //用于存储数据的数组
        private $size = 12;          //记录buckets 数组的大小
        public function __construct(){
             
            $this->buckets = new SplFixedArray($this->size);
            //SplFixedArray效率更高,也可以用一般的数组来代替
        }
         
        private function hashfunc($key){
            $strlen = strlen($key);  //返回字符串的长度
            $hashval = 0;     
            for($i = 0; $i<$strlen ; $i++){
                $hashval +=ord($key[$i]); //返回ASCII的值
            }
            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];
                echo "</br>";
                var_dump($current);
                while(isset($current)){    //遍历当前链表
                    if($current->key==$key){    //比较当前结点关键字
                        return $current->value;
                    }
                    $current = $current->nextNode;
                    //return $current->value;
                }
                return NULL;
            }
         
    }
    上述可能会有冲突问题,比如HASH表指向的
    插入两个元素,第二个元素的HASH值与第一个值得HASH值相同
    则第二个元素将覆盖第一个元素的值
    这时我们用拉链法解决冲突:具有相同HASH值得字节点链接在同一个链表中。查找这个元素的时候就必须遍历这条链表。
    创建 HASHNODE
    class HashNode{
                public $key;       //关键字
                public $value;     //数据
                public $nextNode;  //HASHNODE来存储信息
                public function __construct($key,$value,$nextNode = NULL){
                            $this->key = $key;
                            $this->value = $value;
                            $this->nextNode = $nextNode;
                             
                }
             
    }

    实现

    $ht = new HashTable();
         $ht->insert('key1','value1');
         //$ht->insert('key12','value12');
            echo $ht->find('key1');
  • 相关阅读:
    日期类型存储方法
    Log4j2的一些记录
    【Maven】学习记录
    HTML 图片加载问题
    浏览器的组成
    javascript数组的实例属性(方法)
    javascript数组的内置对象Array
    javascript之this
    css的position,float属性的理解
    简单介绍帧动画
  • 原文地址:https://www.cnblogs.com/yhdsir/p/5529191.html
Copyright © 2020-2023  润新知