Data structures 实践中的高级数据结构

Data structures 实践中的高级数据结构,data-structures,Data Structures,在我10年的编程生涯中,我一方面可以计算出我使用过的数据结构的数量:数组、链表(我将堆栈和队列与此合并)和字典。考虑到我编写的几乎所有应用程序都属于forms over data/CRUD类别,这并不奇怪 我从来不需要使用红黑树、跳过列表、双端队列、循环链表、优先级队列、堆、图或过去50年研究过的几十种奇异数据结构中的任何一种。我觉得我错过了 这是一个开放性的问题,但在实践中,这些“异国情调”的数据结构在哪里使用?有人有使用这些数据结构解决特定问题的实际经验吗?这取决于您工作的抽象级别 我知道我

在我10年的编程生涯中,我一方面可以计算出我使用过的数据结构的数量:数组、链表(我将堆栈和队列与此合并)和字典。考虑到我编写的几乎所有应用程序都属于forms over data/CRUD类别,这并不奇怪

我从来不需要使用红黑树、跳过列表、双端队列、循环链表、优先级队列、堆、图或过去50年研究过的几十种奇异数据结构中的任何一种。我觉得我错过了


这是一个开放性的问题,但在实践中,这些“异国情调”的数据结构在哪里使用?有人有使用这些数据结构解决特定问题的实际经验吗?

这取决于您工作的抽象级别

我知道我和你有相似的经历。在大多数软件开发的当前抽象级别。字典和列表是我们使用的主要数据结构


我认为,如果你往下看底层代码,你会看到更多的“奇异”数据结构。

它们通常在库的后台使用。例如,一个有序的字典数据结构(即一个按键排序的遍历)很可能不使用

许多数据结构(想到这里)在某些情况下(在splay树的情况下)的最佳行为非常有趣,因此它们主要与这些情况下的使用相关。在大多数情况下,了解这些数据结构的实际好处是能够在正确的环境中使用它们,并合理地理解它们的行为

以排序为例:

  • 在大多数情况下 或者修改后的快速排序 当 单个片段变得足够小 通常是最快的排序 用于大多数目的的算法。 然而,快速排序往往会显示 上的次优行为 几乎分类的数据

  • a的主要优点是它可以在 具有最小中间产物的原位 存储,这使它非常好 在内存受限的情况下使用 系统。虽然速度较慢 平均而言(尽管仍为n log(n)), 它不受影响 从最差的情况下的表现 快速排序

  • 第三个例子是A,可以这样做 按顺序,让它成为最好的 排序数据集的选择很多 比主内存大。 这个的另一个名字是 “外部排序”,意思是您可以 使用外部存储器(磁盘或磁盘)进行排序 磁带)用于中间结果

    • 在数据库中

      用于地理搜索(例如,如果我有10000个形状,每个形状的边界框散布在二维平面上,这些形状中的哪一个与任意边界框B相交?)

      表中的形式是可增长的向量(比链表更高效的内存,以及在中间“窥视”任意元素的恒定时间)。就我所记得的,我从来没有充分使用过DeQuin(从两端插入/删除),但一般来说,它可以用作堆栈(从一端插入/删除)或队列(插入到另一端,从另一个删除),也可以高性能访问中间的任意元素。

      我刚刚读完——“泛型”部分伤了我的头,但集合部分很有用&它们指出了跳过列表和树(两者都可以实现映射/集)之间的一些区别:跳过列表提供了从一个元素到下一个元素的内置恒定时间迭代(树是O(logn))对于在多线程情况下实现无锁算法来说,和要简单得多


      优先级队列用于调度(这里有一个简单讨论应用程序的示例);堆通常用于实现它们。我还发现heapsort(至少对我来说)是最容易理解和实现的O(n logn)类。我所看到的问题是,许多人虽然知道它们,但他们不知道如何真正应用它们。大多数人会返回到数组、链表等。在大多数情况下,他们会将工作作为更高级的数据结构来完成(有时你真的必须“踢”进去),但效率较低。人们倾向于做对他们来说比较容易的事情,但这不一定是做事情的最佳方式。我不能指责他们,我肯定我也这样做,但这就是为什么在编程中你们看不到很多“高级”概念的原因


      我使用循环链表来实现我将永远迭代的队列(在C中),即网络连接队列


      但我发现,当我使用更高级的语言时,我不会费心以这种方式实现队列,因为我可以动态地增加和缩小列表,而不用太担心它。当然,这是要付出性能代价的,因为我对内存分配的时间没有太多的控制权,但这是我们为能够拥有非常灵活的列表而付出的代价之一。

      当它由代码的需要决定时,您将倾向于看到更复杂的数据结构。通常,当您在较低级别处理更复杂的代码时,我会看到这一点,即在核心操作系统中,编写类库的基本部分(实现字符串、数组等),编写外部性能或多线程代码等。我认为它们在实现特定算法方面发挥着重要作用,搜索、采样、统计分析、优化等算法通常在编写时会考虑到特定的数据结构。

      我经常使用集合、排序集合(始终保持其元素的排序顺序,并支持快速元素插入)和惰性列表。

      我想你会看到大多数高级算法使用的奇特数据结构。主要例子