![]() |
1
31
一些例子。它们之所以含糊不清,是因为它们是为雇主工作的:
了解数据结构中的内容很方便——“在实验室呆上几周可以节省你在图书馆的时间”。BloomFilter的案例之所以值得,只是因为它的规模:如果问题是在一家初创公司而不是雅虎出现的,我会使用一个简单的旧哈希表。我认为其他例子在任何地方都是合理的(尽管现在你不太可能自己编写它们)。 |
![]() |
2
12
B-trees 都在数据库中。 deques 表格的 C++ STL 是可增长的向量(比链表内存效率更高,在中间“窥视”任意元素的时间恒定)。就我所记得的,我从来没有充分使用过DeQuin(从两端插入/删除),但一般来说,您可以使用它作为一个堆栈(从一端插入/删除)或队列(插入到一端,从另一个删除),并且还具有高性能的访问以查看中间的任意元素。 我刚读完 Java Generics and Collections --“仿制药”部分伤了我的头,但收藏部分很有用;他们指出了跳过列表和树(两者都可以实现映射/集)之间的一些区别:跳过列表为您提供了从一个元素到下一个元素的内置恒定时间迭代(树是O(logn))并且在多线程情况下实现无锁算法要简单得多。 优先级队列用于调度和其他事情(这里是一个 webpage |
![]() |
3
8
它们经常在图书馆的后台使用。例如,有序字典数据结构(即 associative array red-black tree. 许多数据结构( splay trees temporal locality of reference 在八字树的情况下),因此它们主要用于这些情况。在大多数情况下,了解这些数据结构的实际好处是能够在正确的环境中使用它们,并合理地理解它们的行为。 以排序为例:
|
![]() |
4
4
这取决于您工作的抽象级别。
|
![]() |
5
3
|
![]() |
6
2
我想你会看到很多高级算法都使用了奇特的数据结构。我想到的主要示例是*它使用一个图和一个由堆实现的优先级队列。 |
![]() |
7
2
在金融学中,您需要使用树来计算依赖于许多其他动态值的工具的价值。电子表格也有类似的依赖关系树,编译器在转换为机器代码之前会创建一个抽象语法树。 |
![]() |
8
2
Fibonacci heaps 用于高效地实现 Dijkstra's algorithm . |
![]() |
9
1
是的,有时。我所看到的问题是,许多人虽然知道它们,但他们不知道如何真正应用它们。大多数人会返回到数组、链表等。在大多数情况下,他们会将工作作为更高级的数据结构来完成(有时你真的必须“踢”进去),但效率较低。人们倾向于做对他们来说比较容易的事情,但这不一定是做事情的最佳方式。我不能指责他们,我肯定我也这样做,但这就是为什么在编程中你们看不到很多“高级”概念的原因。 |
![]() |
10
0
但我发现,当我使用更高级的语言时,我不会费心以这种方式实现队列,因为我可以动态地增加和缩小列表,而不用太担心它。当然,这是要付出性能代价的,因为我对内存分配的时间控制较少,但这是我们能够拥有非常灵活的列表所付出的代价之一。 |
![]() |
11
0
当数据结构由代码的需求决定时,您将倾向于看到更复杂的数据结构。通常,当您在较低级别处理更复杂的代码时,我会看到这一点,即在核心操作系统中,编写类库的基本部分(实现字符串、数组等),编写外部性能或多线程代码等。我认为它们在实现特定算法方面发挥着重要作用,搜索、采样、统计分析、优化等算法在编写时往往考虑到特定的数据结构。 |
![]() |
12
0
我经常使用集合、排序集合(始终保持其元素的排序顺序,并支持快速元素插入)和惰性列表。 |
![]() |
13
0
平衡树(红黑等)通常用于抽象数据类型的实现。 抽象数据类型的数量相对较少,例如
同样,集合看起来很像地图,但不需要值,只需要键。
你说的“字典”,可能是指地图或有序地图。 有些映射是无序的(通常作为散列实现)——这是有序映射的有用子集。 |
![]() |
14
0
循环清单 用于缓存。
C++类模板提供了获取对象的接口(
因此,在始终从硬盘读取一组图像文件和将所有图像加载到RAM中并永久保存之间实现了一种折衷。折衷由各种缓冲区的长度控制。 |
![]() |
Eddiex045 · 比较两个文本文件,匹配项转到一个新文件 2 年前 |
![]() |
NOBUD · 最大堆插入函数实现C++ 2 年前 |
![]() |
riasc · 嵌套贴图结构创建空贴图 7 年前 |
![]() |
Akshay Barpute · cpp中的以下链表程序有什么问题? 7 年前 |
![]() |
Batwoman05 · C++中是否有具有类似函数的树集数据结构 7 年前 |