時間複雜度為on的排序演算法 理解演算法的時間複雜度

2021-10-14 12:29:25 字數 2470 閱讀 5214

翻譯:瘋狂的技術宅

原文:https://www.

在電腦科學中,演算法分析是非常關鍵的部分。找到解決問題的最有效演算法非常重要。可能會有許多演算法能夠解決問題,但這裡的挑戰是選擇最有效的演算法。現在關鍵是假如我們有一套不同的演算法,應該如何識別最有效的演算法呢?在這裡演算法的空間和時間複雜度的概念出現了。空間和時間複雜度是演算法的測量尺度。我們根據它們的空間(記憶體量)和時間複雜度(操作次數)來對演算法進行比較。

演算法在執行時使用的計算機記憶體總量是該演算法的空間複雜度(為了使本文更簡短一些我們不會討論空間複雜度)。因此,時間複雜度是演算法為完成其任務而執行的操作次數(考慮到每個操作花費相同的時間)。在時間複雜度方面,以較少的操作次數執行任務的演算法被認為是有效的演算法。但是空間和時間複雜性也受作業系統、硬體等因素的影響,不過現在不考慮它們。

我們將通過解決乙個特定問題的例子來幫你理解時間複雜度,

這個問題是搜尋。我們必須在陣列中查詢乙個元素(在這個問題中,假設陣列已經按公升序排序)。為了解決這個問題,我們有兩種演算法:

線性搜尋

二分搜尋

假設陣列包含十個元素,要求我們在陣列中找到數字 10。

const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const search_digit = 10;

線性搜尋演算法會將陣列的每個元素與search_digit進行比較,當它在陣列中找到search_digit時,會返回true。現在讓我們計算它執行的操作次數。這裡的答案是10(因為它比較了陣列的每個元素)。因此線性搜尋使用十個操作來查詢給定元素(這是使用線性搜尋演算法時對此陣列的最大運算元,這也被稱為最壞情況。通常線性搜尋在最壞的情況下會進行n次操作(其中n是陣列的大小)。

讓我們來看看同樣情況下的二分搜尋演算法。

通過此圖可以輕鬆理解二進位制搜尋:

如果要在這個問題上應用此邏輯,那麼首先我們將search_digit與陣列的中間元素進行比較,即 5。現在,因為 5 小於 10,那麼我們將開始在大於 5 的陣列元素中尋找search_digit,不斷執行相同的操作直到我們找到所需的元素 10 為止。

現在試著計算使用二分搜尋找到所需的元素進行的操作次數:大約需要四次操作。這是二分搜尋的最壞情況。這表明,執行的運算元和陣列的總大小之間存在對數關係。

操作次數 = log(10) = 4(約)

我們可以將此結果推廣到二分搜尋: 對於大小為n的陣列,二分搜尋執行的運算元為:log(n)

在上面的陳述中,我們看到對於大小為n的陣列,線性搜尋將執行n次操作來完成查詢,而二分搜尋執行log(n)次操作(兩者都是最糟糕的情況)。我們可以將其表示為圖形(x軸:元素數量,y軸:操作次數)。

從圖中可以清楚地看出,線性搜尋時間複雜度的增長速度比二分搜尋快得多。

當我們分析演算法時,一般使用 big o 表示法來表示其時間複雜度。

例如:線性搜尋的時間複雜度可以表示為o(n),二分搜尋表示為o(log n),其中,nlog(n)是執行的操作次數。

下面列出了一些流行演算法的時間複雜度或大o符號:

二分搜尋: o(log n)

線性搜尋: o(n)

快速排序: o(n*log n)

選擇排序:o(n*n)

旅行商問題:o(n!)

如果你讀到了這裡,我非常感謝。現在,必須要理解時間複雜性為何如此重要?我們知道,對於少量元素來說(比如說10),二元搜尋和線性搜尋所執行的操作次數之間的差異並不大,但在現實世界中的大多數時候,我們處理的是大塊資料的問題。加入我們有40億個元素要搜尋,那麼在最壞的情況下,線性搜尋將需要40億次操作才能完成任務,而二分搜尋只需要32次操作就能完成。它們之間的區別是非常巨大的。假設如果乙個操作需要1毫秒才能完成,那麼二進位制搜尋將只需要32毫秒,而線性搜尋將花費40億毫秒,也就是大約46天。這是乙個顯著的差異。這就是為什麼在涉及如此大的資料量時,研究時間複雜性是非常重要的原因。

時間複雜度為O(n)的排序演算法

我們常用的幾種排序演算法,氣泡排序,選擇排序,它們已經是相對比較簡單,穩定的排序演算法了,但是它們時間複雜度為o n n 基本都要用到兩層迴圈,今天我就像大家介紹一種簡單,只用一層for迴圈,時間複雜度為o n 的排序演算法。樣例輸入 1 4 5 6 3 4 2 8 9 1 樣例輸出 1 1 2 3...

時間複雜度為on的排序演算法 演算法的時間複雜度理論

yishun 可計算性理論的理解 zhuanlan.zhihu.com 現在,我們來討論演算法執行的時間複雜度。表示以下函式集合 o g n 表示以下函式集合 表示以下函式集合 f n 或 o g n 表示f n 是 或 o g n 的成員。首先要明確輸入規模的概念,一般來說,它指編碼演算法輸入所需...

實現排序演算法,時間複雜度為O n

我們常用的排序氣泡排序 o n 2 快速排序o nlogn 堆排序o nlogn 選擇排序o n 2 我們常用的排序都不符合時間複雜度的要求 經常聽說乙個說法 用空間代替時間 現在要排序的陣列為陣列 a 例如a陣列裡面有 1,1,2,2,3,3,2,2,5,5.等等很多無序的數字 那麼我們申請乙個陣...