快速查找列表列表

时间:2012-09-15 18:21:40

标签: algorithm haskell

考虑以下功能:

import Data.List (find)     
findInLists items = map $ find (`elem` items)

可以这样调用,结果如下:

findInLists [2,3] [[1,2], [1,3,2], [4, -2, 8]] -> [Just 2, Just 3, Nothing]

可以假设第一个参数已排序,但第二个参数不会被排序。

如果n是要搜索的所有列表中的项目总数(在此特定情况下为7,因为搜索在找到项目时停止),k是项目数要搜索,我相信这个函数的运行时将是O(n * k)。但是,当k也很大时,这对于大型n来说是不利的。

如果可能的话,我希望运行时更像O(n * log k) + O(k * log k)或更好。最好的方法是什么?

2 个答案:

答案 0 :(得分:6)

items粘贴到Set并使用member

答案 1 :(得分:6)

import Data.Set (fromList,member)
import Data.List
findInLists :: Ord a => [a] -> [[a]] -> [Maybe a]
findInLists xs = map $ find $ flip member $ fromList xs

fromList xs将花费O(k log k)一次,而find在最坏的情况下会O(log k)。所以n个元素的总时间= O(n log k) + O(k log k)最坏的情况。