C++ O(1)最坏情况仅追加数组
我正在寻找一种支持O(1)随机访问和最坏情况下的O(1)追加的数据结构。 然而,在我的例子中,追加的O(1)摊销时间不是我想要的 数据结构也将不对其执行除追加和访问以外的任何操作。没有删除,没有插入,只是一个仅附加的结构 在我的例子中,上限会非常大,可能是8GB 此外,这个问题基本上与相同,但是,我对这个问题的答案有一个问题,那就是它降低了内存分配的成本。在C++ O(1)最坏情况仅追加数组,c++,memory,data-structures,big-o,C++,Memory,Data Structures,Big O,我正在寻找一种支持O(1)随机访问和最坏情况下的O(1)追加的数据结构。 然而,在我的例子中,追加的O(1)摊销时间不是我想要的 数据结构也将不对其执行除追加和访问以外的任何操作。没有删除,没有插入,只是一个仅附加的结构 在我的例子中,上限会非常大,可能是8GB 此外,这个问题基本上与相同,但是,我对这个问题的答案有一个问题,那就是它降低了内存分配的成本。在c++中,内存分配大部分时间是O(1),然而,我经历过很多次malloc需要很长时间 我想知道这样的结构是否存在。我读过pdf,但是我相信最
c++
中,内存分配大部分时间是O(1),然而,我经历过很多次malloc
需要很长时间
我想知道这样的结构是否存在。我读过pdf,但是我相信最坏的情况下时间复杂度仍然是摊销的
如果任何人对支持这些条件的结构有任何想法(不是寻求实现,只是想法),我们将不胜感激。非常接近您想要的:
O(1)
(比std::vector
贵两倍,因为它必须执行两个指针解引用,而不仅仅是一个指针解引用,而是一个固定的倍数,这不会改变big-O)std::deque
s块分配的大小是固定的,因此您可以:
由于新区块的大小是固定的,而不是不断增长的,因此它仍然是
O(1)
(有时是O(1构造)
有时是O(1固定大小分配+1构造)
,但仍然与deque
的长度无关)。同样有效的问题是,这样的结构是否存在?是的,这是一个同样有效的问题,你对尺寸有什么限制?有上限吗?是否有合理预期的元素数量?所有这些都是关于如何处理这个问题的考虑。在我的例子中,我不认为它会有一个上限,但可能在某种程度上(比如8GB)哎哟:)
我问这个问题的原因是这样的。如果您知道您将平均拥有10亿个元素(在您的情况下),您可以通过预先分配预期数量的元素来降低分配成本。此时,在需要重新分配之前,您将拥有O(1)访问权/外观。然后,通过了解您可能会超出初始分配的多少,可以允许一次重新分配来覆盖大多数情况。在大多数情况下,malloc
现在默认为mmap
,与过去相比,重新分配的成本也有所降低。不过,您如何指定deque的固定缓冲区大小?例如,如果我有一个std::deque
,它的缓冲区大小会是多少?但是,这个链接:显示std::deque的附加时间复杂度为O(1)。我认为这是真的,因为我相信std::deque在内部使用std::vector,并且增长是O(1)amortized@CinCoutSinBla:该标准不允许您指定块大小(GCC的实现用于允许此操作,但在意识到它违反了标准时将其删除)。它因实现而异,例如,根据CPPFREFERENCE,64位libc++
的方法是块足够大,可以容纳16个元素或4096个字节,以较大者为准。啊,好的。你看到我在链接中关于摊销时间的评论了吗?这个答案是错误的。本标准规定了在std::deque的开头或结尾插入的恒定时间,请参见。