考虑到目前许多图书馆已经有优化的排序引擎这一事实,那么为什么还有很多公司会询问Big O和一些排序算法,而实际上在我们每天的计算中,这种类型的实现不再是真正需要的?
例如,自平衡二叉树,是嵌入式行业的一些大公司仍然要求程序员在测试和候选人选择过程中编码的一种问题。
即使对于嵌入式编码,在任何情况下都会发生这种类型的实现,因为boost,SQLite和其他库可以使用吗?换句话说,是否值得考虑优化此类算法的方法?
答案 0 :(得分:3)
如果你建议在2 kB Arduino上使用SQLite,你可能会听到很多笑声。
嵌入式系统有点特殊。它们通常具有非常严格的内存要求,因此空间复杂性可能比时间复杂度更重要。我自己很少在那个领域工作,所以我不知道嵌入式系统公司对什么感兴趣,但如果他们提出这样的问题,那么可能是因为你需要更多地了解这些问题而不是IT的其他领域
答案 1 :(得分:3)
作为一名嵌入式程序员,我想说这一切都归结为问题和系统限制。特别是在微处理器上,你可能不需要/需要拉入Boost,对于给定的问题,SQLite可能仍然太重。如果你说2K的内存,你如何解决问题看起来有所不同 - 但这绝对是极端的。
因此,例如,您可能不希望自己重写红黑树的代码,因为正如您所指出的,您可能最终会得到高度非优化的代码。但是在追求可重用性的过程中,抽象通常会为代码添加间接层。因此,您可能最终会重新实现至少更简单的“已解决”问题,在这些问题中,对于某些特定情况,您可以比内置库做得更好。最近,我使用共享内存池编写了一个专门版本的链表,用于跨列表分配。我已经对STL的列表进行了基准测试,并且由于增加了抽象层,它并没有削减它。我的代码好吗?不,可能不是。但是我更容易专门针对具体的用例,所以它更好。
所以我想我想从你的帖子中解决一些问题: - 为什么公司仍然会问大O运行时?我已经看到,即使是相当优秀的工程师也会在数据结构方面做出糟糕的选择,因为他们没有仔细考虑O()运行时。当你得到错误的假设时,二次与线性或线性对比恒定时间操作是一个痛苦的教训。 (啊,经验的声音)
- 为什么公司仍在询问实施经典结构/算法?可以说你不会重新实现快速排序,但如上所述,你最终可能会更经常地实现稍微复杂的结构。说实话,如果我想聘请你,我想要确保你了解现有解决方案的内部和外部理论,所以如果我需要你提出一个新的解决方案,你可以采取一个受过教育的裂缝它。如果另一个申请人有这个但你没有,我可能会说他们有优势。
此外,这是考虑它的另一种方式。在软件开发中,平台通常非常强大并且消费者已经拥有硬件平台。在嵌入式软件开发中,消费者可能购买硬件平台 - 希望来自贵公司。这意味着该软件经常出售硬件。因此,使用功能较少,成本较低的硬件来解决问题并花费更多时间来开发固件会花费更多的精力。固件是一次性成本,而硬件是每个单元。因此,即使从业务方面来看,也存在受限硬件的压力,这反过来导致软件方面的专门结构实现。
答案 2 :(得分:1)
没有足够的优化。
此外,这些问题旨在测试您对解决方案(以及解决方案的每个部分)的理解,而不是您对记忆内容的了解程度。因此,提出这样的问题是完全合理的。