减少集合中的查找时间
Reducing lookup time in collections
我经常听说使用 Vector 而不是 List 的主要好处之一是,向量的查找时间是 O(1)
,而列表的最坏情况是 O(n)
, 因为如果查询的项目在列表的后面,你需要遍历它的全部内容。
所以我的问题是;向量,像列表这样的集合,怎么会有 "flat" 的查找时间?使用什么技巧来实现这一目标?我指的是出现这种情况的任何语言,而不仅仅是 C++。
根据我的理解,向量具有常规数组的性能,因为它们只是动态数组。它们的内存结构是一组连续的存储,就像一个数组,但具有额外的增长能力。如果您知道数据所在的特定索引,您可以简单地访问该位置的数据。这是通过计算该位置的内存偏移量来完成的。但是,如果您不知道要查找的数据是什么,您仍然需要遍历它们以找到 Vector 中的索引。
列表,最常实现为双向链表,只是包含指向 previous/next 位置的指针的存储位置。为了找到一个特定的位置,你需要在最坏的情况下遍历所有这些位置。理论上,您可以 "cache" 特定值的指针位置,但不能保证它会再次出现,这就是您每次迭代的原因。
不过,由于这些属性,您可以非常快速地插入到列表的中间,但不能那么快地插入到 Vector 中,因为所有数据都需要移动以腾出空间。
有关详细信息,我建议您通读 std::list and std::vector documentation, as well as the wiki article on Dynamic Arrays,其中包含对列表数据结构性能的很好比较。
我经常听说使用 Vector 而不是 List 的主要好处之一是,向量的查找时间是 O(1)
,而列表的最坏情况是 O(n)
, 因为如果查询的项目在列表的后面,你需要遍历它的全部内容。
所以我的问题是;向量,像列表这样的集合,怎么会有 "flat" 的查找时间?使用什么技巧来实现这一目标?我指的是出现这种情况的任何语言,而不仅仅是 C++。
根据我的理解,向量具有常规数组的性能,因为它们只是动态数组。它们的内存结构是一组连续的存储,就像一个数组,但具有额外的增长能力。如果您知道数据所在的特定索引,您可以简单地访问该位置的数据。这是通过计算该位置的内存偏移量来完成的。但是,如果您不知道要查找的数据是什么,您仍然需要遍历它们以找到 Vector 中的索引。
列表,最常实现为双向链表,只是包含指向 previous/next 位置的指针的存储位置。为了找到一个特定的位置,你需要在最坏的情况下遍历所有这些位置。理论上,您可以 "cache" 特定值的指针位置,但不能保证它会再次出现,这就是您每次迭代的原因。
不过,由于这些属性,您可以非常快速地插入到列表的中间,但不能那么快地插入到 Vector 中,因为所有数据都需要移动以腾出空间。
有关详细信息,我建议您通读 std::list and std::vector documentation, as well as the wiki article on Dynamic Arrays,其中包含对列表数据结构性能的很好比较。