1.如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 為自然數),如何求出所有a、b、c可能的組合?
如上:a+b+c=1000, a平方+b平方=c平方 求出所有abc可能的組合?
思路方法:用枚舉法,a,b,c 一個一個試。
//枚舉法:
//a=0 ... a=1000;
//b=0 ... c=1000;
//c=0 ... c=1000;
//三個嵌套循環實現
//方法一:三個嵌套循環實現
$start = time();
echo "方法一:開始運行...\r\n";
for($a=0;$a<1001;$a++)
{
for($b=0;$b<1001;$b++)
{
for($c=0;$c<1001;$c++)
{
if($a+$b+$c==1000 && $a*$a+$b*$b==$c*$c)
{
echo "a=$a , b=$b , c=$c \r\n";
}
}
}
}
$end = time();
$total = $end-$start;
echo "開始時間:".date("Y-m-d H:i:s",$start)."\r\n";
echo "結束時間:".date("Y-m-d H:i:s",$end)."\r\n";
echo "共執行時間:$total 秒\r\n";
//共執行時間:34 秒
方法一:時間復雜度計算
關於如上程序方法一:時間復雜度的計算與大O表示法理解
時間復雜度 T : 一層循環執行1000次, 二層循環執行1000次, 三層循環執行1000次, if條件兩行代碼總體看做兩個步驟 2次
時間復雜度執行的步驟可看做為:
T = 1000*1000*1000*2
如果 a+b+c= 2000
時間復雜度則可看做為:
T = 2000*2000*2000*2
如果 a+b+c= 3000
時間復雜度則可看做為:
T = 3000*3000*3000*2
如果 a+b+c= N有關時間復雜度理解比較枯燥麻煩:具體相關定義如下:
時間復雜度則可看做為:
T = N*N*N*2
T(n)=N^3*2
T(n)=N^3*10 (細化分:不是很關注的,對於這個)
T(n)=N^3*k (k 細分的系數對,可以忽略,不考慮那么細致可以看做 T(n) = N^3)
系數對數據走勢並不影響,可以忽略,主要是和N有關的幾次方影響數據走向的態勢。
漸進函數與時間復雜度
T(n) = k*g(n)+c k常數,c實常數
g(n) = N^3
g(n) 叫作 T(n) 的漸進函數

如上實例的:g(n) 就可以看作是 時間復雜度T(n) 的大O表示法, n就是解決問題的規模
時間復雜度
T(n) = k*g(n)+c
大O表示法就是:
O(n) = g(n) = N^3 (忽略掉常數和實常數)
//方法二:分析題目得出結論 c= 1000-a-b, 優化程序!
$start = time();
echo "方法二:開始運行...\r\n";
for($a=0;$a<1001;$a++)
{
for($b=0;$b<1001;$b++)
{
$c = 1000-$a-$b;
if($a*$a+$b*$b==$c*$c)
{
echo "a=$a , b=$b , c=$c \r\n";
}
}
}
$end = time();
$total = $end-$start;
echo "開始時間:".date("Y-m-d H:i:s",$start)."\r\n";
echo "結束時間:".date("Y-m-d H:i:s",$end)."\r\n";
echo "共執行時間:$total 秒\r\n";
//共執行時間:0 秒
方法二:時間復雜度計算:
T(n) = n * n + (1 + max(1,0));
= n * n + 2
= n^2 + 2
則大O表示法,忽略常數就是:
T(n) 大O表示法: O(n) = n^2
時間復雜度的幾條基本計算規則
- 基本操作,即只有常數項,認為其時間復雜度為O(1)
- 順序結構,時間復雜度按加法進行計算
- 循環結構,時間復雜度按乘法進行計算
- 分支結構,時間復雜度取最大值
- 判斷一個算法的效率時,往往只需要關注操作數量的最高次項,其它次要項和常數項可以忽略
- 在沒有特殊說明時,我們所分析的算法的時間復雜度都是指最壞時間復雜度