代码之家  ›  专栏  ›  技术社区  ›  Stephen

PHP的splDoubleLinkedList类的意义是什么,更重要的是,通常的链接列表?

  •  17
  • Stephen  · 技术社区  · 15 年前

    为了扩大我的编程能力,我对它做了一些小小的探索。 The Standard PHP Library . 这导致我发现 SplDoublyLinkedList 班级。从那里我看到了 Linked Lists 和 Doubly Linked Lists 在维基百科上。

    我理解他们是如何工作的…但我无法想象为什么我们需要它,或者更好的是,一个实际的例子 SplDoubleLink列表 因为我们在PHP中有索引和关联数组。

    链接列表通常如何在PHP中使用和在PHP外使用?

    6 回复  |  直到 11 年前
        1
  •  7
  •   user69173    12 年前

    SPL数据结构减少了内存消耗并提高了性能。好的解释:

    数据结构本质上独立于语言,以数学中的一组逻辑概念的形式存在。这些容器根据需要使用不同的算法来最大限度地提高效率。

    例如,如果您不需要关联数组的散列映射功能——也就是说,如果您没有为特定目的而使用数组键,并且只需要枚举数组——splFixedArray(以前是splFastArray,现在是未记录的)可能是一个合适的替换。唯一要注意的是数组的大小是固定的,这意味着在实例化类时必须指定大小,如果试图存储的元素超过这个数目,则会发生错误。这就是它比标准的PHP数组性能更好的原因。

    http://web.archive.org/web/20130805120049/http://blueparabola.com/blog/spl-deserves-some-reiteration

    在组成PHP解释器的C代码中,数组被实现为称为哈希表或哈希映射的数据结构。当数组中包含的值被其索引引用时,PHP使用哈希函数将该索引转换为唯一的哈希,表示数组中相应值的位置。

    这种哈希映射实现允许数组存储任意数量的元素,并使用数字键或字符串键同时提供对所有这些元素的访问。阵列以其所提供的功能速度极快,是一种优秀的通用数据结构。

    在计算机科学中,列表被定义为值的有序集合。链接列表是一种数据结构,其中列表中的每个元素都包含对列表中每一侧的一个或两个元素的引用。术语双重链表用于指后一种情况。在SPL中,这采用了SPLDubleLinkedList类的形式。如果事先不知道要存储的元素的数量,并且只需要按顺序位置访问元素,那么使用列表是有意义的。

    http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/

        2
  •  4
  •   Jeroen De Dauw    11 年前

    根据 Wikipedia ,

    链表的主要好处 在传统阵列上, 链接项的顺序可以是 不同于数据的顺序 项目存储在内存或磁盘上。 因此,链接列表允许 在任意位置插入和移除节点 点在列表中,带有常量 操作数。

    另一方面,链接列表 它们本身不允许随机访问 对数据或任何形式的有效 索引。因此,许多基本操作 例如获取的最后一个节点 列表,或查找 包含给定的基准或定位 新节点应该位于的位置 插入可能需要扫描大多数 列表元素的。

    所以要回答你的问题,我不知道。:)

        3
  •  3
  •   tacone    12 年前

    首先, SplDoubleLink列表 是对象,例如

    • 它们可以被扩展,因此您可以重写它们的方法(例如,您可以返回所有大写字符串等)
    • 它们实现的接口可以像签入一样签入 myfunc( SplDoublyLinkedList $var ) ...
    • 默认情况下,它们作为引用传递
    • 等。

    其次, SplDoubleLink列表 接受迭代模式,这样您就可以在移动中删除项目,并在不重新排序数组或使代码复杂化的情况下切换方向:

    SplDoubleLinkedList:: 伊塔莫迪里沃 (堆栈式)

    SplDoubleLinkedList:: 伊斯莫迪法夫 (队列样式)的行为 迭代器(一个或另一个)

    SplDoubleLinkedList:: 删除删除 (元素被删除 迭代器)

    SplDoubleLinkedList:: 伊特莫迪保 (元素被 迭代器)

    以上报价来自 http://simpletechinfo.com/SplDoublyLinkedList 其中包含一些代码示例。

    还有其他的好处(比如foreach不必在内存中复制所有数据等)

        4
  •  0
  •   Fge    15 年前

    它们之所以存在,是因为许多混合了其他语言的程序员习惯于数组大小固定的情况,而您必须注意内存管理。
    所以对于PHP来说,它们只是另一个工具。它们之所以被实现,是因为许多算法和模式在列表上进行传递,因此不需要将它们更改为PHP数组。

        5
  •  0
  •   CrizNap    14 年前

    正如其他人提到的,列表是其他语言中常见的固定数组的替代方法。但一个经常被忽视的重要方面是,您可以非常有效地从列表中的任何位置插入或删除元素。

    为什么这很重要?假设您有几个要在一个数组中保持排序的项目,也许这样您就不必稍后对它们进行排序,或者只是为了最小化搜索时间。在这种情况下,列表是一个非常强大的工具。尤其是对于非常大的数据集。

        6
  •  0
  •   user23013    11 年前

    你可能是对的,只是不太有用。

    理论上,链表有很多用途(尤其是跳舞链表)。但其中大多数涉及到在其他地方存储和克隆迭代器、从两个以上的方向访问内容,或者拆分和合并列表。spldubleLinkedList似乎没有这些。

    如果不适用于算法,一种用法是允许对象在某个列表中以恒定的时间删除其自身的引用,释放其内存,并且在插入或删除后不必改变列表的顺序(通过散列或与最后一项交换)。但这需要在这些对象中存储列表的迭代器。

    如果没有这些功能,它们的行为就像两个Deques。如果只需要使用迭代器访问项,它们就像两个堆栈。在单线程简单情况下,一个更好的方法是使用两个堆栈(可能是固定数组,也可能是同一数组的两端)。每当您希望迭代器移动时,从一个堆栈中弹出并将其推送到另一个堆栈,并且一个堆栈的顶部是当前项。如果您还需要访问头部和尾部,您需要用Deques替换堆栈。

    但是,如果您想在不知道最大大小的情况下实现栈或deques本身,或者甚至想分配普通链表的节点(在没有这些库的语言中,比如在PHP中),好的方法是使用没有这些功能的双链表将一些固定数组链接在一起。不知怎么的,你仍然需要它。

    PHP文档本身,就像Java语言一样,表明它们应该只是一个支持一些奇怪的特性的DeQueD,而不是两个DeGuy(我想)。如果你真的需要双重链接列表,不要使用它们。

    推荐文章