【发布时间】:2016-01-07 23:10:39
【问题描述】:
如何改进以下问题的解决方案?能不能在时间和空间上更有效率?有没有空间泄漏?
问题:
给定一个Astronauts 的输入列表,生成一个Astronauts 对的列表,使得这些对没有来自同一国家/地区的两个Astronauts。假设输入有一个 Astronauts 列表和唯一的 identifiers。
data Astronaut = Astronaut { identifier :: Int, country :: String } deriving (Eq)
astronautPairs :: [Astronaut] -> [(Astronaut, Astronaut)]
astronautPairs xs = foldl accumulatePairs [] [(a, b) | a <- xs, b <- xs, country a /= country b]
where
accumulatePairs pairs pair = if hasPair pair pairs then pairs else pair:pairs
hasPair pair@(a,b) ((c,d):xs) = a == d && b == c || hasPair pair xs
hasPair _ [] = False
【问题讨论】:
-
您认为应该占用多少空间?一旦你决定了,只需在一个大的输入上运行你的代码,看看你的内存使用是否匹配(
-stderr运行时选项可以在这里派上用场)。然后你告诉我们它是否有空间泄漏。 -
您可能会喜欢one of my previous answers 中的
pairs函数。 -
您想同时制作
(a,b)和(b,a),还是打算代表两人团队?