C++ O(1)最坏情况仅追加数组

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,但是我相信最

我正在寻找一种支持O(1)随机访问和最坏情况下的O(1)追加的数据结构。 然而,在我的例子中,追加的O(1)摊销时间不是我想要的

数据结构也将对其执行除追加访问以外的任何操作。没有删除,没有插入,只是一个仅附加的结构

在我的例子中,上限会非常大,可能是8GB

此外,这个问题基本上与相同,但是,我对这个问题的答案有一个问题,那就是它降低了内存分配的成本。在
c++
中,内存分配大部分时间是O(1),然而,我经历过很多次
malloc
需要很长时间

我想知道这样的结构是否存在。我读过pdf,但是我相信最坏的情况下时间复杂度仍然是摊销的

如果任何人对支持这些条件的结构有任何想法(不是寻求实现,只是想法),我们将不胜感激。

非常接近您想要的:

  • 它是随机访问的
    O(1)
    (比
    std::vector
    贵两倍,因为它必须执行两个指针解引用,而不仅仅是一个指针解引用,而是一个固定的倍数,这不会改变big-O)
  • <> LI>有效地<代码> O(1)< /代码>,不只是摊销<代码> O(1)< /> >,如果您考虑间歇固定大小内存分配(不初始化)为<代码> O(1)< /代码>(它是,它不是固定成本,但成本不与<代码> DEQu< <代码>的大小) 与链接问题中的分配不同(当新分配的内存大小翻倍,因此新分配呈线性增长时),
    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的开头或结尾插入的恒定时间,请参见。