1. 程式人生 > >關於算法運行時間以及“管道”為什麽引入

關於算法運行時間以及“管道”為什麽引入

cin blog for sed 常數 scanf 結果 運行時 pre

1. 關於算法運行時間以及“管道”為什麽引入。

我以前畢設比較不同譯碼算法的時候,直接用一個clock()來比較不同算法運行速率。現在想起來,這是及其錯誤了!

《算法競賽入門經典》P64

一個程序中計時函數clock()的使用。該函數返回程序目前為止運行的時間。這樣,在程序結束之前調用此函數,便可獲得整個程序的運行時間。這個時間除以常數CLOCKS_PER_SEC之後得到的值以“秒”為單位。


提示2-17:可以使用time.h和clock()函數獲得程序運行時間。常數CLOCKS_PER_SEC和操作系統相關,請不要直接使用clock()的返回值,而應總是除以CLOCKS_PER_SEC。




輸入“20”,按Enter鍵後,系統瞬間輸出了答案820313。但是,輸出的Time used居然不是0!其原因在於,鍵盤輸入的時間也被計算在內——這的確是程序啟動之後才進行的。為了避免輸入數據的時間影響測試結果,可使用一種稱為“管道”的小技巧:在Windows命令行下執行echo 20|abc,操作系統會自動把20輸入,其中abc是程序名 。如果不知道如何操作命令行,請參考附錄A。筆者建議每個讀者都熟悉命令行操作,包括Windows和Linux。



2. 輸入輸出框架

在做CCF的模擬題的題一,我常用的一個方法是

int n;
cin>>n;
int A[n];

int i;
for(i=0
;i<n;i++){ cin>>A[i]; }

其實這樣往往遇到一個問題,如果輸入沒有先輸入n這一個步驟,而是任意輸入的數字流,就不知所措了。

在《算法競賽入門指導》P66,有如下

while(scanf("%d", &x) == 1)
{
s += x;
if(x < min) min = x;
if(x > max) max = x;
n++;
}
printf("%d %d %.3f\n", min, max, (double)s/n);

可以用while(。。。!=0)之類的判斷吧。

對於C語言

還記得scanf的輸入格式嗎?空格、TAB和回車符都是無關緊要的,所以按Enter鍵並不意味著輸入的結束。那如何才能告訴程序輸入結束了呢?

提示2-19:在Windows下,輸入完畢後先按Enter鍵,再按Ctrl+Z鍵,最後再按Enter鍵,即可結束輸入。在Linux下,輸入完畢後按Ctrl+D鍵即可結束輸入。

對於C++

cin會在空格位置就停止的,getline才可以讀到回車,網上看到的,以後註意。

關於算法運行時間以及“管道”為什麽引入