資料結構與演算法 均攤時間複雜度

2021-10-18 10:45:11 字數 1267 閱讀 5023

均攤時間複雜度,聽起來可能和平均時間複雜度。但卻不是,平均時間複雜度和均攤時間複雜度是兩種分析時間複雜度的方法。

上**!!!

// array 表示乙個長度為 n 的陣列

// **中的 array.length 就等於 n

int[

] array = new int

[n];

int count =0;

void

insert

(int val)

array[0]

= sum;

count =1;

} array[count]

= val;

++count;

}

這段**實現的是往陣列裡插入資料的功能。當陣列滿了的時候,我們用for迴圈遍歷陣列求和,並清空陣列,將求和後的sum值放在陣列的第乙個位置上,然後往陣列的空位裡新增新的資料。

這段**的時間複雜度是多少呢?我們很容易知道最好情況複雜度是o(1)。最壞情況複雜度為o(n)。平均時間複雜度是o(1)。

但是均攤時間複雜度是多少呢?首先我們需要明白均攤這一詞義,均攤就代表著,將一次高複雜度的情況均攤到低複雜度的情況上。

首先,find()函式在極端情況下,複雜度才是o(1)。但是insert()大部分情況下,時間複雜度都是o(1。只有個別情況下複雜度才會較高,為o(n)。這是find和insert其中乙個不同點。

其次呢,對於insert函式來說,o(1)時間複雜度的插入和o(n)時間複雜度的插入,出現的頻率是很有規律的,而且有一定的前後時序關係,一般是一次o(n)插入後,緊跟著n-1個o(1)的插入操作,一直迴圈往復。

所以,針對這種特殊的場景我們需要用到均攤時間複雜度,它的別名叫做攤還分析法。

// array 表示乙個長度為 n 的陣列

// **中的 array.length 就等於 n

int[

] array = new int

[n];

int count =0;

void

insert

(int val)

array[0]

= sum;

count =1;

} array[count]

= val;

++count;

}

我們看**例子很容易就能看出其規律,每次o(n)插入操作後,都有著n-1次o(1)的插入操作,所以把耗時多的那次操作均攤到n-1上,均攤下來後均攤時間複雜度就是o(1)。

均攤時間複雜度

均攤時間複雜度,聽起來跟平均時間複雜度有點兒像。對於初學者來說,這兩個概念確實非常容易弄混。我前面說了,大部分情況下,我們並不需要區分最好 最壞 平均三種複雜度。平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊 更加有限。功能 往陣列中插入資料的功能。當陣列滿了之後,也就...

資料結構與演算法 時間複雜度與空間複雜度

解決乙個問題的方法可能有很多,但能稱得上演算法的,首先它必須能徹底解決這個問題 稱為準確性 且根據其編寫出的程式在任何情況下都不能崩潰 稱為健壯性 程式和演算法是完全不同的概念。演算法是解決某個問題的想法 思路 而程式是在根據演算法編寫出來的真正可以執行的 例如,要依次輸出一維陣列中的資料元素的值,...

演算法與資料結構 時間複雜度

複雜度是衡量乙個演算法效率高低的乙個重要的因素,一般分為時間複雜度和空間複雜度。空間複雜度,一般在排序等 抽象資料型別的運算和物理實現 有關。本篇主要介紹時間複雜度的一些概念。我們在ram模型 1 記憶體無限大 2 基本運算o 1 下面考慮接下來的內容。準確的說,演算法的複雜性是執行演算法所需要的計...