2013-10-10 31 views

回答

7

隨着

countLetters :: String -> Char -> Int 
countLetters str c = length $ filter (== c) str 

這得到僅在str即等於c中的字符,然後計算的那長度。

+0

由於必須遍歷整個輸入字符串進行過濾,然後遍歷其結果以獲取長度,所以性能會受到影響。 – user2407038

+2

但是'長度'和'過濾器'兩個懶惰的功能?我會想象GHC可以優化一個簡單的例子來產生一個單一的循環。 – bheklilr

1

這取決於您想要撥打的號碼String。簡單的解決辦法是隻讀取字符串中的每個字符,如果它匹配你正在尋找的字符,增加計數器。現在

,如果你映射了一些與一個計數器,可以很明顯的使用fold

countLetters xs x = foldl (\count char -> if char == x then (count + 1) else count) 0 xs 

但是,如果你想要做許多查詢,它更有意義構建查找表(即)。然後你可以得到O(1)中任意字符的重複次數(整個算法仍然是O(n))。

+0

排序後您的操作是否更像O(m)其中m是重複字符的數量? – Wes

+0

假設您使用的是固定範圍固定大小的表格,則提取值爲「O(1)」。例如,考慮原始內存訪問和指針算術。 –

相關問題