今天算法类的主题是重新实现数据结构,特别是Java中的ArrayList。您可以通过各种方式自定义结构这一事实肯定让我感兴趣,尤其是add()&amp ;; iterator.remove()方法。
但是重新实现和定制数据结构对于学者和现实世界的程序员来说更有意义吗?有没有人在商业应用程序/程序中重新实现了他们自己的数据结构版本,为什么你选择了特定语言实现的路径呢?
答案 0 :(得分:4)
了解数据结构是如何实施和实施的,绝对是每个人都感兴趣的,而不仅仅是学者。虽然如果语言已经提供了具有适当功能和性能特征的实现,您很可能不会重新实现数据结构,但很可能您必须通过组合其他数据结构来创建自己的数据结构......或者您可能需要实现一种数据结构,其行为与众所周知的数据结构略有不同。在这种情况下,您当然需要知道原始数据结构是如何实现的。或者,您可能最终需要一个不存在的数据结构或者提供与现有数据结构类似的行为,但是它的使用方式要求它针对不同的一组函数进行优化。同样,这种情况需要你知道如何实现(和改变)数据结构,所以是有意义的。
修改的
我并不主张你重新实现现有的数据结构!不要那样做。我所说的是知识确实有实际应用。例如,您可能需要创建双向地图数据结构(可以通过组合两个单向地图数据结构来实现),或者您可能需要创建一个跟踪各种统计信息的堆栈(例如,min,max,通过使用现有的堆栈数据结构,其元素类型包含值以及这些各种统计信息。这些是您可能需要在现实世界中实现的一些微不足道的例子。
答案 1 :(得分:2)
我已经在很多场合重新实现了一些语言的内置数据结构,函数和类。作为嵌入式开发人员,我这样做的主要原因是速度或效率。标准库和类型被设计为在各种情况下都有用,但在很多情况下,我可以创建一个更专业的版本,可以自定义以利用我当前平台的功能和限制。如果该语言没有提供打开和修改现有类的方法(例如,你可以在Ruby中),那么重新实现类/函数/结构可能是唯一的方法。
例如,我使用的一个系统使用的MIPS CPU在使用32位数时速度很快,但在处理较小的数字时速度较慢。我重写了几个数据结构和函数,使用32位整数而不是16位整数,并指定字段与32位边界对齐。结果是一段代码中显着的速度提升,这些代码阻碍了软件的其他部分。
话虽如此,这不是一个微不足道的过程。我最终不得不修改使用该结构的每个函数,最后我不得不重新编写几个标准库函数。在这个特殊情况下,收益超过了工作。然而,在一般情况下,通常不值得麻烦。难以调试的问题有很大的潜力,而且几乎总是比看起来更多的工作。除非您有现有结构/类不符合的特定要求或限制,否则我建议不要重新实施它们。
正如迈克尔所提到的,知道如何重新实现结构确实很有用,即使你从未这样做过。您可能会发现将来可以通过应用现有数据结构中使用的原则和技术来解决问题。