【问题标题】:Data Structures Implementation [closed]数据结构实现[关闭]
【发布时间】:2018-12-22 23:36:01
【问题描述】:

存在数组、链表、队列、堆栈、二叉树等数据结构。像 Java 或 C++ 这样的语言已经在很大程度上实现了它们,并且存在可以在任何程序或应用程序中使用的 API。根据需要,可以选择特定的数据结构。

我的问题是需要知道实现细节。例如,如果搜索是程序的重复任务,那么仅知道可以使用数组而不是链表是不够的。

我是新手,可能连问这样的问题都太天真了。甚至面试也非常关注它们的实施方式。请帮我理解。

谢谢!

【问题讨论】:

  • 如果您不知道它们是如何实现的,那么您就不知道在哪种情况下选择哪个。如果您被要求选择一种允许您快速插入和迭代的数据结构,您如何在不知道每个数据结构如何工作的情况下选择正确的数据结构?
  • 当我阅读在线教程中每种数据结构的理论时。它总结说链表比数组更适合插入/删除,但不支持随机访问。其中一些还提供了理论上的实现细节。我需要编码和实现什么?这可能对我有好处,但是否有必要包括重点关注他们的采访。只是想真正地理解。我可能错过了许多其他人看到的东西
  • 为了进一步澄清,我在理论上也理解,例如,每个节点的链表,都有数据和对下一个节点的引用,因此要到达一个元素,必须按顺序遍历,而不像数组是索引基于。我是否必须编写/实现相同的代码。这还不够了解吗?
  • 实现是理解的证明。如果你真正了解,那么实施就很容易了。
  • 同意。实施真正巩固了理解。

标签: java c++ algorithm data-structures


【解决方案1】:

由于大多数程序为了有用,都需要存储和处理某种数据,因此拥有用于表示该数据的良好数据结构至关重要,在某些情况下,甚至对程序的性能至关重要。

话虽如此,数组、链表、二叉树等是可用的基本数据结构,并且它们的实用性正在通过它们在许多库中可用的事实得到证明。深入了解它们可以让您为任务选择最佳数据结构。

了解此类数据结构的实现是了解它们的工作原理、优缺点的好方法。当然,您可以从理论上阅读它们,并且您可以对它们有足够的了解,以便能够有效地使用库中提供的实现。问题是这不是故事的结局。

作为一名程序员,您经常需要处理不同类型的数据,这些数据可能不太适合标准数据结构之一。您经常编写自己的数据结构,为特定任务定制。看看一些基本数据结构是如何实现的,不仅是一个很好的练习,而且在某些情况下也是一种灵感来源。

至于面试,他们的范围是评估你作为程序员的能力。实现一个基本的数据结构展示:

  • 候选人对基本数据结构的熟悉程度
  • 候选人编写代码的方式/为围绕代码的辩论提供了一些起点(例如代码质量、性能技巧)
  • 与特定问题无关,即您不会在面试中浪费宝贵的时间来解释问题
  • 它们通常很简单,可以在面试所需的时间内完成

此外,作为初学者程序员,它们是一个很好的练习练习,可以介绍一些可以应用于其他情况的常见模式和技术。

【讨论】:

    【解决方案2】:

    在面试中提出这些问题的目的是让被面试者证明他们掌握了该语言,并且能够以计算机科学家的方式进行抽象思考。

    在 Java 和 C++ 等面向对象的语言中尤其如此;编程经常尝试对现实世界进行建模。如果您正在谈论排序算法,您可以轻松地将算法应用于一堆编号的便利贴,并最终得到一个分类的便利贴集合。或者查看数据结构,您可以将类似的模型应用于餐厅订单(优先队列、链表,希望不是堆栈?)。

    因为大多数软件工程职位同样要求申请人编写模拟现实世界事物的软件(例如,通过互联网而不是通过信鸽进行对话),所以算法/数据结构类型的问题向面试官展示申请人有能力以刻意的方式编写软件来执行或模拟现实世界的任务。

    从更实际的角度来看,Java 和 C++ 中的预构建数据结构必须设计为能够处理大量输入。构建一个可以处理 Object:Object 存储的任何组合的映射比实现一个只会处理 Integer:String 配对的映射需要更多的开销。

    如果您最终担任毫秒/字节很重要的角色,您可能需要手动构建/调整为特定目的而设计的数据结构。一个典型的例子是 Java 缺乏内置的基数排序。这背后的逻辑是,基数排序的优化只在非常小众的情况下发挥作用(当您只需要对基元进行排序时,基于它们的二进制值 Fast!;因此,它更有意义如果他们的具体情况确实需要使用基数排序,则将实现留给开发人员。

    总而言之,这些问题很难!尽管经验丰富的程序员可能会说什么,第一次有人要求你在白板上编写图遍历算法,或者从头开始构建优化的搜索算法在你的工作中,这将是艰难的,无论你是否学习过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多