您可以使用哪种数据结构动态存储元素并有效地访问它们?这是一个面试问题。我应该回答std::list
(我的意思是在C ++中)吗?或其他人?
作为一个后续问题,在最坏的情况下,在链表中查找任何元素的复杂性是什么?
感谢您的所有意见。
答案 0 :(得分:14)
这个问题很模糊。我们拥有多个数据结构的全部原因是它们都比其他数据结构更高效或更低效地支持不同的访问模式。例如:
这个问题有很多好的答案取决于你想要对数据做什么。这个列表只是对那些数据结构的一小部分抽样,根据具体情况,所有数据结构都可能是正确答案。根据具体情况,它们也可能都是错误的答案。请记住 - 在选择数据结构时,确保您知道您要解决的问题!
关于你的第二个问题:在最坏的情况下,在链表中找到一个元素需要花费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))