給定一個字符串,我希望能夠輸入一個字母,然後讓我的函數計算字母出現在字符串中的次數。
countLetters :: String -> Char -> Int
這怎麼辦?
給定一個字符串,我希望能夠輸入一個字母,然後讓我的函數計算字母出現在字符串中的次數。
countLetters :: String -> Char -> Int
這怎麼辦?
隨着
countLetters :: String -> Char -> Int
countLetters str c = length $ filter (== c) str
這得到僅在str
即等於c
中的字符,然後計算的那長度。
這取決於您想要撥打的號碼String
。簡單的解決辦法是隻讀取字符串中的每個字符,如果它匹配你正在尋找的字符,增加計數器。現在
,如果你映射了一些與一個計數器,可以很明顯的使用fold
:
countLetters xs x = foldl (\count char -> if char == x then (count + 1) else count) 0 xs
但是,如果你想要做許多查詢,它更有意義構建查找表(即第)。然後你可以得到O(1)
中任意字符的重複次數(整個算法仍然是O(n)
)。
排序後您的操作是否更像O(m)其中m是重複字符的數量? – Wes
假設您使用的是固定範圍固定大小的表格,則提取值爲「O(1)」。例如,考慮原始內存訪問和指針算術。 –
由於必須遍歷整個輸入字符串進行過濾,然後遍歷其結果以獲取長度,所以性能會受到影響。 – user2407038
但是'長度'和'過濾器'兩個懶惰的功能?我會想象GHC可以優化一個簡單的例子來產生一個單一的循環。 – bheklilr