資料探勘演算法的空間複雜度與時間複雜度分析

2021-06-20 10:44:07 字數 1856 閱讀 8467

剛才在知乎上看到乙個問空間複雜度和時間複雜度的問題,結果把自己也搞暈了。因為我們平常討論問題複雜度的時候都是說時間複雜度的,對空間複雜度確實沒怎麼仔細考慮過,畢竟現在64位的作業系統理論上所能提供的儲存空間高達2的64次方,怎麼搞定是作業系統的事。但這麼拿出來討論,好像確實還需要仔細思量一下。

當時把自己搞暈的原因是開始我下意識的認為:空間複雜度一般不可能太高,因為這是演算法,而演算法的空間開銷來自演算法處理過程中所產生的中間資料,中間資料如果也達到類似o(n^2)這樣的複雜度,就意味著每多處理乙個節點就要和前面所有的歷史資料發生勾連,這也就意味著這個模型的事物間的關係太複雜了。所以空間複雜度一般來說應該是個常量。但突然想到自己當時做貝葉斯網挖掘的時候,確實好像存在乙個中間函式組合**的問題,所以一下就暈了。

後來開啟當時的程式才發現了問題所在:

我開始的想法混淆了模型的結構點數和挖掘這個模型所送入的樣本數,我們講模型一定是講的結構,反映到it就是事物以及事物的屬性之間的關係;而每一行資料(也就是乙個樣本)只代表了現實世界中事物間的一次互動的記錄。而我們在討論演算法的複雜度時的n是指模型結構的複雜程度和尋找到這個模型結構所需付出的代價,衡量指標是模型的節點數、是屬性的數量、是輸入的變數個數,因此和樣本量其實是無關的。

下面就以自己寫的挖掘貝葉斯網的演算法而言(蟻群演算法中單只螞蟻的演算法)進行下初步的分析:

renew();

while (testside())

//區域性訊息素調整,所有的螞蟻的初始化鄰接矩陣是一樣的,所以調整任何乙個都是調整了全部的初始化鄰接矩陣

adjustinfo(selectside.parentvarid, selectside.sonvarid, conf.info_0);

}//根據找到的bn結構進行一次區域性搜尋

m_bnstructure = clsbnstructure.climbing(m_bnstructure, data);

return m_bnstructure.score;

我們對這個演算法的時空複雜度進行一下分析:

儲存的開銷:

1、各邊所組成的鄰接矩陣,這個的複雜度是o(n^2)的;

2、祖先列表、後代列表,這個的複雜度是o(n)的;

3、其它一些變數,這個的複雜度是o(1)的;

所以整個的空間開銷是o(n^2)的。

時間的開銷:

1、renew函式是初始化,可以通過預存進行化簡,這個的複雜度是o(1)的;

2、迴圈中的大多數函式都是對邊的操作,這個的複雜度是o(n^2)的;

3、最大的問題是迴圈的趟數,即testside函式能否快速收斂,而這取決於評分演算法是否高效合理,由於目前的評分演算法都比較成熟,我們將testside和pickside組合起來來看,初步將其估算為o(n*lgn);

那麼就整個演算法來說,就是o(n^3*lgn)了。但這裡面還忽略了評分演算法的計算開銷。

評分是對整個樣本集從頭到尾進行一次掃瞄(要考慮到資料探勘都是大樣本集,比如一般的貝葉斯網的節點數多在幾十到上百個變數,但送入的樣本數起碼要在3000以上),然後進行評分,bic演算法本身可以近似的估算為o(n^2)的複雜度,其中還有大量的log運算;

這樣整個演算法的總開銷是o(n^5*lgn),但就資料探勘這樣的演算法來說,一方面樣本集的數量其實是遠大於節點數量的,而且其中會涉及到很多的運算密集型的操作,如log運算等;另一方面,這還只是乙隻螞蟻爬一趟的開銷,還需要考慮整個蟻群的多隻螞蟻多趟計算,以及出於優化目的的其它處理開銷,如爬山等。

這樣分析下來,出於實際應用目的的演算法,由於其結構的節點數不可能太大(否則人類根本無法理解,也就難以應用),所以其空間複雜度是不需要過多考慮的,時間複雜度是我們主要需要考慮,但其中忽略了較多的其它因素,尤其是在大樣本集的資料探勘場景下,而只具有一定的參考意義。

jxbiz orm平台程式設計簡明參考手冊

jxwork任務管理軟體源**

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

通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...

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

雖然計算機能快速的完成運算處理,但實際上,它也需要根據輸入資料的大小和演算法效率來消耗一定的處理器資源。要想編寫出能高效執行的程式,我們就需要考慮到演算法的效率。演算法的效率主要由以下兩個複雜度來評估 時間複雜度 評估執行程式所需的時間。可以估算出程式對處理器的使用程度。空間複雜度 評估執行程式所需...

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

如果乙個演算法的執行次數是 t n 那麼只保留最高次項,同時忽略最高項的係數後得到函式 f n 此時演算法的時間複雜度就是 o f n 為了方便描述,下文稱此為 大o推導法。由此可見,由執行次數 t n 得到時間複雜度並不困難,很多時候困難的是從演算法通過分析和數 算得到 t n 對此,提供下列四個...