【问题标题】:Is it worth creating a LinkedList in Java Script是否值得在 Javascript 中创建链接列表
【发布时间】:2014-04-12 09:10:46
【问题描述】:

我目前正在开展一个项目,该项目需要我遍历值列表并在列表中已有的每个值之间添加一个新值。每次迭代都会发生这种情况,因此列表将呈指数增长。我决定将列表实现为链接列表将是一个好主意。现在,JS 没有默认的 Linked List 数据结构,我创建一个也没问题。

但我的问题是,从头开始创建一个简单的链接列表是否值得,还是只创建一个数组并使用 splice() 插入每个元素会更好?事实上,是否会因为开销而降低效率?

【问题讨论】:

  • 取决于元素的数量。对于少数元素,数组方法更快,对于很多元素,链表方法更快。无论如何,链表会消耗更多的内存。你只需要尝试一下。

标签: javascript arrays performance memory-management linked-list


【解决方案1】:

Javascript 是一种解释型语言。如果你想实现一个链表,那么你会循环很多!口译员会执行得很慢。解释器提供的内置函数是用解释器优化和编译的,因此它们运行得更快。我会选择对数组进行切片,然后再次连接所有内容,它应该比实现自己的数据结构更快。

同样,javascript 通过值而不是指针/引用传递,那么您将如何实现链表?

【讨论】:

  • 这不是真的。 JS 通过引用传递大多数东西。
  • @T-Bull stackoverflow.com/questions/518000/… 不是大多数事情
  • 是的,大多数事情。虽然本质上,JS 是一种按值传递的语言,但您使用的大多数东西都是对象,而对象总是通过引用来处理。
  • 此外,JS 在这些事情上可能曾经很慢,但是对于现代 JIT 编译器,JS 实际上是最快的语言之一。正如 Esailija 所说,这个答案是完全错误的。
【解决方案2】:

使用链表,事实上,由于规范复杂性和良好的 JITting,大多数在用户 javascript 中做得好的自定义实现将击败内置实现。例如见https://github.com/petkaantonov/deque

乔治所说的话在每一点上都是 100% 错误的,除非你用时光机回到 10 年前。


在实现上,不要创建包含值的外部链表,而是使值成为自然链表节点。否则你会使用太多的内存。

【讨论】:

  • 你能扩展最后一部分吗?这是否意味着我应该使用包含数据的节点和对下一个节点的引用创建一个链接列表?还是您建议我将数据本身设为一个对下一个节点有额外引用的节点?或者您是在提出完全不同的建议?
  • @Dimi 我的意思是根本不制作外部“链表数据结构”。只需让您的值自然具有.next 属性(如果需要,还可以使用.prev)。如果您的值是单独链接的,您将使用与使用数组一样多的内存,因此可以节省大量资金。
  • 我不明白这一点:为什么我们允许自己将 .next 和 .prev 属性放在链表中的对象上?没有存储属性没有更好的方法吗?
【解决方案3】:

使用splice() 插入每个元素确实会更慢(插入 n 个元素需要 O(n²) 时间)。但是简单地构建一个新数组(追加新值并同步追加旧数组中的值)并丢弃旧数组需要线性时间,并且很可能比操作链表具有更好的常数因子。它甚至可能占用更少的内存(链表节点的空间开销可能大得惊人,尤其是在它们不具有侵入性的情况下)。

【讨论】:

  • 这是一个有趣的解决方案。我会检查一下。要“扔掉”旧数组,我是否必须弹出所有项目?还是我可以将其设置为空?我不太确定在 Java Script 中是如何处理内存管理的。
  • @Dimi 你可以弹出所有项目,但只覆盖用于引用它的变量(即the_array = new_array;)可能更有效。 “将其设置为 null”只是“覆盖变量”的一种特定情况,它并没有什么特别之处,尤其是如果您随后继续在变量中存储另一个东西(例如新数组)。
猜你喜欢
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多