您可以使用什么数据结构动态存储元素并有效地访问它们?

时间:2011-02-10 01:31:36

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

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

作为一个后续问题,在最坏的情况下,在链表中查找任何元素的复杂性是什么?

感谢您的所有意见。

6 个答案:

答案 0 :(得分:14)

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

  • 如果所有访问都是从列表的开头开始,则链接列表是一个不错的选择。
  • 如果访问是随机的,并且插入/删除结束,则动态数组是一个不错的选择。
  • 如果访问始终是FIFO,则堆栈是一个不错的选择。
  • 如果访问始终是LIFO,则队列是一个不错的选择。
  • 如果访问始终在最后,那么deque是一个不错的选择。
  • 如果访问始终是最小元素,则优先级队列是一个不错的选择。
  • 如果访问是完全随机的并且不需要排序,则哈希表是好的。
  • 如果访问完全是随机的并且需要排序,那么平衡二进制搜索树就很好。
  • 如果存储的元素是字符串或其他数字,则特里是好的。
  • 如果元素是空间中的点,并且您希望支持范围查询或最近邻搜索,则kd树很好。
  • 如果你想知道元素是如何相互连接的,那么union-find结构就很好。
  • 如果值为整数,访问是随机的,并且您希望它们按顺序排列,那么van Emde Boas树就很好。
  • 如果您想将元素存储为几何结构并想要访问特定面附近的点和边缘(反之亦然),则可以使用quadedge

这个问题有很多好的答案取决于你想要对数据做什么。这个列表只是对那些数据结构的一小部分抽样,根据具体情况,所有数据结构都可能是正确答案。根据具体情况,它们也可能都是错误的答案。请记住 - 在选择数据结构时,确保您知道您要解决的问题!

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

希望这有帮助!

答案 1 :(得分:5)

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

对于问题2,在链表中查找元素的复杂性为O(n),因为在更糟的情况下必须迭代列表中的所有元素(考虑元素不在列表中的情况)。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

这取决于使用模式:

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

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

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

答案 5 :(得分:0)

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

不经常删除 - 哈希映射。 (一切O(1))
经常删除 - Rb树(Everything O(logN))