演算法於效率(轉)
演算法於效率(轉)[@more@]演算法與效率
/* 和以前一樣,這裡的程式碼也是從記事本中貼上來的,程式碼無法縮排,sorry了 ^_^ */
現在我們要寫的程式就是將檔案內的數字讀出來,將char轉化為int。在C中,讀入的char字元雖然為“12345”但是在int中則仍然為ASCII字元,想要將讀入的char轉化為int,我們可以寫一段程式,採用最簡單的方法,莫過於將程式中的數字裝入陣列,然後按位乘以10並相加,請看以下程式碼:
#include
#include
#include
void main()
{
char c, *ch; int j=0;
ch = new char[80];
ifstream i("test", ios::in | ios::binary);
if(!i) { cerr<
while(i.get(c))
{
if(c>=0x30 && c<=0x39) ch[j++]=c;
} ch[j]='';
int k=0; int tmp, ct=j-1, b;
for(int i=0; i<=j-1; i++)
{
ct--;
if(ch[i]==0x30) tmp=0;
if(ch[i]==0x31){ tmp=1;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x32){ tmp=2;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x33){ tmp=3;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x34){ tmp=4;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x35){ tmp=5;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x36){ tmp=6;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x37){ tmp=7;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x38){ tmp=8;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x39){ tmp=9;
for(b=0; b<=ct; b++)
tmp*=10; }
k+=tmp;
}
cout<}
這幾乎是最蠢的演算法,幾乎每讀入一個數字,全部採用if條件判斷,相應的效率肯定無法提高,在對於程式速度要求很高的情況下,例如遊戲程式,肯定無法滿足要求。
在這裡,我們可以使用結構來提高速度,滿足要求,在struct中定義字元型和int型,相對地將每個字元對應結構中的int,然後掃描該結構,請看下列程式:
#include
#include
#include
struct X {
char Char;
int num;
};
X ex[10]={
{0x30, 0}, {0x31, 1}, {0x32, 2}, {0x33, 3}, {0x34, 4},
{0x35, 5}, {0x36, 6}, {0x37, 7}, {0x38, 8}, {0x39, 9}
};
void main()
{
char c, *ch; int j=0;
ch = new char[80];
ifstream i("test", ios::in | ios::binary);
if(!i) { cerr<
while(i.get(c))
{
if(c>=0x30 && c<=0x39) ch[j++]=c;
} ch[j]='';
int k=0; int tmp, ct=j-1, b;
for(int i=0; i<=j-1; i++)
{
ct--;
for(int p=0; p<=9; p++){
if(ch[i]==ex[p].Char)
{
tmp = ex[p].num;
for(b=0; b<=ct; b++)
tmp*=10;
}
}
k+=tmp;
}
cout<}
這裡,在for迴圈中,掃描結構中的資料,如果與陣列中對應則進行處理,因為在結構中已經定義了相對應的整型,所以處理速度非常快。
這就是演算法所帶來的程式效率,在Windows時代,視覺化程式設計幾乎忽略了演算法的存在,雖然對於程式設計人員來說是個省心的程式設計方法,但是對於整個程式來說無疑是一大敗筆,GNU的高階程式設計師們曾經說過:“最好的程式就是:聰明的資料結構+笨拙的程式碼”。
以上的程式速度很快對嗎?不過,還有更精巧,速度更快的演算法,請看下列程式:
#include
#include
void main ()
{
char ch; int j=0, tmp;
ifstream i(test, ios::in | ios::binary);
if(!i) { cerr<
while(i.get(ch))
{
if(ch>=0x30 && ch<=0x39)
j=j*10+((int)ch-'0');
}
cout<}
幾乎無須掃描和比較任何資料就可快速計算出相對數字,這段程式碼比上面兩段程式碼執行效率都快幾乎15%。
這就是不同演算法帶來的不同效率,在大工程中,您就可以看出它們之間的區別了。
DarkSpy於1999/12/25
/* 和以前一樣,這裡的程式碼也是從記事本中貼上來的,程式碼無法縮排,sorry了 ^_^ */
現在我們要寫的程式就是將檔案內的數字讀出來,將char轉化為int。在C中,讀入的char字元雖然為“12345”但是在int中則仍然為ASCII字元,想要將讀入的char轉化為int,我們可以寫一段程式,採用最簡單的方法,莫過於將程式中的數字裝入陣列,然後按位乘以10並相加,請看以下程式碼:
#include
#include
#include
void main()
{
char c, *ch; int j=0;
ch = new char[80];
ifstream i("test", ios::in | ios::binary);
if(!i) { cerr<
while(i.get(c))
{
if(c>=0x30 && c<=0x39) ch[j++]=c;
} ch[j]='';
int k=0; int tmp, ct=j-1, b;
for(int i=0; i<=j-1; i++)
{
ct--;
if(ch[i]==0x30) tmp=0;
if(ch[i]==0x31){ tmp=1;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x32){ tmp=2;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x33){ tmp=3;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x34){ tmp=4;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x35){ tmp=5;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x36){ tmp=6;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x37){ tmp=7;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x38){ tmp=8;
for(b=0; b<=ct; b++)
tmp*=10; }
if(ch[i]==0x39){ tmp=9;
for(b=0; b<=ct; b++)
tmp*=10; }
k+=tmp;
}
cout<
這幾乎是最蠢的演算法,幾乎每讀入一個數字,全部採用if條件判斷,相應的效率肯定無法提高,在對於程式速度要求很高的情況下,例如遊戲程式,肯定無法滿足要求。
在這裡,我們可以使用結構來提高速度,滿足要求,在struct中定義字元型和int型,相對地將每個字元對應結構中的int,然後掃描該結構,請看下列程式:
#include
#include
#include
struct X {
char Char;
int num;
};
X ex[10]={
{0x30, 0}, {0x31, 1}, {0x32, 2}, {0x33, 3}, {0x34, 4},
{0x35, 5}, {0x36, 6}, {0x37, 7}, {0x38, 8}, {0x39, 9}
};
void main()
{
char c, *ch; int j=0;
ch = new char[80];
ifstream i("test", ios::in | ios::binary);
if(!i) { cerr<
while(i.get(c))
{
if(c>=0x30 && c<=0x39) ch[j++]=c;
} ch[j]='';
int k=0; int tmp, ct=j-1, b;
for(int i=0; i<=j-1; i++)
{
ct--;
for(int p=0; p<=9; p++){
if(ch[i]==ex[p].Char)
{
tmp = ex[p].num;
for(b=0; b<=ct; b++)
tmp*=10;
}
}
k+=tmp;
}
cout<
這裡,在for迴圈中,掃描結構中的資料,如果與陣列中對應則進行處理,因為在結構中已經定義了相對應的整型,所以處理速度非常快。
這就是演算法所帶來的程式效率,在Windows時代,視覺化程式設計幾乎忽略了演算法的存在,雖然對於程式設計人員來說是個省心的程式設計方法,但是對於整個程式來說無疑是一大敗筆,GNU的高階程式設計師們曾經說過:“最好的程式就是:聰明的資料結構+笨拙的程式碼”。
以上的程式速度很快對嗎?不過,還有更精巧,速度更快的演算法,請看下列程式:
#include
#include
void main ()
{
char ch; int j=0, tmp;
ifstream i(test, ios::in | ios::binary);
if(!i) { cerr<
while(i.get(ch))
{
if(ch>=0x30 && ch<=0x39)
j=j*10+((int)ch-'0');
}
cout<
幾乎無須掃描和比較任何資料就可快速計算出相對數字,這段程式碼比上面兩段程式碼執行效率都快幾乎15%。
這就是不同演算法帶來的不同效率,在大工程中,您就可以看出它們之間的區別了。
DarkSpy於1999/12/25
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-962547/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Windows程式效率 (轉)Windows
- 多種排序演算法的效率觀察排序演算法
- 玩轉 chrome 效率起飛Chrome
- 關於演算法的一些想法 (轉)演算法
- 素數推斷演算法(高效率)演算法
- SIFT演算法與SURF演算法特徵檢測效率對比演算法特徵
- 用好Word模板 提高Word操作效率(轉)
- 關於JS迴圈效率小實驗JS
- 關於工作效率的心得分享
- run_stats---sql效率測試工具(轉)SQL
- 轉 碼農提高工作效率
- 利用並行提高sql執行效率(轉)並行SQL
- 【轉】UNION效率比UNION ALL效率高——SQL優化之Everything is possibleSQL優化
- 高效率使用隧道轉發爬蟲代理爬蟲
- 轉換思維提升效率的學習方法
- 提高linux命令列下工作效率(轉)Linux命令列
- 提升 UNIX 中檔案系統使用效率(轉)
- 讓我們重視程式執行效率 (轉)
- 基於流程管理,提高工作質量和效率
- 關於資料字典的查詢效率優化優化
- 關於效率、程式與生活的一些思考
- 關於學習效率問題,一點點心得
- 前端演算法題 | 這道題效率最高的演算法,你可能不知道?前端演算法
- [轉載] PHP 基於字典樹演算法實現搜尋聯想功能PHP演算法
- 資料結構-各種排序演算法效率對比圖資料結構排序演算法
- python實現高效率的排列組合演算法Python演算法
- 轉:LruCache演算法演算法
- 旋轉演算法演算法
- DES演算法 (轉)演算法
- php中獎概率演算法,可用於大轉盤、九宮格、翻牌、刮刮卡等抽獎演算法PHP演算法
- 效率裝置崗位比例定員法(轉載)
- Oracle效能最佳化之提升block的效率(轉)OracleBloC
- 用自動ftp提高工作效率(轉)FTP
- 五種方法幫你提高技術支援效率(轉)
- Type Traits 例項,提高效率 (轉)AI
- Duet AI有利於提高使用者工作效率AI
- 關於效率的一些思考:節點創新
- 關於資料字典的查詢效率最佳化