【问题标题】:Lisp graph data structuresLisp 图数据结构
【发布时间】:2014-05-18 16:28:21
【问题描述】:

我正在阅读Jorge Gajon's Trees as Linked Lists in Common Lisp,其中包括对用 Lisp 完成的树的描述。作者给出了这个基本的例子:

然后给出一个 Lisp 列表表示:

(1 (2 6 7 8) 3 (4 (9 12)) (5 10 11))

其中位置意味着层次结构级别:1 在列表中是第一个,即它在顶部,2 在下一个级别,但它是其级别的顶部,等等。但是他给出了这个警告:

请注意,如果您需要在生产程序中表示树,则不应使用此处描述的列表,除非您有充分的理由。这只是一个了解 cons 单元如何工作的练习。

好的,在“生产”代码中应该如何表示树形数据结构?顺便说一句,我还想看一个无环有向图的示例,即类似树的东西也具有“多父”功能。例如在上图中,8 是 2 的孩子,但也是 3。我猜是这样的:

(1 (2 6 7 8) (3 8) (4 (9 12)) (5 10 11))

但似乎我已经创建了一个 8 的“影子”双胞胎,并没有真正说明作为 3 的孩子的 8 与同样有 2 作为父母的 8 的关系。如果我想让 3 作为 12 的父母,这个问题会变得更糟。

(1 (2 6 7 8) (3 8 12) (4 (9 12)) (5 10 11))

可以这么说,12 处于较低层次的事实在洗牌中迷失了。

在 Lisp/Scheme/Clojure 世界中是否存在对数据结构的良好和适当的处理(书籍等)?我只发现过这样的一次性东西。

【问题讨论】:

  • 顺便说一下,以这种方式定义树的问题在于,无法区分属于树的部分的conses和属于树中作为元素。解决这个问题的方法是定义数据结构(使用defstructdefclass)以将元素和树结构包含在单独的插槽中,无需区分它们。

标签: data-structures common-lisp


【解决方案1】:

假设您已经安装了 quicklisp,并且您应该考虑以下枚举的库:(ql:system-apropos "graph"),并尝试 cliki http://cliki.net/site/search?query=graph

【讨论】:

    【解决方案2】:

    “生产”代码将使用 CLOS(Common Lisp 对象系统)来定义 NODE 类和对图/树的操作。

    【讨论】:

    • 有任何关于 Lisp 语言家族的权威“A&DS”书籍吗?
    • @LawrenceBottorff:您可以轻松地将大多数“算法和数据结构”书籍改编为 Lisp。过程、记录、数组……都可以在 Lisp 中使用。 Lisp 的特殊语言版本并不常见,因为市场很小,而且大多数 Lisp 程序员在阅读 C、Java 或 Pascal 示例时没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-03-06
    • 2015-06-29
    • 2021-10-22
    相关资源
    最近更新 更多