Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在列表列表中快速查找_Algorithm_Haskell - Fatal编程技术网

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