優化時間效率的方法
1.常數計算的優化
乙個表示式如果經常包含常數計算
,則由於與數學表示式近似
,易讀性是很好
,但是執行效率卻不高.例如
:for i:=1 to 100 do
for j:=1 to 100 do
begin
tax:=a[i,j]-3200/12;
int:=irate[j]/365/12-i;
b:=tax/3*4;
end在上面的程式中
,常數表示式
3200/12,365*12,4/3
都要重複計算
10000次,
這樣顯然是沒有必要的
.於是可以改為
c1:=3200/12;
mc:=365*12;
c2:=4/3;
for i:=1 to 100 do
for j:=1 to 100 do
begin
tax:=a[i,j]-c1;
int:=irate[j]/mc –i;
b:=tax*c2;
end這樣
c1,c2,mc
只計算一次並保持了原來的易讀性
.而且這樣寫即清楚有提高了程式的效率
2.算術運算的優化
計算機中各種算術運算的效率相差很大
,稍加注意就可以提高程式的效率
.算術運算的速度由高到低為:加法
>
減法>
乘法>
除法>
整數冪運算
>
實數冪運算
所以提高效率的方法是
:(1)
用加法代替乘法
(僅對小整數而言
)3*i
不如i+i+i
(2)以乘法代替除法
a/0.5
不如a*0.2
快(3)
對於多次除法運算使用下面的替換更有意義
a:=2.0/x;
c:=b+d/x;
e:=(f-g)/x;
改寫為:
px:=1/x;
a:=2.0*px;
c:=b+d*px;
e:=(f-g)*px;
(4)盡量少用實數冪
b3.0/2.0
不如sqrt(b3)
(5)高次整數冪應該利用降階操作
p:=a*x^6+b*x^5-c*x^3+d*x^2+e;
不如寫為
:p:=(((a*x+b)*x*x-c)*x+d)*x*x+e;
前者為16
次乘法和
4次加減法
,後者為
6次乘法和
4次加減法相差很多
3.利用非擴充套件迴圈
相比之下在迴圈中
,判斷和增值運算比乙個簡單的賦值語句要費時
,於是可以這樣進行賦值
:for i:=1 to 1000 do
begin
a[i]:=1;
a[i+1]:=1;
a[i+2]:=1;
a[i+3]:=1;
i:=i+4;
end;
這樣就可以減少判斷和增值運算
3/4.
但是這種方法也要適可而止不要寫上
100個賦值語句來讓迴圈只有10次
.在多層前套迴圈中應將迴圈數值大的放在內迴圈中
,迴圈數值小的放在外面
,這樣也可以提高程式執行效率
.還要將於迴圈無關的判斷等操作放在迴圈的外面完成.4.
對於陣列的訪問優化
我們知道計算機存放陣列永遠都是一維的
,多維陣列只是語言上面的約定
,是為了易讀易寫而設定的,根據
pascal
的約定,
陣列的存放順序是
:後繼元素的下標增量從右到左的
.以陣列x為例
,x的順序是
x[1,1]
對應的位址是
1x[1,2]
對應的位址是
2****
對應的位址是
**x[1,500]
對應的位址是
500x[2,1]
對應的位址是
501x[2,2]
對應的位址是
502****
對應的位址是
**x[20,500]
對應的位址是
10000
如果我們存陣列的順序是按照
x[1,1],x[2,1],x[3,1]…..
的順序的時候
,所訪問的位址為
1,501,1001…...
但是資料在機器裡面存放是按照
2kb為乙個分頁的
,因此當定址加上標值的位移量時還要查頁碼
,反覆查頁碼會耗費時間
,所以當元素較多的時候應盡可能的按照順序安排計算
.
劍指offer 優化時間與空間效率
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。coding utf 8 class solution def getuglynumber solution self,ind...
待優化,時間超限 1207
判斷陣列是否所有值均為0,即敵人被全部消滅 intdie blood a,int n 檢查是否有敵人被消滅 if flag 1 return1 else return0 int main while empty a,n 當敵人未被全部消滅時,開槍 printf d n cnt return0 第二種...
js格式化時間的方法
js格式化時間的方法 對date的擴充套件,將 date 轉化為指定格式的string 月 m 日 d 小時 h 分 m 秒 s 季度 q 可以用 1 2 個佔位符,年 y 可以用 1 4 個佔位符,毫秒 s 只能用 1 個佔位符 是 1 3 位的數字 例子 new date format yyyy...