關於C、Java、Python程式執行耗時及記憶體用量

賈祥啊發表於2021-10-17

  最近沒有刷題,而是在PTA找幾個題目尋找有關程式輸入流問題以及各種語言在執行時對計算機消耗記憶體的問題,

以免很多同學解題的時候發現自己做的對但是出現執行超時的問題;針對執行記憶體,肯定用C/C++的同學很少遇到這

樣的問題,但是使用Java的同學可能經常遇到此類問題並且優化不出更好的方法,在這裡,我會針對PTA中A-B問題

對三種語言正確解題方法和三種語言的程式在執行時消耗資源的相互對比。

 

題目:L1-011 A-B (20 分)

本題要求你計算AB。不過麻煩的是,A和B都是字串 —— 即從字串A中把字串B所包含的字元全刪掉,剩下的字元組成的就是字串AB。

輸入格式:

輸入在2行中先後給出字串A和B。兩字串的長度都不超過104,並且保證每個字串都是由可見的ASCII碼和空白字元組成,最後以換行符結束。

輸出格式:

在一行中列印出AB的結果字串。

輸入樣例:

I love GPLT! It's a fun game!
aeiou

輸出樣例:

I lv GPLT!  It's  fn gm!

 

題意總結:這道題的大概意思就是輸入一行字串,回車,在輸入一行字串,回車,輸出最開始輸入的字串,但是不能出現第二行輸入的字串的字元

 

很簡單的一道L1題,複雜度在O(n)並且 符合題意就能滿分

 

解題步驟:建立一個能儲存char型別總長度的int陣列,將B串的各個字元轉換為數字對應在int陣列的index賦值為1,迴圈判斷A串各個字元在int陣列不為1就輸出

 

C語言解題程式碼:

 

 

 C語言提交結果:

 

 

 Python解題程式碼:

 

 

 

 Python語言提交結果:

 

 

 

 

Java語言題解:

 

 

 

 

Java語言提交結果:

 

 

 

從上面的資料看得出來,C語言的程式耗時最短,記憶體消耗最小,因為C語言的編譯原理的性質(直接編譯為obj連結Link轉為單獨的可執行exe)

所以不會佔用太多記憶體,然而java和python的原理都是目標程式放到虛擬機器機執行(JVM&PYM),所以虛擬機器本身也會佔用點記憶體空間,加上

程式本身的記憶體,所以兩種語言相比C語言佔用記憶體和消耗時間都會更多。肉眼可見Python的耗時與記憶體都小於Java,我並不知道是JVM虛擬機器

本身沒有優化好或者還是其他方面原因,但是Python的程式確實在耗時與記憶體都小於Java。其次Java在解題中若使用了Scanner的輸入方法會

導致程式有兩處的執行超時,使用了更好的輸入流(BufferReader)後,還是會有一處執行超時,所以我的評價是在解題中最好放棄使用Java,

因為Java不僅僅是在輸入方面出現過超時,在迴圈、if-else等方面也有類似情況,使用c或python就不會出現類似問題

 

相關文章