我正在创建一个库来支持一些标准的图遍历。一些图是明确定义的:即,通过提供数据结构或通过重复调用相关方法来添加所有边。有些图只是隐式定义的:即,我只能提供一个函数,给定一个节点,它将返回它的子节点(特别是,我遍历的所有无限图必须隐式定义)。
遍历生成器需要高度可定制。例如,我应该能够指定是否需要DFS后订购/预订/有序,BFS等;应该访问孩子的顺序(如果我提供了对其进行分类的key
);是否应维护访问节点集;是否应该与节点一起产生后向指针(指向父节点的指针);等
我正在努力使用这个库的API设计(一旦API清楚,实现就不复杂了)。我希望它优雅,合乎逻辑,简洁。有没有符合这些标准的图形库我可以用作模板(不一定是Python)?
当然,如果有一个Python库已经完成了所有这些,我想知道,所以我可以避免自己编码。
(我正在使用Python 3。)
答案 0 :(得分:1)
如果你需要处理无限图,那么你将需要某种功能的图形界面(正如你在q中所说)。所以我会把它作为标准表示并提供辅助函数,它们采用其他表示形式并生成函数表示。
对于结果,也许你可以屈服(你暗示一个生成器,我认为这是一个好主意)一系列结果对象,每个结果对象代表一个节点。如果用户想要更多的信息,比如反向链接,他们就会调用一个方法,并提供额外的信息(如果可能的话懒洋洋地计算,这样你就可以避免那些不需要它的人付出代价)。
您没有提及图表是否有定向。很明显,您可以按照指示处理所有图形并返回两个方向。但后来实施效率不高。通常(例如jgrapht)库具有不同类型的图形的不同接口。
(我怀疑在你在优雅的api和效率之间取得良好的平衡之前,你必须对此进行很多迭代)
最后,你知道functional graph library吗?我不确定它会有什么帮助,但我记得(多年前!),认为api有一个很好的。
答案 1 :(得分:0)
遍历算法和图形数据结构实现应该是分开的,并且应该仅通过标准API相互通信。 (如果它们是耦合的,则必须为每个实现重写每个遍历算法。)
所以我的问题实际上有两个部分:
我相信C++ Boost Graph Library很好地回答了我的问题的两个部分。我希望它可以(在理论上)用Python重写,虽然在我尝试之前可能会遇到一些我看不到的障碍。
顺便说一下,我在Python的上下文中找到了一个处理问题1的网站:http://wiki.python.org/moin/PythonGraphApi。不幸的是,它自2011年8月以来一直没有更新。