【问题标题】:Looping vs Indexing循环与索引
【发布时间】:2020-03-02 16:13:28
【问题描述】:

假设我有一个包含 100 个元素的链接列表。

struct node{
int data;
node*next;
}

我想访问 n 位置的一些元素,所以我必须做一个循环。如果我不遍历该链接列表,而是在获取输入/读取数据时将其数据元素存储在一个数组中,并且当我想在 n pos 处输出任何元素时,我可以调用 arr[n] 这样它是否更有效方法还是我应该使用循环。

【问题讨论】:

  • 对于效率估计(时间),您需要计算程序应为操作执行的步骤数。对于arr[n],它可能是 1,对于循环,它将是 n 步骤。请参考大O符号。
  • 为什么不改用std::vector?或者,如果您坚持链接列表(但为什么?),那么至少使用std::list,不要自己滚动。

标签: c++ arrays performance linked-list


【解决方案1】:

C++ 语言的美妙之处在于它提供了广泛的“容器类”选择,您可以“简单地使用”。因此您真的不需要为滚动而烦恼你自己的链表。 ("不要做已经做过的事...")

此外,这些容器类中的许多都提供“[array index]”功能,以便您可以将内容作为有序集合引用,就好像它是一个传统的“数组, “尽管实际上并非如此。它们还可能提供其他选项,例如通过某种键检索元素。

只需浏览在您的特定 C++ 实现中可用的一组容器类,并“立即”获取最适合您需求的容器类。无需实施。您只知道它们确实有效,而且您真的不必关心它们是如何工作的。

【讨论】:

  • 这是标准库提供的所有容器中的a list
【解决方案2】:

如果您经常需要访问某些位置的元素,那么数组通常会更快,是的。如果您只需要执行一次,则可以坚持使用现有的节点结构并循环遍历它。要查找某个位置的元素,可以在 O(1) 的数组中进行,在 O(n) 的链表中进行。

链表提供了其他优点,例如常量时间插入,这是数组所没有的。除非您更准确地指定您的问题,否则我们无法告诉您哪种数据结构更可取。

编辑:有关列表与数组用例的更多信息,请参阅Array versus linked-list

【讨论】:

  • 恒定时间任意位置插入到链表中是一个陷阱,因为它通常需要首先找到一个指向要插入的位置的迭代器,这不是恒定时间。
  • 我不同意链接问题中答案的每一点。我不明白它怎么会如此受欢迎。
  • 扩展@FrançoisAndrieux 的第一条评论;不仅在链表中找到插入点不是恒定时间,而且通常非常昂贵,因为它涉及在整个内存中追逐指针,这通常会导致一堆缓存未命中。插入时在向量中复制线性内存块通常最终会更快。
  • list 最重要的属性(和使用理由)是恕我直言,只要元素在列表中,迭代器和引用就永远不会失效。如果您需要,除了列表之外别无选择。
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2010-12-06
  • 1970-01-01
  • 2016-06-01
  • 2012-09-27
相关资源
最近更新 更多