文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

php如何实现映射

2023-06-06 18:27

关注

小编给大家分享一下php如何实现映射,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

映射

映射,或者射影,在数学及相关的领域经常等同于函数。基于此,部分映射就相当于部分函数,而完全映射相当于完全函数。

映射(Map)是用于存取键值对的数据结构(key,value),一个键只能对应一个值且键不能重复。

实现

映射的实现方式可以使用链表或二叉树实现。

php如何实现映射

链表实现:

<?phpInterface 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

二叉树实现

<?phpclass 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如何实现映射”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯