在实际情况下,您使用的最复杂的数据结构是什么?[关闭]


17

这个问题的根源来自我与业内其他开发人员的讨论。

事实证明,在很多地方,项目经理对复杂的数据结构保持警惕,并且通常坚持使用标准库/软件包中的现成的东西。一般的想法似乎是使用已经可用的东西的组合,除非严重阻碍性能。这有助于使代码库保持简单,对于非外交人员来说,这意味着“我们的人员流失率很高,而我们雇用的新员工可能并不那么好”。

因此,没有CS迷使用Bloom过滤器,跳过列表或展开树。因此,这又是一个问题:您在办公室使用或使用过的最复杂的数据结构是什么?

帮助您了解现实世界中软件的质量/复杂程度。


是别人写的,还是我们自己写的?

我最初的意图是自己开发的东西,但我认为这为问题增加了一个有趣的方面。编辑原始问题。
Fanatic23 2011年

使它复杂并不意味着它很复杂。更简单=总是更好。
tp1 2012年

最复杂的总是可以从STL获得。复杂性通常来自嵌套数据结构,而不是其类型。简单的结构=好的,除非探查器抱怨。
编码员

-1用于不需要的价值评估。我可以说很多:在这些日子里,如果您自己实现数据结构,那么您将变得愚蠢而固执。不要成为认为自己可以用错误的方式实现数据结构的下一个聪明孩子。
Pieter B

Answers:


7

已使用跳过列表进行查找。在我工作的地方,有一个标准的实现,鼓励每个人都使用它。已使用patricia尝试有效地存储和检索ip地址。实施已经存在。


7

我是Java开发人员。Java Collection Framework可以解决我90%的数据结构问题,其他10%确实需要努力。我认为,如果您真的了解专家编写的复杂标准库,则在大多数情况下它们会提供帮助。

复杂的数据结构在现实世界中很难维护。为了避免弄乱代码,我将麻烦分为一些较小的麻烦。每个小问题都可以通过Java Collection Framework解决。也许该解决方案不是最聪明的(它需要更多的内存并需要更慢的速度),但它可行且易于维护。权衡。

如果我必须编写复杂的数据结构,我将拿起教科书:)


4

我在工作中使用的最复杂的数据结构是特里。但是,那是二十年前。

工业软件开发的问题在于,大多数工业程序员都不是计算机科学(CompSci)毕业生。因此,一般的CompSci毕业生认为理所当然的技术对于面包和黄油的程序员来说太难维护了。

业界缺乏CompSci的一般知识是一个严重的问题。例如,我丢失了我遇到的不理解诸如!(a!= 5 && b!= 3)和a == 5 ||之类的表达式的软件开发人员的数量。b == 3在逻辑上相等。任何知道如何应用DeMorgan定理的人都可以认识到这些表达式在逻辑上是等效的。大多数非CompSci毕业生从未听说过德摩根定理。如果调查任何实质性的代码库,就会发现许多否定负子表达式的表达式。包含否定负逻辑子表达式的代码的可读性几乎总是可以通过将这些表达式转换为非否定形式来提高。


5
我对任何投反对票的人的建议是,应该增加一条评论,说明为什么投反对票。我可以处理有不同意见的人。但是,我无法应付的是怯ward。
bit-twiddler 2011年

2
@ bit-twiddler我从哲学角度学习了德摩根定理。现在我正在做CS,但尚未提及。不过,老实说,我认为这类事情是经验带来的最好速记。在分解方程式时,您真的需要记住您使用的规则(以及名字!)吗?我不了解您,但我会根据自己面前的情况而不是死记硬背来解决问题。修改逻辑表达式也是如此。
Rupert Madden-Abbott

2
@鲁珀特:德摩根定理通常涵盖在离散数学和计算机组织中(两者都是美国的本科课程)。我主要研究计算机体系结构/系统软件。德摩根定理在数字逻辑设计中大量使用。在低级软件开发中,了解De Morgan定理变得至关重要。例如,最少的指令集计算机不包含完整的布尔指令集。因此,一个人必须能够从另一个布尔运算中导出一个布尔运算。
bit-twiddler 2011年

1
(续)这是大多数非计算机科学/计算机工程/电气工程(计算机工程专业)应届毕业生的测试,要么完全失败,要么需要很长时间来回答。仅给定NAND(负)运算,请得出以下布尔运算:NOT,AND,OR,NOR,XOR和XNOR。了解德摩根定理会使推导这六个布尔运算变得更加容易。德摩根定理很容易成为数字逻辑设计中最重要的定理。
bit-twiddler 2011年

1
.....虽然很公平,但在这个行业中,很多工作都是为一些小型企业编写半确定的RoR应用程序,在1000000000中可能有大约1倍的时间,您甚至需要听取逻辑门和布尔代数的概念,而不仅仅是知道英语单词“ or”和“ and”的含义。不是说这些事情与您是否正在执行CS工作,复杂的算法,优化或低级编程无关,而是对于大多数从事程序员工作的人来说,这是无用的琐事。
萨拉

2

我曾经为基于事件的仿真编写了一个日历队列(O(1)优先级队列),其中分析表明现有堆是瓶颈。

我还发布了一个产品,其中包含一个具有约80000个状态的有限状态机-至少可以说,生成该状态机的代码有点儿麻烦。


2

很久很久以前,在一个星系中……在一个使用Knuth的“伙伴缓冲区”在汇编器中的RTOS中工作的团队。

此外,康威(Conway)的256代游戏,拥有1024 x 1024的世界。


1

没有真正使用过什么特别的东西,从头开始,它会是一个双向链接的列表

不太令人兴奋,我使用了其他结构。但是你的问题是从零开始的。


在C ++中,std::list实际上并没有什么复杂的:/我发现红黑树/ AVL树要复杂得多,而且要满足所有这些重新平衡的条件!
Matthieu M.

@Mathieu std :: map,您很可能会得到一棵rb树。
2011年

1

包含通用财务数据列表的哈希表树-甚至都不问。有时我希望我是一个牛仔。啊,星空下的简单生活...


摘下 “亲爱的上帝” 眼镜
Len Joseph

1

我必须从头开始为Sudoku求解器的“ 跳舞链接算法”编写一个循环双链表结构。感觉就像设计一个魔方。整个结构基本上是一个列表列表,每个节点都指向另外四个节点。


1
对于Sudoku求解器来说,这听起来像是过大的杀伤力,因为强力回溯算法可以比输入数据更快地解决难题。
cline)

3
@kevin,跳舞链接是一种蛮力的回溯算法-但具有合理的启发性。
彼得·泰勒

如果要进行诸如枚举解决方案总数并断言Sudoku只有1个唯一解决方案之类的事情,则需要启发式。
ProdigySim 2011年

1

我曾经使用加权路径长度树作为专用缓存。那很有趣。还写了我自己的堆管理例程进行malloc()替换,但是很多人都这样做了。


0

考虑到这一点,我从头开始完成的最“复杂”的数据结构是对基于双向链接列表的元素网络进行建模。但是那是几年前,当时我曾经做系统级编程。

这些天,我几乎没有创建任何奇特的数据结构。大多数情况发生在数据库中,您可以在其中决定要放入表中的内容,也许是一些预先计算的值,也可能是一些相关记录的ID,以便快速检索以避免不必要的查找。

我个人认为眼前的任务定义了手段。如果没有用处,为什么还要努力使用一些外来的数据结构呢?而且,如果我可以说在大多数实际的应用程序编程中,可能不需要重新发明轮子。


我的目的不是要强加一些异国情调的数据结构。但是,当您需要开箱即用的东西并且必须要处理由于公司政策要求而必须处理的所有现有信息时,这是一种可悲的情况。
Fanatic23 2011年

0

优先级队列计数吗?这几乎在我编写的每个实时应用程序中都会出现。它只是最近才成为标准Java库的一部分(Java 1.5)。

除此之外,我想不出我真正想要的任何复杂的东西,因为我没有能够退出图书馆。我不会阻止我前进,但是我会质疑为什么我需要一个太奇特的数据结构而无法包含这些库。在尝试自己编写一个脚本之前,我肯定会寻找一个Trie或Bloom过滤器或跳过列表的现有开源实现。

总的来说,我同意您的经理的观点,即构建和维护自定义数据结构的成本过于深奥,以至于没有任何库版本可能会超过从中获得的任何性能收益。我希望您通过概要分析表明普通的库结构在导致性能显着下降之前,让我继续进行一些幻想。因为通常来说,购买处理器周期要比设计周期便宜。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.