#16319: 感想:執行速度


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
c381. 聖經密碼 -- 板橋高中教學題 | From: [27.52.77.116] | 發表日期 : 2018-12-18 19:45

這種測資超大的題目,用函式容易TLE,但是用指標就很快

例如串接字串,用C 的 strcat()會TLE,用指標就超快

真是令人讚嘆.........

 
#16322: Re:感想:執行速度


OwO310659 (OwO)

學校 : 新北市立板橋高級中學
編號 : 58647
來源 : [118.150.111.60]
最後登入時間 :
2024-04-25 01:16:40
c381. 聖經密碼 -- 板橋高中教學題 | From: [106.105.27.148] | 發表日期 : 2018-12-18 21:00

主要是因為兩者演算法上的差異,

由於 char[] 本身並沒有儲存儲存 字串長度/字串結尾位址 的資料,
所以當執行 strcat(s, t) 時,
必需先遍歷一次 s 找到 s 的結尾('\0'),
再將 t 的字元複製至 s 中,
其時間複雜度為 O(|s|+|t|) , (其中|s|代表 s 的字串長度)
假設在合併字串時都合併至同個 大字串S ,
這樣總時間複雜度最糟可能會是 O(|S|^2) , (其中|S|代表大字串長度, 也就是所有字串長度總和)
以本題的範圍來說顯然會 TLE 沒錯~

但如果事先用指標紀錄每個 char[] 結尾的位置,
那麼在合併 s, t 時就不需要遍歷一次 s 來找 s 的結尾('\0'),
可以直接使用指標O(1)查詢 s 的結尾,
於是合併的時間複雜度就降為 O(|t|) ,
這樣一來就算是合併至同個 大字串S ,
由於合併的時間複雜度並不受 |s| 影響,
所以總時間複雜度降為 O(|S|) ~

兩者的演算法事實上並不相同~
所以使用內建 函數/容器 時要看使用時機的唷~

以上路過稍微補充說明~ OwO

 
ZeroJudge Forum