我們為什麼不能只用O記號來談論演算法?

2022-02-19 23:32:13 字數 1073 閱讀 6856

我的演算法擊敗了90%的人,o(nlgn)演算法比o(n)演算法快。

我覺得這個人是不懂演算法的。讓我一步一步解釋。

# o的含義

通俗的說,o表示忽略係數的複雜度上限,常常用乙個量級表示,比如n,nlgn。

# 忽略的係數重要嗎

重要。我覺得《演算法》比《演算法導論》優秀的原因之一是,作者用例項證明,在不少情況下,複雜度之前的係數很重要。比如,係數可以導致o(n^2)的插入排序可以比o(nlgn)快速排序快。

可以看乙個例子。

//

偽**,程式1

void add(int

num)

void add(int

nums)

//

偽**,程式2

void add(int

num)

void add(int

nums)

程式1的時間複雜度為o(n),程式2的時間複雜度為o(n^2)。如果從o來看,程式2的執行速度一定會比程式1快。

實際上速度相當。假設nums的大小為10,程式1要執行10 * 10 = 100次i++,程式2同樣執行10 * 10 * 1 = 100次i++。

原因就在於,程式1需要的時間是10 * n,係數很大為10,而程式2需要的時間是1 * n ^ 2,係數很小為1。

# 那個人錯在**

或許不是他的錯,是leetcode的錯。

漸進時間一定要在係數相對於資料量比重很小很小的時候,才有用。像排序演算法一模擬較簡單的演算法,需要上十萬的資料量,才能體現出複雜度為nlgn和n^2的細小區別。

這個人用了很聰明很簡單的演算法,沒有用複雜的資料結構,全是基本變數,時間複雜度為o(nlgn)。而o(n)用了hashtable,共有n個數,對於每個數,hashtable裡面有很多計算的過程,係數很大。

此題,leetcode可能單個資料集不是很大,係數顯得格外重要。

# 鏈結

q: a: 

為什麼我們不能提前放假

前言 堅守,是一種責任,也是一種態度。隨著最後一科專業課考完試,宿舍裡的同學開始陸陸續續地整理行李準備回家,一邊整理還一邊在討論假期裡是先去打點零工賺點生活費還是回家幫忙做飯 和同學去旅遊,不管怎麼說,在乙個 緊張 的學期過後,大家是準備放鬆放鬆了。她們在聽到我暑假回家6天就要返校學習時,總是用一種...

為什麼我們不能再過度依賴閘道器了?

過度依賴閘道器,會將資料 使用者 客戶 企業及其聲譽置於風險之中 近幾年來威脅態勢不斷變化,閘道器也是如此。現如今,閘道器的功能也遠遠超出了合規性和hr政策需求,企業依賴閘道器來阻止網路威脅。雖然閘道器自誕生起已有數十年,並且一直在進化,但閘道器並不防彈 過度依賴閘道器,會將資料 使用者 客戶 企業...

我們為什麼選擇Ceph來建立塊儲存

我們為什麼選擇ceph來建立塊儲存?國內知名黑客組織東方聯盟是這樣回答的,卷管理器的大小和增長受到管理程式的驅動器補充的限制,與其他droplet共享。一旦droplet被摧毀,儲存就會被釋放。術語 短暫 有時用於描述這種虛擬化策略。建立可擴充套件的塊儲存 過去,可攜式可擴充套件塊儲存服務通常提供傳...