Clojure:如何使用整数序列而不是字母序列来实现 trie 树?

Clojure: How to implement a trie with sequences of integers rather than letters?

背景

我正在研究自己的框架,以数值方式求解单纯复形上的偏微分方程。单纯形(N 维三角形)存储为有序的点集。点由它们在包含其坐标的单独数组中的索引表示。这些单纯形中的每一个都有一小部分与之相关的信息(比如它们的体积)。我想实现一个数据结构,使我能够有效地对键对执行二进制操作以创建新键和值对以创建新值。这些新的键值对然后填充数据结构的新实例。

例子

我有以下坐标列表指定的三个点:

points = [(0, 0), (1, 0), (0, 1)]

这些坐标可以用来制作

问题

部分解决方案

我怀疑对我来说最好的解决方案是一种 trie,其键表示为一系列整数而不是一系列字符。

在 Python(我通常编写的代码)中尝试了很多不同的想法之后,我强烈怀疑 Clojure 会提供一种更直接的方法。因此,为什么我要问如何在 Clojure 中执行此操作。

您是否考虑过将单纯形视为个点?使用 Clojure sets,你会得到

  • 结构共享,减少存储需求,
  • 相当快的平等,并且
  • 并集和交集相当快。

您还可以快速枚举单纯形的面,例如三角形的边:

(defn facets [s] (map #(disj s %) s))

例如,

(facets #{1 3 6})
;(#{3 6} #{1 6} #{1 3})

我认为您的解决方案涉及以动态编程风格建立一个记忆字典,包含选择的单纯形的属性。