Wednesday, July 19, 2006

1008 既啟示

昨日講既 Bug,
終於發現到問題係邊。
發現既原因係我問 Setter 拿 Test Case 自己試,
然後發現既。

話說佢要我找個 Mode 出黎,
最多三萬個數,
Pascal 既 Integer Type 夠晒裝。
而數既 Range 由 0.00 到 100.00,
只係去到小數點後兩個位,
亦即係話,
只有 10001 個唔同既數。

比較慢既方法係,
讀入第 i 個數,
同之前 i - 1 個數比較(當然用 Array 裝),
如果曾經出現過,
就將那個 Entry 加 1,
未出現過既話,
就 Add 個新 Entry。
咁樣做法,
Order 係 O(N^2)。

比較快既方法 Order 只係 O(N),
讀入 N 個數冇得改,
可以刪改既係 Searching 個 Part。
如果用 Hash Table,
咁個 Searching 既 Order 就只係 O(1)。

問題係 Pascal 既 Array 唔可以用 Real 黎做 Index,
解決方法係,
將個數乘上 100,
再轉成 Integer。

個 Bug 就係呢度,
我用 Trunc() 轉做 Integer,
點知就出現 Truncation Error。
結果我轉用 Round() 就即刻全對。

其實中有另一個方法轉 Index,
就係用 String,
Remove 左個小數點('.')之後,
用 Val() 轉。
不過當然理論上咁會慢過第一個轉 Index 既方法。

可能有人覺得,
O(N^2) 都 Pass,
駛唔駛花咁多工序改成 O(N)?
雖然係練習題目的確唔需要都過關,
不過真正比賽就唔會咁仁慈,
差一個 Order 分分鐘 50% Test Data 都過唔到。
平時練定點樣省一兩個 Order,
到比賽既時候就會更得心應手。

No comments: