關於演算法空間複雜度的問題

2022-01-24 10:05:24 字數 2852 閱讀 3240

『演算法空間複雜度』,別以為這個東西多麼高大上,我保證你看完這篇文章就能明白。

最近在啃演算法,發現非常有趣。在我學習的過程中發現了乙個問題,那就是空間複雜度的問題,它絕對是效率的殺手。

空間複雜度

(space complexity)是對乙個演算法

在執行過程中臨時占用儲存空間大小的量度,記做s(n)=o(f(n))。比如直接插入排序

的時間複雜度

是o(n^2),空間複雜度

是o(1) 。而一般的遞迴

演算法就要有o(n)的空間複雜度

了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間

兩個方面衡量。

拿插入排序來說。插入排序和我們現實中打撲克牌時理清牌的那一步很像。拿鬥地主來說,我們經常會把順子理出來,回想下我們是怎麼理的?比如我們有這麼5張牌9、8、10、7、6。過程應該是這樣的:

9、8、10、7、6

從8開始,8發現9比它大,然後8插到9前面。

8、9、10、7、6

然後到10,10發現它比前面2個都大,所以不用動。

8、9、10、7、6

然後到7,7發現10比它大,然後跟10換位置。

8、9、7、10、6

然後7又發現9也比它大,於是又跟9換位置

8、7、9、10、6

然後7又發現8也比它大,於是又跟8換位置

7、8、9、10、6

等等,好像有點不對。到牌『7』的那一步好像太麻煩了,我們平時是把7拿起來,直接插到8前面就完事了。簡單快捷,絕對比乙個個插要快。沒錯!這就是空間複雜度的問題。下面直接上2組**來校驗一下。

我們可以看到,這種方法真是很笨。。就是乙個乙個往前插。。這當然不是我們想要的。。我們再改進下

public

static

void insertsort2(listlist)

else

break

; }

list[j] = basenumber;//

結束後把牌插入到空位

} }

static

void main(string

args)

;insertsort2(list);

}

其實思路就是先抽出1張牌(比如抽出的那張牌的位置為3,注意:現在3是空出來的),如果前一張牌(位置2)比它大,就把2移到3上面去。2就空出來了。

接著再前面那張(位置1)如果比抽出來的牌大,繼續往前移。因為2空出來了,1移到2上。現在1空出來了。

然後把抽出來的牌放到1上,完成。

過程如下

8、9、10、7、6

78、9、10、  、6

8、9、   、10、6

8、  、9 、10、6

、8、9 、10、6

7、8、9 、10、6

再來看看執行效率方面到底差了多遠

public

static

void insertsort(listlist)

else

break

; }}}

public

static

void insertsort2(listlist)

else

break

; }

list[j] = basenumber;//

結束後把牌插入到空位

} }

static

void main(string

args)

stopwatch watch = new

stopwatch();

watch.start();

insertsort(list);

watch.stop();

console.writeline(watch.elapsedmilliseconds);

watch.reset();

watch.start();

insertsort2(list2);

watch.stop();

console.writeline(watch.elapsedmilliseconds);

console.readkey();

}

執行結果

快了將近1倍吧

第一種方法需要不短的交換2個元素。因為需要交換2個元素,所以我們還需要用1個臨時變數來儲存其中1個元素的值

int temp = list[j - 1];

list[j - 1] = list[j];

list[j] = temp;

第二種方法則是直接將後面的元素往前移。

list[j] = list[j - 1];

如果說第乙個種方法元素交換的次數為n,那第二種方法交換的次數則為 n/2+1。

堆排,快排時很多時候都會運用到這種思想。不知道大家有沒得到一些幫助呢?平時程式設計的時候是否也要注意到呢?

關於演算法的時間複雜度和空間複雜度

首先,需要解釋一下經常看到的o log n 是什麼意思。大概總結為普通應用都是10,計算機學科是2,程式語言裡面是e。在我們初中最初接觸到對數時,學到的log指以10為底的對數,為了簡化把下標10去掉,記為log。以常數e為底的對數,簡化下標記為ln。但是在計算機學科裡,不知道為什麼流傳下來的log...

演算法時間複雜度空間複雜度

演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...

演算法 時間複雜度 空間複雜度

1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...