Haskell O(n)(或最接近)在Data.Map中“改变”值的方法

时间:2014-03-17 01:03:49

标签: algorithm haskell

我需要将一个函数应用于我的地图中的每个元素。此函数可能会导致新值或没有值的结果,因此我希望从我的地图中删除此键/值对。通俗地说,我的地图会随着时间的推移而缩小。

我喜欢Data.Map中alter函数的声音,但它需要提供密钥。所以我的直觉说只需用keys抓住键,然后用我的地图作为累加器烹饪foldl',并将键作为我的输入列表。

但这是一种有效的方法吗?在我的命令性思维中,我做了一个O(n)传球来抓住钥匙,然后我的折叠'将在O(nlogn)时间内运行(记录n以查找每个项目的n个项目)。首先,当只需要一个时,似乎这将是2次传递。我开始了解到实际上,Haskell的懒惰会使这两个操作串联起来(即获取下一个键值,然后用它调用alter)所以也许这不是那么糟糕。但我宁愿在O(n)而不是O(nlogn)中找到一种方法。显而易见的是必须查找"查找"当我需要触摸所有这些项目时,每个项目都是单独的,在我的情况下,顺序无关紧要。

或者,我想我可以将值复制到新地图中并留下我不想要的那些,但我想这会简单地使用更多的内存并击败我缩小的地图的整个目的。

所以我正在寻找一些有关如何有效调整地图的提示。

请注意,此地图已经是foldl'中的累加器。

换句话说,我想做Data.Map.map但也能删除值。目前我正在制作地图和过滤器,我正试图加快速度。

1 个答案:

答案 0 :(得分:10)

您可能需要mapMaybeWithKey功能:

  

mapMaybeWithKey :: (k -> a -> Maybe b) -> Map k a -> Map k b

     

为O(n)。映射键/值并收集Just结果。

如果您不需要访问密钥,则只需mapMaybe