#25599: 輸入


fire5386 (becaidorz)

學校 : 國立清華大學
編號 : 115822
來源 : [140.114.217.8]
最後登入時間 :
2024-04-13 22:06:23
f929. 程式老師的作業 | From: [61.230.21.131] | 發表日期 : 2021-06-05 18:15

輸入有本身已經是0又要改成0的,所以用priority_queue不能通過因為會重複計算,用set可以避免重複的index

 
#25601: Re:輸入


rollfc (胖胖貓)

學校 : 國立清華大學
編號 : 81012
來源 : [36.229.32.12]
最後登入時間 :
2024-04-25 19:27:08
f929. 程式老師的作業 | From: [114.34.200.113] | 發表日期 : 2021-06-05 22:16

這個說法不對,你可以發現同樣是 0.2s 的時間,有人的記憶體耗量是 9MB 但也存在 5MB

這是選擇資料結構的差異:set 和 priority_queue,兩者在新增數字時時間都是 ㏒N,兩者乍看下時間一樣但有常數差異,

這部份我個人寫的高水準題目不多所以想不起來哪些題目是有上述決定性的差異,可能要在競程部份高手回答。

回到 set 的 associative container 基礎實作是紅黑樹,牽涉到維護的結構需要的記憶體空間較大。

至於提到的問題怎麼用 priority_queue 解決?談到一個概念惰性更新( Lazy Update ),忘記在那邊看到這個名詞... ?

priority_queue 維護數值是 0 的位置,但要刪除時並不會馬上(也無法)從 priority_queue 移除那個位置,

而是等到需要存取最小的位置時再去確認 那個位置的值是不是真的是 0,不是就 pop 掉直到 priority_queue 空掉或是符合條件

新增數字時也只要先確認那個位置是不是已經存在 priority_queue 即可。

 
#25606: Re:輸入


911091@stu.cchs.chc.edu.tw (莊明達)

學校 : 精誠中學
編號 : 134004
來源 : [111.246.12.50]
最後登入時間 :
2023-02-16 00:16:13
f929. 程式老師的作業 | From: [125.231.146.115] | 發表日期 : 2021-06-06 16:58

這個說法不對,你可以發現同樣是 0.2s 的時間,有人的記憶體耗量是 9MB 但也存在 5MB

這是選擇資料結構的差異:set 和 priority_queue,兩者在新增數字時時間都是 ㏒N,兩者乍看下時間一樣但有常數差異,

這部份我個人寫的高水準題目不多所以想不起來哪些題目是有上述決定性的差異,可能要在競程部份高手回答。

回到 set 的 associative container 基礎實作是紅黑樹,牽涉到維護的結構需要的記憶體空間較大。

至於提到的問題怎麼用 priority_queue 解決?談到一個概念惰性更新( Lazy Update ),忘記在那邊看到這個名詞... ?

priority_queue 維護數值是 0 的位置,但要刪除時並不會馬上(也無法)從 priority_queue 移除那個位置,

而是等到需要存取最小的位置時再去確認 那個位置的值是不是真的是 0,不是就 pop 掉直到 priority_queue 空掉或是符合條件

新增數字時也只要先確認那個位置是不是已經存在 priority_queue 即可。


記憶體9、5MB的差別不一定是一個用set另一個用priority_queue,像我用bitset來存array、用set來做,就是5.5MB

 
ZeroJudge Forum