【发布时间】:2011-02-10 01:31:35
【问题描述】:
您可以使用什么数据结构来动态存储元素并有效地访问它们?这是一个面试问题。我应该回答std::list(我的意思是用C++)吗?还是其他人?
作为后续问题,在最坏的情况下在链表中查找任何元素的复杂度是多少?
感谢您的所有意见。
【问题讨论】:
-
什么样的元素? “访问”到底是什么意思?
标签: c++ data-structures linked-list
您可以使用什么数据结构来动态存储元素并有效地访问它们?这是一个面试问题。我应该回答std::list(我的意思是用C++)吗?还是其他人?
作为后续问题,在最坏的情况下在链表中查找任何元素的复杂度是多少?
感谢您的所有意见。
【问题讨论】:
标签: c++ data-structures linked-list
这个问题很模糊。我们拥有多个数据结构的全部原因是它们都或多或少地支持不同的访问模式。例如:
这个问题有无数个很好的答案,具体取决于您尝试对数据执行的操作。该列表只是现有数据结构的一小部分,根据具体情况,它们都可能是正确的答案。根据具体情况,它们也可能都是错误的答案。请记住 - 在选择数据结构时,确保您知道要解决什么问题!
关于你的第二个问题:在最坏的情况下,在链表中找到一个元素可能需要 O(n) 时间。当您要搜索的元素不存在于链表中或它接近末尾时,就会发生这种情况。在这种情况下,您需要一次扫描整个链表一个元素,然后才能确定相关元素是否包含在链表中。
希望这会有所帮助!
【讨论】:
第一个问题我会说哈希表。在平均情况下,使用哈希表放置和获取元素是 O(1)。链表在 O(n) 中存储的情况更糟,在 O(n) 中的访问情况更糟。数组存储 O(1) 的情况更糟,访问 O(1) 的情况更糟。链表可以非常快速地动态增长,其中数组需要分配新的更大的数组,并复制现有元素以实现动态增长的能力。
对于问题 2,在链表中查找元素的复杂度为 O(n),因为在最坏的情况下您必须遍历链表中的所有元素(考虑元素不在链表中的情况)。
【讨论】:
我认为答案完全取决于您存储的内容以及访问模式是什么:
如果我在面试中被问到你的问题,我会先回答那些澄清问题。有时,面试官会问一些模糊的、开放式的问题,以了解您的想法:看看您是否能识别出一个未完全指定的问题,并提出问题以获得必要的背景来回答。
【讨论】:
访问列表中的元素效率不高。你应该默认使用向量,它是随机访问。
【讨论】:
int x[20] 是非动态的。
这取决于使用模式:
例如,对于向量,快速访问随机元素是以添加新元素为代价的,
使用列表,您将能够有效地添加新元素,而随机元素访问是不可能的 - 您必须遍历整个列表(在最坏的情况下)才能访问所需的元素,即 O(n) 复杂度。
您可以在此处找到有关不同 stl 容器操作复杂性的信息:http://www.cplusplus.com/reference/stl/
【讨论】:
如果我问这个问题,我会回答这个简短而简单的
不经常删除 - 哈希图。 (一切 O(1))
频繁删除 - Rb 树 (Everything O(logN))
【讨论】: