1. 程式人生 > >避免超時方法二 :優化資料輸入,淺談getchar,cin,scanf,fread

避免超時方法二 :優化資料輸入,淺談getchar,cin,scanf,fread

做ACM的題目時候,輸入輸出是很重要的,特別輸入的數字很多的時候,很容易影響整個程式的執行時間,下面淺淡C語言c++的輸入。

1.最基礎的當然是scanf,這裡跟getchar一起講。我一開始很疑惑,使用scanf ("%s",&s)將一個字串讀入s和用getchar一個一個字元讀入有什麼區別呢?

在理論上,其實沒什麼太大的區別,而相比而言,getchar會快一點,這就是輸入掛的原理了

2.其實最主要是想說cin和scanf的比較,cin >> s;看起來真的很方便,不用打格式控制符,也正是因為這一點,每次讀入數字或者字元,他都要判斷後面那個s是什麼型別,在某些題目上面他會變得很容易超時,換成scanf效率大大增加。這樣的題目其實不常見,但不代表沒有。

3.最大的殺器來了,就是讀入檔案的fread,這個函式不是一般的快,我看網上別人做得測試,這個可以比scanf快個兩秒,scanf比cin快個四秒,當然,這個測試的資料是超級大的,否則不會有這個明顯的間隔。

一般用cin和scanf都是不會超時的,我們不應該放太大的精力在這方面上,scanf基本可以做到輸入方面不拖後腿了,最重要的還是靠演算法裡面的優化。

最後的大殺器,輸入掛,在輸入資料極多的情況下可以有很好的優化效果,這裡只給出了int的獲取方法。要呼叫的時候直接在主函式寫  a = input(); 即可。

輸入掛的程式碼:(能比scanf還要快,有一道線段樹的題目輸入十分大,用輸入掛能比用scanf快0.1s)

int input()  
{  
    int p = 0, sum = 0, MIN = INF;  
    char ch;  
    ch = getchar();  
    while(1)
    {
    	if(ch == '-' || (ch >= '0' && ch <= '9'))
    		break;
    	ch = getchar();
	}
        
    if(ch == '-')  
    {  
        p = 1;  
        ch = getchar();  
    }  
    while(ch >= '0' && ch <= '9')  
    {  
        sum = sum * 10 + ch - '0';  
        ch = getchar();  
    }  
    return p ? -sum : sum;  
}  
究極讀入掛fread
const int MAXSIZE=100000020;
int bufpos;
char buf[MAXSIZE];
void iinit(){
    buf[fread(buf,1,MAXSIZE,stdin)]='\0';
    bufpos=0;
}
int readint(){
    int val=0;
    for(;buf[bufpos]<'0' || buf[bufpos]>'9';bufpos++);
    for(;buf[bufpos]>='0' && buf[bufpos]<='9' ;bufpos++)
        val=val*10+buf[bufpos]-'0';
    return val;
}

使用fread是先將全部輸入直接存到buf這個數組裡面,然後使用a = readint()這樣的格式提取存進去的整數。

使用fread效率非常高,但是空間花銷很大,並不是每道題都適合的。



相關推薦

避免超時方法 優化資料輸入getcharcinscanffread

做ACM的題目時候,輸入輸出是很重要的,特別輸入的數字很多的時候,很容易影響整個程式的執行時間,下面淺淡C語言c++的輸入。1.最基礎的當然是scanf,這裡跟getchar一起講。我一開始很疑惑,使用scanf ("%s",&s)將一個字串讀入s和用getchar一

MySQL性能優化方法表結構優化

嚴格 字符類 datetime 分時 問題: utf 重建表 數據類型 如果 原文鏈接:http://isky000.com/database/mysql-perfornamce-tuning-schema 很多人都將 數據庫設計範式 作為數據庫表結構設計“聖經”,認為只要

作業優化購物車用戶入口1.將商品的信息存到文件中;2.將已經購買的商品、余額記錄存到文件中。商家入口1.可以添加商品;2.可以修改商品的價格

car brush 薪水 blog and not else iphone client #Author:AXIN #Date:2017/5/22 12:04 #優化版的購物車 #用戶入口: #1.商品的信息存到文件裏 #2.已購商品,余額記錄 #商家入口: #1.可以添

頭像上傳 方法from表單 方法ajax

AD AS error 移動 tar 屬性 win 類型 pos 方法一:from表單 html 設置form表單,內包含頭像預覽div,內包含上傳文件input 設置iframe用來調用函數傳參路徑 <!--表單提交成功後不跳轉處理頁面,而是將處理

聚類演算法之DBSCAN演算法之高維資料剪枝應用NQ-DBSCAN

一、經典DBSCAN的不足 1.由於“維度災難”問題,應用高維資料效果不佳 2.執行時間在尋找每個點的最近鄰和密度計算,複雜度是O(n2)。當d>=3時,由於BCP等數學問題出現,時間複雜度會急劇上升到Ω(n的四分之三次方)。 二、DBSCAN在高維資料的改進 目前的研究有

python_魔法方法()算術運算

strong 操作符 數值 rac previous += sub 註意 rsh python2.2之後,對類和類型做了同意,將int()、float()、str()、list()、touple()這些BIF轉換為工廠函數 >>> type(len)

Spark優化(九)優化資料結構

優化資料結構 Java中,有三種類型比較耗費記憶體:   物件,每個Java物件都有物件頭、引用等額外的資訊,因此比較佔用記憶體空間。 字串,每個字串內部都有一個字元陣列以及長度等額外資訊。 集合型別,比如HashMap、LinkedList等,因為

Filecoin&Filenet評說資料黑產看為什麼區塊鏈3.0會以挖掘資料價值為突破口

昨天,瞎聊了幾句共享儲存兩個明星專案filecoin和filenet,沒想到共享儲存這條鏈上的朋友太多,快被口水碰死了,好吧,為了把屁股搽乾淨,再多說幾句吧。 首先推薦兩篇文章: 虎嗅:網絡黑產、爭奪用戶資訊背後的資料之戰 新浪:資料黑產調查:猖獗內鬼、黑客師徒與“灰色暴發戶” 不看

MySQL慢查詢基礎優化資料訪問

對於低效的查詢: 1、確認程式是否在檢索大量超過需要的資料 2、確認mysql伺服器層是否在分析大量超過需要的資料行 MySQL是否在掃描額外的記錄 最簡單的很亮查詢開銷的三個指標: 響應時間、掃描的行數、返回行數 這3個指標會記錄到MySQL慢查詢日誌中,所以檢查慢

【有監督分箱】方法 Best-KS分箱

銜接上一篇工作:https://blog.csdn.net/hxcaifly/article/details/80203663 變數的KS值 KS(Kolmogorov-Smirnov)用於模型風險區分能力進行評估,指標衡量的是好壞樣本累計部分之間的差距 。KS值越大,表示該變數

moquette改造筆記()優化BrokerInterceptor notifyTopicPublished()邏輯

發現問題 下面部分是io.moquette.spi.impl.BrokerInterceptor.java部分原始碼 @Override public void notifyClientConnected(final MqttConnectMessage m

Spark效能優化優化資料結構

如何優化資料結構? 1、優先使用陣列以及字串,而不是集合類。也就是說,優先用array,而不是ArrayList、LinkedList、HashMap等集合。 比如,有個List list = new

深度學習總結優化

對應程式碼 梯度下降 附梯度下降w變化曲線用於對比 momentum 動量法,原理在於一個方向的速度可以積累,而且越積累越大;通過不同訓練樣本求得梯度時,在最優的方向的梯度,始終都會增大最優方向上

Filecoin&Filenet評說資料黑產看為什麼區塊鏈3.0會以挖掘資料價值為突破口

昨天,瞎聊了幾句共享儲存兩個明星專案filecoin和filenet,沒想到共享儲存這條鏈上的朋友太多,快被口水碰死了,好吧,為了把屁股搽乾淨,再多說幾句吧。 首先推薦兩篇文章: 虎嗅:網絡黑產、爭奪用戶資訊背後的資料之戰 新浪:資料黑產調查:猖獗內鬼、黑客師徒與“灰色

Python排序演算法[]測試資料的迷霧散去

演算法試驗中不僅僅要嘗試使用不同的寫法,更要注意測試所用資料的規律性,它們都會直接影響測試結果。 在上一篇文章《Python 排序演算法[一]:令你茅塞頓開,卻又匪夷所思》中我們學習了排序演算法中比較費時間的三種:氣泡排序、選擇排序、插入排序。並且在測試過程中發現了匪夷所思的問題,但是這都難不倒諸

java基礎梳理基本資料型別、變數

1、基本資料型別  分為四大類: 佔用位元組數①整數型別byte:位元組型別 1short:短整型 2int:整型 4long:長整型 8②浮點數型別float:單精度                

Python練習題4(列表去重)[5,3,4,'ok',4,3,'abc',8,52,'ok']去除列表中重複內容 方法使用set 方法不使用set自己寫方法

方法一:利用集合去重 1 list1 = [5,3,4,'ok',4,3,'abc',8,52,'ok'] 2 list1=list(set(list1)) 3 print(list1) 方法二:此方法略微冗餘,先判斷元素是否重複,再將重複元素提取並儲存到新列表中,再for 新建的列表元素,刪除

慢查詢基礎優化資料訪問

查詢效能低下最基本的原因是訪問的資料太多。某些查詢不可避免的需要篩選大量資料,但這並不常見。大部分效能低下的查詢都可以通過減少訪問的資料量的方式進行優化 對於低效的查詢,可以通過下面兩個步驟進行分析: 確認應用程式是否在檢索大量超過需要的資料。這通常意味著訪問了太多的行,但有時候也可能是訪

java io系列14DataInputStream(資料輸入流)的認知、原始碼和示例

本章介紹DataInputStream。我們先對DataInputStream有個大致認識,然後再深入學習它的原始碼,最後通過示例加深對它的瞭解。 轉載請註明出處:http://www.cnblogs.com/skywang12345/p/io_14.html DataInputStream

C#進階系列——動態Lamada(優化

前言:前幾天寫了一篇動態Lamada的文章C#進階系列——動態Lamada,受園友的啟發,今天打算來重新優化下這個動態Lamada的工具類。在此做個筆記,以免以後忘了。 一、原理分析 上篇裡面我們說了動態Lamada的使用必要性以及使用場景,但是感覺用在專案裡面還不太方便,最難用的就是需要傳遞屬性名稱的字