查找给定列表中某些元素的所有索引。在Haskell中没有数组的情况下,它可以在小于O(n ^ 2)的情况下完成吗?

时间:2015-02-26 23:59:32

标签: arrays list haskell array-algorithms

给出2个独特,可订购,非连续元素的列表,例如:

['d', 'a', 'z', 'b']

我想在另一个列表中找到他们的索引,比如说:

['a', 'b', 'z', 'd']

结果将是一个包含其职位的列表:

[3, 0, 2, 1]  -- element at 0 is at 3,
              -- element at 1 is at 0, etc.

3 个答案:

答案 0 :(得分:6)

一个简单的解决方案是使用第二个列表创建Data.Map或哈希表,这样您就可以进行O(log n)索引查找而不是O(n)索引。

答案 1 :(得分:3)

这也可以在O(n log n)时间内完成,有几种。我假设第二个列表是第一个列表的排列。

import Data.List
import Data.Ord
import Data.Function

correspIx :: Ord a => [a] -> [a] -> [(Int, Int)]
correspIx = zip `on` map fst . sortBy (comparing snd) . zip [0..]

correspIx返回一对列表,其中索引彼此对应:

correspIx "dazb" "abzd" == [(1,0),(3,1),(0,3),(2,2)]

我们需要另一种方法来获得问题中指出的结果:

correspIx' :: Ord a => [a] -> [a] -> [Int]
correspIx' xs ys = map snd $ sortBy (comparing fst) $ correspIx xs ys

现在correspIx' "dazb" "abzd" == [3,0,2,1]

答案 2 :(得分:0)

首先,您必须创建目标数组中所有字符的地图,然后您有两个选项:

您可以使用merge sort O(n log n)时间内对列表进行排序,如果您要查找的令牌数组长度不变,则会在{{1}中进行一定数量的搜索}。

另一个解决方案是获取目标数组并将其全部放在哈希映射中,然后在那里搜索。