这个问题的根源来自我与业内其他开发人员的讨论。
事实证明,在很多地方,项目经理对复杂的数据结构保持警惕,并且通常坚持使用标准库/软件包中的现成的东西。一般的想法似乎是使用已经可用的东西的组合,除非严重阻碍性能。这有助于使代码库保持简单,对于非外交人员来说,这意味着“我们的人员流失率很高,而我们雇用的新员工可能并不那么好”。
因此,没有CS迷使用Bloom过滤器,跳过列表或展开树。因此,这又是一个问题:您在办公室使用或使用过的最复杂的数据结构是什么?
帮助您了解现实世界中软件的质量/复杂程度。
这个问题的根源来自我与业内其他开发人员的讨论。
事实证明,在很多地方,项目经理对复杂的数据结构保持警惕,并且通常坚持使用标准库/软件包中的现成的东西。一般的想法似乎是使用已经可用的东西的组合,除非严重阻碍性能。这有助于使代码库保持简单,对于非外交人员来说,这意味着“我们的人员流失率很高,而我们雇用的新员工可能并不那么好”。
因此,没有CS迷使用Bloom过滤器,跳过列表或展开树。因此,这又是一个问题:您在办公室使用或使用过的最复杂的数据结构是什么?
帮助您了解现实世界中软件的质量/复杂程度。
Answers:
我在工作中使用的最复杂的数据结构是特里。但是,那是二十年前。
工业软件开发的问题在于,大多数工业程序员都不是计算机科学(CompSci)毕业生。因此,一般的CompSci毕业生认为理所当然的技术对于面包和黄油的程序员来说太难维护了。
业界缺乏CompSci的一般知识是一个严重的问题。例如,我丢失了我遇到的不理解诸如!(a!= 5 && b!= 3)和a == 5 ||之类的表达式的软件开发人员的数量。b == 3在逻辑上相等。任何知道如何应用DeMorgan定理的人都可以认识到这些表达式在逻辑上是等效的。大多数非CompSci毕业生从未听说过德摩根定理。如果调查任何实质性的代码库,就会发现许多否定负子表达式的表达式。包含否定负逻辑子表达式的代码的可读性几乎总是可以通过将这些表达式转换为非否定形式来提高。
没有真正使用过什么特别的东西,从头开始,它会是一个双向链接的列表。
不太令人兴奋,我使用了其他结构。但是你的问题是从零开始的。
std::list实际上并没有什么复杂的:/我发现红黑树/ AVL树要复杂得多,而且要满足所有这些重新平衡的条件!
考虑到这一点,我从头开始完成的最“复杂”的数据结构是对基于双向链接列表的元素网络进行建模。但是那是几年前,当时我曾经做系统级编程。
这些天,我几乎没有创建任何奇特的数据结构。大多数情况发生在数据库中,您可以在其中决定要放入表中的内容,也许是一些预先计算的值,也可能是一些相关记录的ID,以便快速检索以避免不必要的查找。
我个人认为眼前的任务定义了手段。如果没有用处,为什么还要努力使用一些外来的数据结构呢?而且,如果我可以说在大多数实际的应用程序编程中,可能不需要重新发明轮子。
优先级队列计数吗?这几乎在我编写的每个实时应用程序中都会出现。它只是最近才成为标准Java库的一部分(Java 1.5)。
除此之外,我想不出我真正想要的任何复杂的东西,因为我没有能够退出图书馆。我不会阻止我前进,但是我会质疑为什么我需要一个太奇特的数据结构而无法包含这些库。在尝试自己编写一个脚本之前,我肯定会寻找一个Trie或Bloom过滤器或跳过列表的现有开源实现。
总的来说,我同意您的经理的观点,即构建和维护自定义数据结构的成本过于深奥,以至于没有任何库版本可能会超过从中获得的任何性能收益。我希望您通过概要分析表明普通的库结构在导致性能显着下降之前,让我继续进行一些幻想。因为通常来说,购买处理器周期要比设计周期便宜。