演算法於效率(轉)

subid發表於2007-08-16
演算法於效率(轉)[@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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-962547/,如需轉載,請註明出處,否則將追究法律責任。

相關文章