二维数组的元组列表

时间:2018-04-15 11:00:44

标签: haskell

我想从给定的元组列表中创建一个矩阵。 元组有(row, column, value),我想创建matrix[row][column] = value

buildMatrix :: Int-> [(Int, Int, Int)] -> [[Int]]

例如,给定:

n = 3 (size of matrix)
list = [(1,2,1), (1,3,-1), (2,3,1)],

我想得到

matrix = [[0,1,-1], [0,0,1], [0,0,0]]

到目前为止我尝试了什么:

buildMatrix n (i, j, v) = [ [ entry row column | column <- [1..n] ] | row <- [1..n] ]
    where
    entry x y
       | x == i && y == j = v
       | otherwise = 0

我坚持为每个元组应用函数,我正在考虑使用map。

1 个答案:

答案 0 :(得分:1)

实现此目的的最简单方法是更改​​条目以检查给定列表中是否存在任何元组(x,y,v)

buildMatrix :: Int -> [(Int, Int, Int)] -> [[Int]]
buildMatrix n xs = [ [ entry row column | column <- [1..n] ] | row <- [1..n] ]
  where
    entry x y = maybe 0 id (findValue x y xs)
    findValue x y [] = Nothing
    findValue x y ((i,j,v):xs')
       | x == i && y == j = Just v
       | otherwise        = findValue x y xs'

然而,这有点麻烦。已经lookup :: Eq a => a -> [(a,b)] -> Maybe b,我们的findValue看起来几乎相同。所以让我们改用它:

buildMatrix :: Int -> [(Int, Int, Int)] -> [[Int]]
buildMatrix n xs = [ [ entry row column | column <- [1..n] ] | row <- [1..n] ]
  where
    entry x y = maybe 0 id (lookup (x,y) (indexed xs))
    indexed   = map (\(x,y,v) -> ((x,y),v))

这是实现目标的一种方法。不幸的是,这个算法的最坏情况时间复杂度为(n²k),其中n是你的矩阵大小,kxs中元素的数量。可以选择另一种算法将其改进为(n²+ k log k)=(n²),但这只是一个练习。