栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

浅谈php实现映射的两种方法(链表和二叉树)

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力
本篇文章给大家介绍一下php使用链表或二叉树来实现映射的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。


浅谈php实现映射的两种方法(链表和二叉树)

【推荐学习:《PHP视频教程》】

映射

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

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

实现

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


image

链表实现:

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;
    }
}

测试:

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

二叉树实现

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实现映射的两种方法(链表和二叉树)的详细内容,更多请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/262577.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号