php实现映射操作实例详解
时间:2022-07-27
本文章向大家介绍php实现映射操作实例详解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例讲述了php实现映射操作。分享给大家供大家参考,具体如下:
映射
映射,或者射影,在数学及相关的领域经常等同于函数。基于此,部分映射就相当于部分函数,而完全映射相当于完全函数。
映射(Map)是用于存取键值对的数据结构(key,value),一个键只能对应一个值且键不能重复。
实现
映射的实现方式可以使用链表或二叉树实现。
链表实现:
<?php
/**
* 接口 字典
* Interface Dict
* @package appmodels
*/
Interface Dict
{
public function set( $key , $value );
public function get( $key );
public function isExist( $key );
public function delete($key);
public function getSize();
}
class DictLinkList implements Dict
{
protected $size=0;
public $key;
public $value;
public $next;
public function __construct($key=null,$value=null,$next=null)
{
$this- key = $key;
$this- value = $value;
$this- next = $next;
}
public function set($key,$value){
$node = $this;
while( $node && $node- next ){
if( $node- next- key==$key ){
$node- next- value = $value;
return $node- next;
}
$node = $node- next;
}
$node- next = new self($key,$value,$node- next);
$this- size++;
return $node- next;
}
public function get($key){
$node = $this;
while($node){
if( $node- key ==$key ){
return $node- value;
}
$node = $node- next;
}
throw new Exception('cannot found key');
}
public function isExist($key)
{
$node = $this;
while($node){
if( $node- key ==$key ){
return true;
}
$node = $node- next;
}
return false;
}
public function delete($key)
{
if( $this- size==0)
throw new Exception('key is not exist');
$node = $this;
while($node- next){
if( $node- next- key == $key ){
$node- next = $node- next- next;
$this- size--;
break;
}
$node = $node- next;
}
return $this;
}
public function getSize()
{
return $this- size;
}
}
测试:
<?php
$dict = new DictLinkList();
$dict- set('sun',111); //O(n)
$dict- set('sun',222);
$dict- set('w',111);
$dict- set('k',111);
var_dump($dict- get('w')); //O(n)
var_dump($dict- isExist('v')); //O(n)
var_dump($dict- delete('sun')); //O(n)
var_dump($dict- getSize());
/******************************************/
//111
//false
//true
//2
二叉树实现
<?php
class DictBtree implements Dict
{
public $key;
public $value;
public $left;
public $right;
private $size;
public function __construct($key=null,$value=null)
{
$this- key = $key;
$this- value = $value;
$this- left = null;
$this- right = null;
$this- size = 0;
}
public function set( $key , $value ){
if( $this- size ==0 ){
$node = new static( $key,$value );
$this- key = $node- key;
$this- value = $node- value;
$this- size++;
}else{
$node = $this;
while($node){
if( $node- key == $key ){
$node- value = $value;
break;
}
if($node- key $key){
if($node- left==null){
$node- left = new static( $key,$value );
$this- size++;
break;
}
$node = $node- left;
}else{
if($node- right==null){
$node- right = new static( $key,$value );
$this- size++;
break;
}
$node = $node- right;
}
}
}
return $this;
}
public function get( $key ){
if( $this- size ==0 )
throw new Exception('empty');
$node = $this;
while($node) {
if ($node- key == $key) {
return $node- value;
}
if ($node- key $key) {
$node = $node- left;
} else {
$node = $node- right;
}
}
throw new Exception('this key not exist');
}
public function isExist( $key ){
if( $this- size ==0 )
return false;
$node = $this;
while($node) {
if ($node- key == $key) {
return true;
}
if ($node- key $key) {
$node = $node- left;
} else {
$node = $node- right;
}
}
return false;
}
public function delete($key){
//找到元素,寻找元素左边最小元素
$node = $this- select($key);
if( $node- right!=null ){
$node1 = $node- selectMin($node- right);
//替换当前node
$node- key = $node1- key;
$node- value = $node1- value;
//删除$node- right最小元素,获取最终元素赋给$node- right
$nodeMin = $this- deleteMin($node- right);
$node- right = $nodeMin;
}else{
$node1 = $node- selectMax($node- left);
$node- key = $node1- key;
$node- value = $node1- value;
$nodeMax = $this- deleteMax($node- left);
$node- left = $nodeMax;
}
return $this;
}
protected function deleteMin( $node ){
// if( $this- size ==0 )
// throw new Exception('empty');
// $prev = new static();
// $prev- left = $node;
// while($prev- left- left!=null){
//
// $prev = $prev- left;
// }
// $prev- left = $prev- left- right;
if( $node- left==null ){
$rightNode = $node- right;
$node- right = null;
$this- size--;
return $rightNode;
}
$node- left = $this- deleteMin($node- left);
return $node;
}
protected function deleteMax($node){
if( $node- right==null ){
$leftNode = $node- left;
$node- left = null;
$this- size--;
return $leftNode;
}
$node- right = $this- deleteMax($node- right);
return $node;
}
public function getSize(){
return $this- size;
}
public function select($key){
$node = $this;
while($node){
if($node- key==$key){
return $node;
}
if ($node- key $key) {
$node = $node- left;
} else {
$node = $node- right;
}
}
throw new Exception('this key not exist');
}
public function selectMin( $node ){
while($node- left){
$node = $node- left;
}
return $node;
}
public function selectMax( $node ){
while($node- right){
$node = $node- right;
}
return $node;
}
}
复杂度分析
链表 O(n)
二分搜索树 O(log n)
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》
希望本文所述对大家PHP程序设计有所帮助。
- JS魔法堂:再识IE的内存泄露
- 给树莓派安装中文字库
- Hadoop(十七)之MapReduce作业配置与Mapper和Reducer类
- Design Pattern: Observer Pattern
- Hadoop(十六)之使用Combiner优化MapReduce
- ActiveMQ笔记(6):消息延时投递
- CentOS 安装 Maven
- Architecture Pattern: Publish-subscribe Pattern
- OOAD-设计模式(三)之创建型设计模式(5种)
- ActiveMQ笔记(5):JMX监控
- session失效时间设置
- ActiveMQ笔记(4):搭建Broker集群(cluster)
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
- 围棋之幸?围棋之悲?史上最年轻“五冠王”柯洁宣布再战AI
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- [docker]Tomcat安装及配置访问权限
- Nginx+Keepalived 保障HA高可用
- Hash一致性闭环算法 - ( 适用于Redis扩容、Nginx多级缓存 等等 )
- MySQl 事务测试
- 百万数据,SQL数据分流查询
- Linux 安装Apr - 提高Tomcat 的可伸缩性和性能
- Linux下MySQL的彻底卸载
- Excel生成导入SQL语句,快速创建批量 insert/update/delete
- MySQL 执行计划详解
- MySQL 5.7详细安装步骤
- win10必备效率预览神器-Quick look
- 史上最全-Nginx和Tengine安装部署
- Jenkins+Ansible 实现自动化运维 DevOps
- FFmpeg 内容介绍 音视频解码和播放
- 开源:安卓手机app控制arduino,通过esp8266-01