【算法】算法圖解筆記_廣度優先搜索 -Haskell代碼實現

以前的廣度優先遍歷沒有Haskell代碼的實現,這裏補上。下面代碼使用了unordered-containers包的哈希表,用來實現圖;containers包的Seq類型,用來實現隊列,主要是由於使用內置的列表類型效率太差。數據結構

module Main where

import qualified Data.HashMap.Strict as HM
import           Data.Maybe (fromJust)
import qualified Data.Sequence       as DS

graph :: HM.HashMap String [String]
graph = HM.fromList [("you",["alice", "bob", "claire"]),
                    ("bob", ["anuj", "peggy"]),
                    ("alice", ["peggy"]),
                    ("claire", ["thom", "jonny"]),
                    ("anuj",[]),
                    ("peggy",[]),
                    ("thom",[]),
                    ("jonny",[])
                   ]

personIsSeller :: String -> Bool
personIsSeller name = last name == 'm'

search :: HM.HashMap String [String] -> String -> Bool
search graph name = loop $ DS.fromList (graph HM.! name)
  where loop queue
          | null queue = False
          | personIsSeller h = True
          | otherwise = loop $ (DS.drop 1 queue) DS.>< DS.fromList (graph HM.! h)
          where h = queue `DS.index` 0

main :: IO ()
main = do
  print $ search graph "you"

爲了能與Python對照,總體風格上與Python代碼保持一致,包括測試用例、圖的實現方式等等。
Haskell標準模塊並不包含一些經常使用的數據類型,因此,平常開發中須要大量使用其餘三方的包,其中containers和unordered-containers是最經常使用的容器包。oop

containers包含經常使用的圖、樹、集合等結構,具體包含Data.Graph、Data.Tree、Data.Map、Data.IntMap、Data.Set、Data.IntSet、以及例子中使用到的Data.Sequence等。測試

正如名字所示,unordered-containers包實現了基於無序的數據結構,包含基於哈希的映射和集合。spa

請繼續關注個人公衆號文章
圖片描述code

相關文章
相關標籤/搜索