1. 程式人生 > >資料結構與演算法分析--演算法分析

資料結構與演算法分析--演算法分析

演算法分析

示例:
題目-----將數7652累加1後面9個0次
思路1:累加1後面9個0次

public class Li13{
public static void main(String[] args) {
/*
* 測試乘積,檢視程式執行時間(毫秒為單位)
/
long startTime=System.nanoTime();
long firstOperand=7562;
long secondOperand=1000000000;
long prodect=0;
for (long i =secondOperand; i >0; i–) {
// i–運算子放在變數之後,表示先對原來的值進行其他操作,然後再對自己進行修改
prodect=prodect+firstOperand;
}
long endTime=System.nanoTime();
System.err.println(prodect);
System.out.println(“程式執行時間:”+(endTime-startTime)+“納秒”);
}
}
思路1執行結果:7562000000000
程式執行時間:347281917納秒
思路2:將1後面9個0累加7562次


package com.anji.lianxi;
public class Li13{
public static void main(String[] args) {
/

* 測試乘積,檢視程式執行時間(毫秒為單位)
*/
long startTime=System.nanoTime();
long firstOperand=7562;
long secondOperand=1000000000;
long prodect=0;
for (long i =firstOperand; i >0; i–) {
// i–運算子放在變數之後,表示先對原來的值進行其他操作,然後再對自己進行修改
prodect=prodect+secondOperand;
}
long endTime=System.nanoTime();
System.err.println(prodect);
System.out.println(“程式執行時間:”+(endTime-startTime)+“納秒”);
}
}
思路2執行結果27562000000000
程式執行時間:121111納秒
總結:程式碼的執行是由累加次數過多引起,可見程式的執行演算法是相當重要的
度量演算法的效率
在實現演算法之前度量演算法的效率是有必要的。度量內容:時間複雜度,記憶體複雜度
往往是時間複雜度和記憶體複雜度不可兼得,但是也可以兼得
(演算法的實際需求時間是無法計算的,我們只是用到了一個關於規模的函式,就是說,當時間需求以某種因子增長的時候函式值也是以同樣的因子增長,函式值和時間需求成正比)可以忽略。這個函式度量的就是演算法的時間需求和如何隨問題的規模增長而增長的增長率函式。比較兩個演算法的增長率函式判斷是否更快

估計演算法應估計的是最壞執行時間

計算執行時間:
public class Li15{
public static void main(String[] args) {
int sum=0;
for(int i=0;i<1000;i++){
sum=sum+i;
}
}
}
程式執行時間:忽略宣告和for迴圈中的控制內容,一共執行賦值操作1000+1次,加法操作1000次
賦值和加法時間不同,選擇兩者時間中較大的,假設總次數是n,執行的總時間為:(2n+1)t
不忽略for迴圈中的控制語句,有1次對i賦值,i比較1000+1次,i加法操作n次,i賦值n次,總時間為1+(n+1)+n+n=(3n+2)t
程式執行時間結論:演算法所需時間與2n+1成正比,演算法的增長率函式就是2n+1,同理,演算法與n2+n成正比,增長率函式就是n

2+n。這時可以理解上面的規模的意思,當n的值還能小的時候,就是小規模,演算法所需時間差不多,當n的值很大,就是大規模的時候,演算法所需時間差異明顯。通常情況下,在比較演算法的時候只關心增長率函式中起控制作用的項如,n或者n^2
大O表示法:O(n),O(n^2)或者是O(1)
大O:使用g(n)表示f(n),就是說函式f(n)是g(n)階的和說演算法是g(n)階的相同,大O提供了函式增長率的上界,數學形式是,存在一個正實數c和正整數N,當n大於N時候,存在f(n)<c
g(n),就是說當n足夠大的時候,c
g(n)就是他的上界,f(n)至多是g(n)界的
如何計算c和N的值,計算上界的時候要求對應的值應該儘可能的小,一般情況是用f(n)中較大的項代替較小的項
大O的計算形式:
O(k*g(n))=O(g(n))
O(g1(n))+O(g2(n))=O(g1(n)+g2(n))
O(g1(n))O(g2(n))=O(g1(n)g2(n))
大Omega表示法:
當g(n)=O(f(n))的這裡寫程式碼片時候,f(n)至少是g(n)階的,換句話說就是,當存在c和N的時候,f(N)>c
g(n)對於所有的n>N都成立時。時間需求f(n)不小於他的下界c
g(n),大Omega進行分析用來得到演算法的最小時間要求