簡體   English   中英

Haskell邊緣列表的鄰接矩陣

[英]Adjacency Matrix to Edge List in Haskell

我有一個1d的比賽隊名單和一個2d的“對手矩陣”。

我只想提取每支球隊的對手名單。

我只是在學習Haskell,並且想知道,是否有人可以為下面已經運行的代碼想到一個更優雅的解決方案。 ...也許是列表理解? ...

碼:

findOp :: (Eq a, Num a) => [b] -> [a] -> [b]
findOp (x:xs) (y:ys) | y == 1 = [x] ++ findOp xs ys
                     | otherwise = findOp xs ys

findOp [] [] = []

tab = [[0,1,0,1],
       [1,0,1,0],
       [0,1,0,1],
       [1,0,1,0]]

teams = ["team a",
         "team b",
         "team c",
         "team d" ]

main :: IO ()
main = do
       let games = map (\x -> (fst x, findOp teams $ snd x)) $ zip teams tab
       putStrLn $ show games

結果:

[("team a",["team b","team d"]),("team b",["team a","team c"]),("team c",["team b","team d"]),("team d",["team a","team c"])]

無論如何,假設這將很快遷移,這是一個答案:

tab = [[0,1,0,1],
       [1,0,1,0],
       [0,1,0,1],
       [1,0,1,0]]

teams = ["team a",
         "team b",
         "team c",
         "team d" ]

main = do
    let matches = zip teams . map (map fst . filter ((== 1) . snd) . zip teams) $ tab
    print matches

關鍵的見識是從“ map (zip teams) tab 這將為您提供矩陣內的團隊名稱以及值。 從那里開始,剩下的就是簡單的數據操作-以及對每個內部列表上映射的三個操作的手動融合。

順便說一句-這實際上是將鄰接矩陣轉換為邊緣列表的一般問題的特定示例。 在軟件中使用圖形表示時,這是最簡單,最基礎的操作之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM