1. 程式人生 > >C++ std::vector中push_back操作時間複雜度分析

C++ std::vector中push_back操作時間複雜度分析

 vectorSTL中的一種序列式容器,採用的資料結構為線性連續空間,它以兩個迭代器 start 和 finish 分別指向配置得來的連續空間中目前已被使用的範圍,並以迭代器end_of_storage 指向整塊連續空間(含備用空間)的尾端,結構如下所示:

    template Alloc = alloc>

    class vector {

  ​  ...

    protected:

        iterator start;                     // 表示目前使用空間的頭

        iterator finish;                   // 表示目前使用空間的尾

        iterator end_of_storage;  // 表示可用空間的尾​

     ...
};​

我們在使用 vector 時​,最常使用的操作恐怕就是插入操作了(push_back),那麼當執行該操作時,該函式都做了哪些工作呢?

該函式首先檢查是否還有備用空間,如果有就直接在備用空間上構造元素,並調整迭代器 finish,使 vector變大。如果沒有備用空間了,就擴充空間,重新配置、移動資料,釋放原空間。​

 其中​判斷是否有備用空間,就是判斷  finish是否與 end_of_storage 相等.如果 

finish != end_of_storage,說明還有備用空間,否則已無備用空間。

當執行 push_back 操作,該 vector 需要分配更多空間時,它的容量(capacity

)會增大到原來的 倍。​現在我們來均攤分析方法來計算 push_back 操作的時間複雜度。

假定有 n 個元素,倍增因子為 m。那麼完成這 n 個元素往一個 vector 中的push_back​操作,需要重新分配記憶體的次數大約為 logm(n),第 i 次重新分配將會導致複製 m^i (也就是當前的vector.size() 大小)箇舊空間中元素,因此 n 次 push_back操作所花費的總時間約為 n*m/(m - 1):

時間複雜度計算

很明顯這是一個等比數列.那麼 n 個元素,n 次操作,每一次操作需要花費時間為 m / (m - 1),這是一個常量.

所以,我們採用均攤分析

的方法可知,vector 中 push_back 操作的時間複雜度為常量時間.​

參考資料:

《STL原始碼剖析》侯捷 著

原文連結

相關推薦

C++ std::vectorpush_back操作時間複雜分析

 vector是STL中的一種序列式容器,採用的資料結構為線性連續空間,它以兩個迭代器 start 和 finish 分別指向配置得來的連續空間中目前已被使用的範圍,並以迭代器end_of_storage 指向整塊連續空間(含備用空間)的尾端,結構如下所示:

C++ std::vectorpush_back操作空間溢位

今天在做leetcode 705、706時候遇到一個錯誤。 題連結:https://leetcode.com/problems/design-hashmap/description/ [817] Design HashMap * * https://leetc

考研的演算法時間複雜分析

1.常用的時間複雜度比較關係為O(1) <= O(log2(n)) <= O(n) <= O(nlog2(n)) <= O(n2) <= O(n3) ..... <=O(nk) <= O(2(n))2.具體步驟    1)確定演算法中

找出陣列第k大的數(時間複雜分析C++程式碼實現). TopK in array. ( leetcode

找出陣列中第k大的數. TopK in array. ( leetcode - 215 ) 最近面試過程中遇到的一個題目,也是大資料時代常見的題目,就來總結一下。 面試題目: 1、10億數中,找出最大的100個數。用你能想到的最優的時間和空間效率。 2

二叉樹時間複雜分析及增刪改查操作java實現

順序表和連結串列的時間複雜度由給定條件不同從而會得出不同的時間複雜度結果,對於程式設計時並不總是最好用的儲存方式。二叉樹是一種更加穩定的資料儲存方式,其複雜度總是能表示為一個固定的形式。以下來分析二叉樹增刪改查操作做的時間複雜度。 設有如下資料需要進行二叉樹形式儲存:

二叉查詢樹與紅黑樹概念性質及操作時間複雜

操作名(h樹高) 二叉查詢數 紅黑樹 查詢 O(h) O(lgn) 查最大/小元素 O(h) O(lgn) 前驅/後繼 O(h) O(lgn) 插入 O(h) O(lgn) 刪除 O(h) O(lgn)

無序序列O(n)時間複雜尋找最小(最大)的K個數

一、快速排序,平均複雜度為n*logn 二、維護K個最小(最大)堆,平均複雜度為n*logK 三、類似快排的劃分方法 尋找N個數中最大的K個數,本質上就是尋找最大的K個數中最小的那個,也就是第K大的數。 可以使用二分搜尋的策略來尋找N個數中的第K大的數。對於一個給定的數p,

常見排序演算法的基本原理、程式碼實現和時間複雜分析

  排序演算法無論是在實際應用還是在工作面試中,都扮演著十分重要的角色。最近剛好在學習演算法導論,所以在這裡對常見的一些排序演算法的基本原理、程式碼實現和時間複雜度分析做一些總結 ,也算是對自己知識的鞏固。 說明: 1.本文所有的結果均按照非降序排列; 2.本文所有的程式均用c++實現,

資料結構與演算法--蠻力法之氣泡排序與時間複雜分析(java)

蠻力法         蠻力法又稱窮舉法和列舉法,是一種簡單直接地解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。但是蠻力法所設計的演算法時間特性往往是比較低的,典型的指數時間演算法一般都是通過蠻力

1. 時間複雜分析

一. 對資料規模又一個概念 想要在1s內解決問題: O(n2)的演算法可以處理大約104級別的資料 O(n)的演算法可以處理大約10^8級別的資料 O(nlogn)的演算法可以處理大約10^7級別的資料 保險起見,在實際中最好降一個級 空間複雜度 遞

時間複雜分析---主定理

一直以來時間複雜度都不會算嗚嗚嗚,今天理一理 證明咱就算了,沒這腦子。對於第一種情況,舉幾個栗子: 1)例1:二叉樹的遍歷。            T(n)=2T (n/2)+Θ (1) 。            其中(a=2), (b=2), (f(n)=1

堆排序的JAVA實現及時間複雜分析

堆排序是一個比較常用的排序方式,下面是其JAVA的實現: 1. 建堆 // 對輸入的陣列進行建堆的操作 private static void buildMaxHeap(int[] array, int length) { // 遍歷所有

KMP演算法介紹及時間複雜分析

概念:字串中 一個字元前面的字串 的字首與字尾的最長匹配長度(短的那個字串) 注意:字首與字尾不可以是整個子字串 例如:a b c a b c d , d位置的最長匹配長度為3,abc 與 abc 匹配 Next陣列:長度與字串長度一致,每個位置儲存對應字元的最長匹配長

遞迴演算法的時間複雜分析

在演算法分析中,當一個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為一個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法:     (1)代入法(Substitution Method)  

排序演算法——希爾排序的圖解、程式碼實現以及時間複雜分析

希爾排序(Shellsort) 希爾排序是衝破二次時間屏障的第一批演算法之一。 希爾排序通過比較相距一定間隔的元素來工作;各躺比較所用的距離隨著演算法的進行而減小,直到只比較相鄰元素的最後一趟排序為止。由於這個原因,希爾排序有時也叫做縮減增量排序。 希爾排

三分查詢的時間複雜分析

       在網上搜索了一下有關三分查詢時間複雜度分析的。有人說是O(3log3(n)),但是實驗中三分比二分更耗時,所以他們就認為不能迷信時間複雜度。我現在糾正一下(僅個人分析,供網友參考):    1.二分查詢的時間複雜度:因為每次都是折半,可以構造一顆遞迴樹,共lo

常用排序演算法穩定性、時間複雜分析

1、  選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,        氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 2、研究排序演算法的穩定性有何意義?   首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資

淺談直接插入排序演算法思想以及時間複雜分析

研究意義 直接插入排序是最基本的一種排序演算法,其思想簡單,容易掌握,對後期的學習也有一定的幫助。 必備知識(之後不再敘述) 排序:將一組雜亂無章的資料排列成一個按關鍵字有序的序列。 穩定性:關鍵值相

排序演算法 (穩定性時間複雜分析

1、  選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,        氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 2、研究排序演算法的穩定性有何意義?   首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資

遞迴函式時間複雜分析

相信下面3個網址足夠解決了遞迴函式時間複雜度的分析了 1.https://www.cnblogs.com/aademeng/articles/7044312.html 2.https://www.cnblogs.com/carazk/p/5860334.html 3.htt