当前位置: 首页 > 后端技术 > PHP

数据结构-PHP映射(Map)实现

时间:2023-03-29 22:42:33 PHP

本文主要介绍如何实现映射(Map)。映射是一种存储(键,值)数据对的数据结构(键值)。其特点是(键)找到值(value),下面主要介绍如何使用链表实现映射(Map)和使用二叉搜索树(BinarySearchTree)实现映射(Map).1.基于链表的映射(Map)实现1.1节点定义/***映射节点定义*ClassNode*/classNode{public$key;公共价值;公共$下一个;公共函数__construct($key,$value,$next){$this->key=$key;$this->value=$value;$this->next=$next;}}1.2LinkedListMap类这是一个基于链表的映射(Map)类。有一个add($key,$value)方法将一个key-value键值对添加到链表中,一个contains($key)方法判断map(Map)中是否包含一个key-value键值对$key对应的pair,set($key,$value)方法可以更新key-value键值对中的value值,remove($key)方法可以删除对应的key-value键值对到等于$key的键。dummyHead=newNode(null,null,null);$this->size=0;}/***向链表添加数据*@param$key*@param$value*/publicfunctionadd($key,$value):void{$node=$this->getNode($key);如果($node==null){$this->dummyHead->next=newNode($key,$value,$this->dummyHead->next);$这个->尺寸++;}else{$node->value=$value;}}/***判定Map是否包含key*@param$key*@returnbool*/publicfunctioncontains($key):bool{$node=$this->getNode($key);如果($node==null){返回false;}返回真;}publicfunctionget($key){$node=$this->getNode($key);返回$节点??无效的;}publicfunctionset($key,$value){$node=$this->getNode($key);if($node==null){echo"不存在于key:".$键;出口;}$node->value=$value;}publicfunctionremove($key){$value=null;for($node=$this->dummyHead;$node!=null;$node=$node->next){if($node->next!=null&&$node->next->key==$key){$reNode=$node->next->value;$node->next=$node->next->next;$这个->大小--;休息;}}返回值;}/***遍历链接表获取某个key=$key的节点*@param$key*@return|null*/privatefunctiongetNode($key){for($node=$this->dummyHead->next;$node!=null;$node=$node->next){if($node->key==$key){return$node;}}返回空值;}publicfunctiongetSize():int{}}/***映射节点定义*ClassNode*/classNode{public$key;公共价值;公共$下一个;公共函数__construct($key,$value,$next){$this->key=$key;$this->value=$value;$this->next=$next;}}1.3interfaceMap接口这里是Mapping(Map)的一个实现接口,里面定义了一些函数,所以LinkedListMap继承它之后,里面的所有方法都要重构:add("姓名","秦世贤");$map->add("年龄",22);$map->add("体重",65);$map->remove("年龄");print_r($地图);输入结果如下:2.基于二叉搜索树的映射(Map)实现2.1节点定义类Node{public$key;公共$值;公共$左=空;浦blic$right=null;公共函数__construct($key,$value){$this->key=$key;$this->value=$value;}}2.2BinarySearchTreeMap类这是一个基于二叉搜索树(Map)类实现的map,有add($key,$value)方法将key-value键值对添加到链表中。添加使用递归思想,contains($key)方法判断映射(Map)中是否包含$key对应的key-value键值对,set($key,$value)方法可以更新value中的valuekey-value键值对,remove($key)方法可以删除等于$key的key对应的key-value键值对root=null;$this->size=0;}/***获取映射(Map)中某个键对应的值*@param$key*@return|null*/publicfunctionget($key){return$this->recursionGet($key,$this->根);}/***递归获取密钥对应的节点*@param$key*@param$root*@return|null*/privatefunctionrecursionGet($key,$root){if($root==null){returnnull;}elseif($key==$root->key){return$root;}elseif($key<$root->key){return$this->recursionGet($key,$root->left);}else{return$this->recursionGet($key,$root->right);}}/***添加键值数据*@param$key*@param$value*/publicfunctionadd($key,$value):void{$this->root=$this->recursionAdd($key,$value,$this->root);}/***递归添加数据*@param$key*@param$value*@param$root*/privatefunctionrecursionAdd($key,$value,$root){if($root==null){$root=新节点($键,$值);$这个->尺寸++;}elseif($key==$root->key){$root->value=$value;}elseif($key<$root->key){$root->left=$this->recursionAdd($key,$value,$root->left);}else{$root->right=$this->recursionAdd($key,$value,$root->right);}返回$root;}/***查看map是否包含某个key*@param$key*@returnbool*/publicfunctioncontains($key):bool{$node=$this->recursionGet($key,$this->root);返回$node!=null;}/***递归查看地图是否存在于某个键中*@param$key*@param$root*@returnbool*/privatefunctionrecursionContains($key,$root){if($root==null){returnfalse;}elseif($key==$root->key){返回真;}elseif($key<$root->key){return$this->recursionContains($key,$root->left);}else{return$this->recursionContains($key,$root->right);}}/***修改键对应的值*@param$key*@param$value*/functionset($key,$value){$node=$this->recursionGet($key,$this->root);if($node==null){echo"不存在该节点";出口;}$node->value=$value;}/***获取镜像Map中key-value数量*@returnint*/publicfunctiongetSize():int{return$this->size;}}类节点{public$key;公共价值;公共$左=空;公共$right=null;公共函数__construct($key,$value){$this->key=$key;$this->value=$value;}}Tips:contains($key)方法可以先调用recursionGet($key)递归获取key对应的节点,如果不为null则返回true,否则返回false,set($key)也可以现在重用recursionGet($key)获取节点信息2.3interfaceMap接口这里是Mapping(Map)的一个实现接口,定义了一些函数,使得LinkedListMap继承它之后,必须重构其中的所有方法:add(45,"45value");$map->添加(30,"30value");$map->add(55,"55value");$map->add(25,"25value");$map->add(35,"35value");$map->add(50,"50value");$map->add(65,"65value");$map->set(65,6666);print_r($map);输出如下:BinarySearchTreeMapObject([root]=>节点对象([key]=>45[value]=>45value[left]=>节点对象([key]=>30[value]=>30value[left]=>NodeObject([key]=>25[value]=>25value[left]=>[right]=>)[right]=>NodeObject([key]=>35[value]=>35value[left]=>[right]=>))[right]=>节点对象([key]=>55[value]=>55value[left]=>节点对象([key]=>50[value]=>50value[left]=>[右]=>)[右]=>节点对象([key]=>65[value]=>6666[left]=>[right]=>))[size]=>7)代码库:https://gitee.com/love-for-po。..扫描二维码关注爱因世贤