在比較演算法的效率時,往往是演算法的執行時間與資料項個數關係間比較,例如,為了得到某個結果,在同一資料量下,哪個演算法執行最快,效率最高,而後改變這一資料量,哪種演算法的時間又最快......
大o表示法
在描述演算法執行時間時,往往能看到o(n)、o(logn)等,大o中的o的意思就是"order of"(大約是),它是種概念,就比如 大型車、小型車和中型車,忽略具體大小尺寸,來描述汽車。
首先來跟著我分析一段**:
示例 1: 1
intsum(
intn)29
return
partialsum;10}
這個程式是計算 σ
ni=1
i3 即 從1開始到n的整數,計算它們的立方和
宣告不計時間,賦值、計算、比較每次佔乙個時間單位,則從第四行開始,首先花費1個時間單位,接著進入迴圈,給i賦值,又佔乙個單位,它只執行一次,接著比較,執行n+1次,i++為兩次計算,一次加一,一次賦值,而它要執行n次,佔2n個時間單位,迴圈主體是四個時間單位(兩個乘法,乙個加法,乙個賦值),總共執行n次,故花費4n個單位,最後返回花費1個時間單位。
最終,這個程式總共花費1(賦值)+1(賦值)+(1+2n)(比較)+4n(計算)+1(返回)=6n+4 個時間單位,但是,如果每個程式都像這樣計算的話,豈不是讓人崩潰,大o表示法的宗旨就是,捨去所有常量,把它歸入cpu,平台等因素造成的時間,假設這些常量總體為k,則上面那個程式所花費的時間是n+k,按照這種計算方式,每個程式的執行時間都會轉化為xn+k,所以我們可以把k捨去。
最終,以大o表示法,這個程式的執行時間是o(n)。
如果是乙個巢狀迴圈呢,比如:
示例 2:
for(int i=0;i++)}
<=n,比如10個數,最多猜測3次,即23
<=10 ,3<=log210 。
現在大致明白了log形式的執行時間了吧。
這裡列出一些執行時間計算的一些法則,是從《資料結構與演算法分析c++描述(第三版)》上面摘錄的
法則1:
for迴圈
乙個for迴圈的執行時間至多是該for迴圈內語句(包括測試)的執行時間乘以迭代的次數。
法則2:
巢狀迴圈
從裡向外分析這些迴圈。在一組巢狀迴圈內部的一條語句總的執行時間為該語句的執行時間乘以該組所有迴圈的大小的乘積。
法則3:
順序語句
將各個語句的執行時間求和即可(這意味著,其中的最大值就是所得的執行時間)。
法則4:
if/else語句
乙個if/else語句的執行時間從不超過判斷再加上每個主體中執行時間較長者的總的執行時間。
最後,總結一下,其實執行時間o就是相對增長率,我們所比較的執行時間,就是把他們的相對增長率進行比較,這裡的執行時間,都是在最壞情況下得出的,因為資料量充滿不確定性,不保守估計的話,會出錯,了解了執行時間的演算法,對乙個演算法的好壞的判斷就有基準了,以後會用到這裡(尤其是排序算
Redis資料結構執行時間
注意謹慎使用的list命令如下 hash即雜湊表,redis的hash和傳統的雜湊表一樣,是一種field value型的資料結構,可以理解成將hashmap搬入redis。hash非常適合用於表現物件型別的資料,用hash中的field對應物件的field即可。hash的優點包括 可以實現二元查詢...
c 資料結構之執行時間測試
需要注意的 每次程式執行的時間返回值是不一樣的。和機子的效能有關係。大部分也有注釋了。核心 就是getrunningtime 這個函式裡面的 using system using system.collections.generic using system.diagnostics using sy...
資料結構與演算法分析 二 演算法分析(執行時間計算)
大o執行時間是上界 for迴圈 for迴圈的執行時間是for迴圈內語句的執行時間乘以迭代次數 巢狀的for迴圈 從裡向外分析 順序語句 各個語句的執行時間求和 if else語句 if s1else s2不超過判斷 s1和s2執行時間長者的總的執行時間 情況一 實質上是for迴圈,所以為o n in...