【算法】算法图解笔记_广度优先搜索 -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是最常用的容器包。
containers包含常用的图、树、集合等结构,具体包含Data.Graph、Data.Tree、Data.Map、Data.IntMap、Data.Set、Data.IntSet、以及例子中使用到的Data.Sequence等。
正如名字所示,unordered-containers包实现了基于无序的数据结构,包含基于哈希的映射和集合。
请继续关注我的公众号文章
相关推荐
PHP学习笔记 2019-12-12
sweeneywang 2019-11-29
89784911 2019-09-08
86530492 2019-08-26
sweeneywang 2019-07-01
安静 2019-06-30
zhiliang 2019-06-21
89784911 2013-03-12
sksvenska 2017-11-09
finallylly 2010-08-18
wangyongyao 2009-08-28
sweeneywang 2016-11-09
安静 2014-09-17
80500297 2014-06-19
86281740 2012-04-11
86530492 2013-11-26