Algorithm 在列表列表中快速查找
考虑以下功能:Algorithm 在列表列表中快速查找,algorithm,haskell,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,因为一旦找到一个项目,搜索就会停止),
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)
。然而,当n
也较大时,这对较大的k
是不利的
我希望运行时更像
O(n*logk)+O(k*logk)
或者更好(如果可能)。最好的方法是什么?将项目
粘贴在集合中
并使用
fromlistxs
将使用O(logk)
一次,在最坏的情况下,每个find
将使用O(logk)
。所以n个元素的总时间=O(n logk)+O(k logk)
最坏情况 请澄清:如果有两个匹配项,例如在findInLists[2,3][[1,3,2]]
中,可以返回[Just 2]
,或者必须是[Just 3]
?换句话说,您是需要第一个匹配项,还是只需要在列表中查找任何匹配项?
import Data.Set (fromList,member)
import Data.List
findInLists :: Ord a => [a] -> [[a]] -> [Maybe a]
findInLists xs = map $ find $ flip member $ fromList xs