现代数据结构

时间:2012-03-11 11:37:08

标签: data-structures

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

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

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

我理解使用普通的旧链表如果你必须实现它并且更喜欢简单,但是拥有庞大的STL和成堆的第三方库,如 Guava 或< em> Boost ,为什么我仍然把锁放在哈希周围?

难道我们不具备潜在的标准,经过充分验证的现代数据结构,这些结构实际上可以替换可靠的老年人吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

锁定是一项可能很昂贵的操作,因此如果可以,您应该一次锁定多个结构以优化代码。即锁定关键部分而不是数据结构。如果直接向数据结构添加锁定,则无法以这种方式进行优化。此外,这将引入您可能不需要的隐式同步点和canot控制。

这不能回答您问题的不同方面。 “为什么我们需要锁定”的部分。答案是,有时候没有办法绕过它。你需要在某个地方拥有锁,完全依赖原子操作或完全禁止变异。

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

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

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