关于性能:您应该听说过哪些复杂的数据结构?

What are the complicated data structures you should have heard of?

这是一个衍生的问题,但我想问的是数据结构,你至少应该熟悉它们的有用性。然而,如果没有专业知识,这些结构很难实现。

我要说的是,两者之间的一个好边界是一个堆——您应该能够对一个堆进行编码,但这将花费您一天的时间。不适合这样做的将是一个BST,等等。编辑:我看到这一点,它取决于你在做什么。我觉得有一个列表,上面有一个总结为什么要使用它的短语,会很棒!

以下是要开始的列表:

  • B+树:在单个键上具有良好的通用索引结构
  • K-D树:空间数据
  • 红黑树:自平衡BST;也可以是AVL树或八字树。
  • 跳过列表:随机或(伪)顺序访问的良好混合结构
  • 线性时间字符串搜索

  • 布隆过滤器


    怎么办:

    • 二项堆
    • 第二十章 斐波纳契堆
    • 不相交集数据结构
    • 八字树


    指状树


    范艾德博阿斯树。我不认为你"应该"听说过它们,但我相信它们是一个有趣的例子,说明你可以用"比特技巧"实现什么样的复杂性——即O(对数n),指数级地比二进制树好!


    引用Martin Kay:

    Suffix trees constitute a well
    understood, extremely elegant, but
    regrettably poorly appreciated data
    structure with potentially many
    applications (...)

    另请参见:什么是鲜为人知但很酷的数据结构?


    这是一个好的开始;维基百科上有一个全面的数据结构列表,其中一些应该被检查。但至于你需要哪一个,这取决于你打算去的地区…不管你在做什么。

    嵌入式系统人员将有非常不同的想法,从网络人员谁将强烈反对业务逻辑的家伙。弄清楚你想做什么;语言和平台也会影响到你需要的列表。


    确定性有限自动机(dfas)或有限状态机,可用于表示许多事物,如基本词法、正则表达式、状态转换等。另请参阅相关的有向非循环字图,它可用于紧凑地存储字典。


    布谷鸟散列,一种简单而优雅的方法,在预期的恒定时间内解决散列表冲突。


    二元决策图,特别是降阶二元决策图(robdd)。当有人决定创建自己的过滤系统时,它们会被重新设计(很糟糕)。


    与您提到的B+树密切相关:B*树。除了一种称为"跳舞树"的平衡方法,这些方法构成了Reiser4的基础。


    R树


    您可以尝试:

    • Y-快速树
    • 近似有序集
    • 选择堆
    • 紧凑型阵列
    • 单片列表
    • 简洁的列表

    R-树及其变种,如R*树、X-树、金字塔树。各种M树变种,如苗木。

    通常,查询树很容易。也可能有一个简单的批量加载(对于R-树,str经常做得很好)。棘手的部分通常是在更新过程中维护一个好的树。


    我会将哈希表添加到列表中。它们在概念上相当简单,但一旦您了解如何实现一个好的散列函数和有效的探测方法,它们就可能非常复杂。