【问题标题】:What data structure can you use to store elements dynamically and access them efficiently?您可以使用什么数据结构来动态存储元素并有效地访问它们?
【发布时间】:2011-02-10 01:31:35
【问题描述】:

您可以使用什么数据结构来动态存储元素并有效地访问它们?这是一个面试问题。我应该回答std::list(我的意思是用C++)吗?还是其他人?

作为后续问题,在最坏的情况下在链表中查找任何元素的复杂度是多少?

感谢您的所有意见。

【问题讨论】:

  • 什么样的元素? “访问”到底是什么意思?

标签: c++ data-structures linked-list


【解决方案1】:

这个问题很模糊。我们拥有多个数据结构的全部原因是它们都或多或少地支持不同的访问模式。例如:

  • 如果所有访问都从列表的开头向前移动,则链表是一个不错的选择。
  • 如果访问是随机的并且插入/删除在最后,则动态数组是一个不错的选择。
  • 如果访问总是 FIFO,堆栈是一个不错的选择。
  • 如果访问总是 LIFO,队列是一个不错的选择。
  • 如果访问总是在末端,那么双端队列是一个不错的选择。
  • 如果访问总是针对最小元素,优先级队列是一个不错的选择。
  • 如果访问是完全随机的且不需要排序,则哈希表是很好的选择。
  • 如果访问是完全随机的并且需要排序,则平衡二叉搜索树是很好的选择。
  • 如果要存储的元素是字符串或其他数字元素,则可以使用 trie。
  • 如果元素是空间中的点并且您希望支持范围查询或最近邻搜索,则 kd 树是很好的选择。
  • 如果您想了解元素之间的连接方式,联合查找结构是一种不错的选择。
  • 如果值是整数、访问是随机的并且您希望它们按顺序排列,则 van Emde Boas 树是很好的选择。
  • 如果您希望将元素存储为几何结构并希望访问特定面附近的点和边(反之亦然),则四边形是很好的选择

这个问题有无数个很好的答案,具体取决于您尝试对数据执行的操作。该列表只是现有数据结构的一小部分,根据具体情况,它们都可能是正确的答案。根据具体情况,它们也可能都是错误的答案。请记住 - 在选择数据结构时,确保您知道要解决什么问题!

关于你的第二个问题:在最坏的情况下,在链表中找到一个元素可能需要 O(n) 时间。当您要搜索的元素不存在于链表中或它接近末尾时,就会发生这种情况。在这种情况下,您需要一次扫描整个链表一个元素,然后才能确定相关元素是否包含在链表中。

希望这会有所帮助!

【讨论】:

  • 不错的答案。 @templatetypedef
【解决方案2】:

第一个问题我会说哈希表。在平均情况下,使用哈希表放置和获取元素是 O(1)。链表在 O(n) 中存储的情况更糟,在 O(n) 中的访问情况更糟。数组存储 O(1) 的情况更糟,访问 O(1) 的情况更糟。链表可以非常快速地动态增长,其中数组需要分配新的更大的数组,并复制现有元素以实现动态增长的能力。

对于问题 2,在链表中查找元素的复杂度为 O(n),因为在最坏的情况下您必须遍历链表中的所有元素(考虑元素不在链表中的情况)。

【讨论】:

    【解决方案3】:

    我认为答案完全取决于您存储的内容以及访问模式是什么:

    • 您需要什么样的访问权限?随机的?顺序?
    • 插入/更新是频繁还是不频繁?
    • 有多少元素?
    • 元素是什么类型的?
    • .. 等等..

    如果我在面试中被问到你的问题,我会先回答那些澄清问题。有时,面试官会问一些模糊的、开放式的问题,以了解您的想法:看看您是否能识别出一个未完全指定的问题,并提出问题以获得必要的背景来回答。

    【讨论】:

      【解决方案4】:

      访问列表中的元素效率不高。你应该默认使用向量,它是随机访问。

      【讨论】:

      • 但我认为矢量与“动态”不匹配
      • @Don Lun:“动态”是什么意思。您可以随意插入和删除向量中的元素。虽然,除非插入和擦除在后面,否则效率是有代价的。
      • @Don Lun:在 C++ 术语中,向量是使用堆内存并且能够增长到任意大小的标准容器 - 确实非常动态。相比之下,定长数组ala int x[20]动态的。
      【解决方案5】:

      这取决于使用模式:

      例如,对于向量,快速访问随机元素是以添加新元素为代价的,

      使用列表,您将能够有效地添加新元素,而随机元素访问是不可能的 - 您必须遍历整个列表(在最坏的情况下)才能访问所需的元素,即 O(n) 复杂度。

      您可以在此处找到有关不同 stl 容器操作复杂性的信息:http://www.cplusplus.com/reference/stl/

      【讨论】:

        【解决方案6】:

        如果我问这个问题,我会回答这个简短而简单的

        不经常删除 - 哈希图。 (一切 O(1))
        频繁删除 - Rb 树 (Everything O(logN))

        【讨论】:

          猜你喜欢
          • 2017-06-05
          • 2018-11-16
          • 2016-02-29
          • 2013-01-15
          • 2012-12-06
          • 1970-01-01
          • 2020-08-01
          • 2017-08-14
          • 1970-01-01
          相关资源
          最近更新 更多