考虑以下功能:
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)
或更好。最好的方法是什么?
答案 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)
最坏的情况。