【问题标题】:Why would I ever use a DoublyLinkedList in PHP?为什么我会在 PHP 中使用 DoubleLinkedList?
【发布时间】:2010-12-31 19:13:06
【问题描述】:

我最近遇到了一些 PHP-SPL 数据结构,我一直在研究第一个,the doubly linked list。我大概知道什么是链表,现在我可以看到什么是双向链表,但我的问题是:我到底该怎么处理这个?

我似乎使用数组同样容易。一些计算机科学类型可以启发我吗?

【问题讨论】:

  • 我完全同意你的怀疑。

标签: php data-structures


【解决方案1】:

与单链表不同,双向链表可以沿任一方向遍历链表,并在 O(1) 的时间内在链表中间进行对象插入和删除(前提是您已经可以访问链表中的点)与单链表不同,它将发生在哪里。也就是说,双链表在其他方面较差,而且在实践中绝对不会经常遇到。

【讨论】:

  • 它们在某些情况和某些算法中有其用途。它们在 PHP 中不太重要,因为数组是非常动态的。在其他语言中,数组的大小在声明时是固定的,那么链表,无论是否双向链接,都可能更适合解决方案。在这些语言中调整数组大小的成本有时可能远高于链表的开销。
  • SPL 实现似乎不允许在列表中间插入 - 尽管如果它允许我可以看到值。
【解决方案2】:

选择合适的数据结构并不一定是什么对你来说容易,而是什么使用更少的内存并且对机器来说更快。在双向链表的情况下,当您需要在任一方向迭代、以恒定速度插入任何位置但不需要随机访问时,它会很有用。

现在鉴于在 PHP 中您通常使用小型数据集,您不必太担心这类事情。而且,如果您正在处理大型数据集,最好用 C 编写代码。因此,您不太可能从 PHP 中的此类结构中受益到需要使用它们的程度。

但可能存在“介于两者之间”的区域,在该区域中,使用其中一种 Spl 数据结构确实会降低内存使用量,足以使其值得使用。 (我做了一个简单的测试,一个数组中的 1M 个整数需要 200MB。双链表需要 150MB。迭代它们的时间非常可比。)

【讨论】:

    【解决方案3】:

    恕我直言,在野外遇到这样的事情的可能性不大,除非您在像 Google 或 Facebook 这样的公司工作,他们正在处理大量数据并且有需求 优化列表遍历以允许删除和添加节点。根据经验,如果您的应用程序那么很慢,那么您很可能在其他地方做错了(我知道这不是您的问题,但我想我会把它扔进去;)) .

    对于具有中小型数据需求的中小型网站,我会说一个数组就足够了(更不用说普通 Web 开发人员更具可读性和可理解性了 ;))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2017-12-12
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多