【问题标题】:Modern data structures现代数据结构
【发布时间】:2012-03-11 11:37:08
【问题描述】:

我刚刚意识到我经常使用的所有数据结构都非常古老而且非常简单。链表、哈希表、树,甚至更复杂的变体,如 VLists 或 RBTrees 都是相当古老的发明。

其中大多数是为串行、单 CPU 世界而设计的,需要适应在并行环境中工作。

我们有哪些更新、更好的数据结构?为什么它们没有被广泛使用?

如果您必须实现并喜欢简单的简单旧链表,我理解使用简单的旧链表,但有大量的 STL 和大量第三方库,如 Guava 或 Boost,为什么我还在散列周围加锁?

难道我们没有潜在的标准、经过严格验证的现代数据结构,可以真正替换值得信赖的老前辈吗?

【问题讨论】:

  • 因为旧的没毛病?如果它没有坏,就不要修理它吗?
  • Z80 也没有错误。幸运的是,它被“修复”了。
  • 您对新数据结构的期望是什么?例如,同步是一个实现细节,它本身不是数据结构的一部分。此外,纯函数式数据结构不需要锁,因为它们不会发生变异。

标签: data-structures


【解决方案1】:

旧的没有错。保持灵活性的一个好方法是分离关注点。普通(旧式)数据结构关注数据的存储方式。锁定是一个完全不同的问题,它不应该是数据结构的一部分。

锁定是一项潜在的昂贵操作,因此如果可以,您应该一次锁定多个结构以优化您的代码。 IE。锁定关键部分而不是数据结构。如果您直接将锁定添加到您的数据结构中,您就不可能以这种方式进行优化。此外,这将引入隐式同步点,您可能不希望也无法控制。

这并没有回答您问题的不同方面。 “为什么我们需要锁定”部分。答案是,有时没有办法绕过它。您要么需要在某处锁定,要么完全依赖原子操作,要么完全不允许突变。

正如我上面指出的,方法一是不可行的,因为你失去了优化的潜力并且你有隐含的同步点。

仅在您的数据结构(即非锁定结构)中使用原子操作仍然是一个开放的研究问题,并且可能并不总是可行。我知道一些非锁定结构,即队列、列表等,但我从未听说过非锁定树。此外,非锁定结构往往会变得更加复杂和缓慢,因此我们仍然需要一些更好的线程本地数据结构,并且只能将这些添加到我们的数据结构动物园中。

在我看来,完全没有可变数据结构是最好的方法。可变性往往比它的价值更麻烦。然而,这是来自函数式编程的概念,只有在这样的环境中才有意义。然而,函数式编程被大多数程序员视为一个深奥的概念。大多数实际用于生产工作的语言主要使用非功能性概念(这并不意味着它实际上更复杂或更容易出错,它只是反映了开发人员当前的培训状态)。在我看来,函数式编程将变得更加广泛,一旦人们开始注意到它会在眨眼间自动解决他们的线程问题。其他几种语言现在已经在借鉴函数式语言,因此这可能是我们将发现数据结构的下一次演变的地方。

【讨论】:

  • -1 表示对 FP 的咆哮,以及不可变结构在它之外毫无意义的荒谬声明。
  • @larsmans:你在哪里看到对 FP 的咆哮?仔细阅读。我是 FP for FP 的大力支持者,所以你不会看到我对它的咆哮。我所说的是 FP 没有被广泛使用的事实。查看 TIOBE 以了解使用情况。 LISP 是第一个出现在 2012 年和 2011 年排名中的 FP 语言,排在第 15 位。Haskell、OCaml、Erlang、Clojure 只排在后面。大多数程序员不知道 FP 是如何工作的,大多数公司也不使用它。这是事实,但这与 FP 是否是个好主意的概念无关(我认为这是个好主意)。
  • @larsmans:我同意,不可变数据结构在 FP 之外很有用,但完全不同的问题。在我认识的程序员中,只有大约 10% 知道如何使用 FP。其中大多数来自python和其他采用它的语言,但并不纯粹。实际上只有大约 5% 的人可以在其中相处。取消可变性将使大多数程序员绝对无助,所以现在它只是一个坏主意。这不是对不变性的咆哮,而是对程序员的咆哮,他们从不关心他们领域之外的任何事情,他们中的大多数人。
【解决方案2】:

如果您想要无锁数据结构,请研究persistent data structures。这些在函数式编程世界中最流行,但也适用于其他领域。大多数持久性 DS 是普通列表、树等的变体,但最近几年出现了诸如 hash tries 等较新的 DS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多