标题:一起学习PHP中的DS数据结构扩展(二)

文章目录
    分类:PHP 标签:数据结构,PHP基础

    一起学习PHP中的DS数据结构扩展(二)

    上文中我们学习了 DS 扩展中一些比较常用的数据结构,也留下了一些伏笔,比如 Map 中返回 keys() 和 values() 分别返回的是两种特殊的数据结构,也就是我们今天要学习的内容。

    向量集合 Vector

    最初见到 Vector 还是在很早的时候在 Java 中见过。不过即使是在 Java 中,这个类型的数据结构的使用也并不多,因为在 Java 中也是以 List 和 Map 为主。我们先来看看这个集合是怎么用的。

    $vector = new \Ds\Vector(["a", "b", "c"]);
    
    $vector->push("d");
    $vector->push(5);
    $vector->push(6);
    $vector->push(7);
    $vector->push(8);
    
    $vector->set(3, "ccc");
    
    var_dump($vector->get(3)); // string(3) "ccc"
    var_dump($vector->pop()); // int(8)
    
    $vector->unshift(1);
    $vector->unshift(-1); 
    
    var_dump($vector->shift()); // int(-1)
    
    $vector->insert(5, 'five');
    var_dump($vector->get(5)); // string(4) "five"
    
    var_dump($vector->get(6)); // int(5)
    $vector->remove(6);
    var_dump($vector->get(6)); // int(6)
    
    var_dump($vector[4]); // string(3) "ccc"
    
    $vector[4] = 'Num 4.';
    
    var_dump($vector[4]); // string(6) "Num 4."
    
    var_dump($vector);
    // object(Ds\Vector)#1 (8) {
    //   [0]=>
    //   int(1)
    //   [1]=>
    //   string(1) "a"
    //   [2]=>
    //   string(1) "b"
    //   [3]=>
    //   string(1) "c"
    //   [4]=>
    //   string(6) "Num 4."
    //   [5]=>
    //   string(4) "five"
    //   [6]=>
    //   int(6)
    //   [7]=>
    //   int(7)
    // }

    它的很多方法和 Map 都是类似的,不过它支持 push()、pop()、shift()、unshift() 这四种方法,也就是分别从尾部和头部添加和取出数据。另外在底层,它使用的总内存会少于使用数组,当分配的内存大小降到到足够低的时候会自动释放内存。对于 get()、set()、push()、pop() 这些方法的操作效率都能达到 O(1) 的水平,而对于 shift()、unshift()、insert()、remove() 这些操作则都是 O(n) 的水平。至于在什么场景下使用就很清晰了,很大的数组使用它可以节约内存,并且一些操作的效率还非常高。


    在 Map 中使用 values() 和 paris() 返回的就都是 Vector 这个类型的集合。

    唯一集合 Set

    Set 这个集合结构其实挺常见的,不止是 Java 这些编程语言中,redis 中也有这种存储数据的方式,相信大家不会陌生。和其它结构最显著的区别就是 Set 中的值必须是唯一的。

    $set = new \Ds\Set(["a", "b", "c"]);
    $set->add("d");
    
    $set->add("b");
    
    var_dump($set);
    // object(Ds\Set)#2 (4) {
    //   [0]=>
    //   string(1) "a"
    //   [1]=>
    //   string(1) "b"
    //   [2]=>
    //   string(1) "c"
    //   [3]=>
    //   string(1) "d"
    // }

    这个就不多做解释了,相信大家就算没有在代码中用过,也会在 redis 的使用中接触过,业务场景也非常多。在上篇文章中 Map 返回的 keys() 信息就是 Set 结构的,因为 Map 中的键是不能有重复的,包括数字下标的数组其实也都是不能有重复的键值的。

    双端队列 Deque

    双端队列其实在表现形式上和 Vector 差不多,同样可以在队列的头尾部进行增加取出操作,不过它有两个指针分别指向队列的头尾部,所以它的 shift() 和 unshift() 的速度也是非常快的 O(1) 级别。

    $deque = new \Ds\Deque(["a", "b", "c"]);
    
    $deque->push("d");
    $deque->unshift("z");
    
    var_dump($deque);
    // object(Ds\Deque)#3 (5) {
    //     [0]=>
    //     string(1) "z"
    //     [1]=>
    //     string(1) "a"
    //     [2]=>
    //     string(1) "b"
    //     [3]=>
    //     string(1) "c"
    //     [4]=>
    //     string(1) "d"
    //   }
    
    var_dump($deque->pop()); // string(1) "d"
    var_dump($deque->shift()); // string(1) "z"

    总结

    今天介绍的内容相比上篇文章简单很多,但上篇文章其实也只是测试的代码结果展示的比较多而已。整体的 DataStruct 扩展框架中的数据结构就是这些,就像最开始我们说过的,如果没有特别的需求,只是需要用到栈或队列的话,直接使用 SPL 中的就可以了。而如果有特殊的需求,比如说 Map 这种对象类型,又或者需要一个节约内存的数组,那么 Ds 中的这些数据结构想必会是你的好帮手。


    测试代码:


    https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/02/source/3.一起学习PHP中的DS数据结构扩展(二).php


    参考文档:


    https://www.php.net/manual/zh/book.ds.php

    视频链接

    B站视频地址:https://www.bilibili.com/video/BV1n3411n7LS

    微信视频地址:http://mp.weixin.qq.com/s?__biz=MzIxODQyNTU1MA==&mid=2247486753&idx=1&sn=b809b18b783bccf9e458025cf230289c&chksm=97ebfc80a09c7596b3c8727316ca7d568986af9df3799d7411d42ee951914bcb524d6847bcbd&scene=27#wechat_redirect

    微信文章地址:http://mp.weixin.qq.com/s?__biz=MzIxODQyNTU1MA==&mid=2247486138&idx=1&sn=dce1cfe0389e86843851000cd2b3f534&chksm=97ebfb1ba09c720d4c706fb18e8fa4cfd81eb64e37b978236eabcf51a9f804138c553d465e56&scene=27#wechat_redirect

    搜索
    关注