What are the complicated data structures you should have heard of?
这是一个衍生的问题,但我想问的是数据结构,你至少应该熟悉它们的有用性。然而,如果没有专业知识,这些结构很难实现。
我要说的是,两者之间的一个好边界是一个堆——您应该能够对一个堆进行编码,但这将花费您一天的时间。不适合这样做的将是一个BST,等等。编辑:我看到这一点,它取决于你在做什么。我觉得有一个列表,上面有一个总结为什么要使用它的短语,会很棒!
以下是要开始的列表:
布隆过滤器
怎么办:
- 二项堆
- 第二十章 斐波纳契堆
- 不相交集数据结构
- 八字树
指状树
范艾德博阿斯树。我不认为你"应该"听说过它们,但我相信它们是一个有趣的例子,说明你可以用"比特技巧"实现什么样的复杂性——即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经常做得很好)。棘手的部分通常是在更新过程中维护一个好的树。
我会将哈希表添加到列表中。它们在概念上相当简单,但一旦您了解如何实现一个好的散列函数和有效的探测方法,它们就可能非常复杂。