統計演演算法

統計演演算法

在給定的範圍內求出符合設定條件的記錄個數。

基本思想


用一個條件語句判斷當前記錄是否符合給定條件,符合則統計個數加一。用循環實現對所有記錄的操作。

舉例說明


例一、從鍵盤敲進任意個(少於255個)字元,然後求出其中某一個字母的個數(如大寫字母A)。
分析:用一個字元串變數來接受從鍵盤輸入的字元,然後從第一個字元開始對每一個字元進行處理,如果是A則個數加一,最後把總的統計個數輸出。
程序代碼:
programjjzx(input,output);
type
str=string[255];
var
st:str;
n,i,j:integer;
begin
writeln(‘請輸入一行字元:‘);
readln(st);
j:=lenth(st);{把字元串的實際長度賦給j}
n:=0;
fori:=1tojdo
iford(st[i])=65thenn:=n+1;
writeln(‘你輸入的字元是:‘,st);
writeln((‘其中字元A的個數和:‘,n)
end.

使用方法


1.使用<time.h>的clock()函數
模板程序:
#includeusingnamespacestd;intmain()
{
time_tt;
//一些初始化的東西
t=clock();//開始時候的GET,clock()函數用於獲得系統當前時間
//你需要計時的代碼,演演算法,語句等等
cout<<"Timeconsumed:"<
//結束時候獲得差值
return0;
}
用clock()函數能夠精確到1ms,但是它不是標準化所推薦的而且工業化程序也不容許使用
2.使用GetTickCount
這個和clock()相同,只是它比較標準,GetTickCount可以到18-20ms進度
3.彙編指令
前面的都是在MS級別逗留的計時,當我們需要統計一個語句使用時間的時候,我們通常經過多次循環來求總時間。
缺點:1)由於需要統計的語句耗時可能比循環需要的JMP,INC指令耗時還要少(尤其JMP指令很慢),所以統計並不精確,大多耗時為循環使用時間
2)編譯器對於循環有優化,可能與單語句的彙編代碼不同造成統計結果無參考意義
所以我們能不能避免這些問題呢?可以使用
直接讀取CPU開機以來執行的機器周期數,一條彙編指令:RDTSC(就是ReaDTimeStampCount)精度可以達到ns級別。(準確地說精度是1/你的CPU的時鐘頻率,這也是極限)使用:longHighStart,LowStart,HighEnd,LowEnd;
longnumhigh,numlow;__asm//使用彙編混編
{
RDTSC
movHighStart,edx
movLowStart,eax
}
//此處放上你的演演算法或代碼,語句等等
__asm
{
RDTSC
movHighEnd,edx
movLowEnd,eax
//獲取兩次計數器值得差
subeax,LowStart
cmpeax,0
jgL1
negeax
jmpL2L1:movnumlow,eax
L2:sbbedx,HighStart
movnumhigh,edx
}unsignedlongtimer=(numhigh<<32)+numlow;//得出最終結果(單位時NS
  • 目錄