Clojure:如何使用整数序列而不是字母序列来实现 trie 树?
Clojure: How to implement a trie with sequences of integers rather than letters?
背景
我正在研究自己的框架,以数值方式求解单纯复形上的偏微分方程。单纯形(N 维三角形)存储为有序的点集。点由它们在包含其坐标的单独数组中的索引表示。这些单纯形中的每一个都有一小部分与之相关的信息(比如它们的体积)。我想实现一个数据结构,使我能够有效地对键对执行二进制操作以创建新键和值对以创建新值。这些新的键值对然后填充数据结构的新实例。
例子
我有以下坐标列表指定的三个点:
points = [(0, 0), (1, 0), (0, 1)]
这些坐标可以用来制作
- 一个2-单纯形(三角形):(0, 1, 2)
- 三个 1-单纯形(线):(0, 1), (1, 2), (0, 2)
- 三个0-单纯形(点):(0,), (1,), (2,)
问题
- 我想实现一个最多包含 10^9 个键值对的关联数组。
- 我需要通过对这些结构的现有实例的键和值执行二元运算来高效地创建这些结构的新实例。
- 键都是一系列从 0 到 N 的正整数。它们始终按升序排列。
- 我怀疑对于 N 在初始化时已知并保持静态的情况,这将是最简单的实现方式,这应该足以满足大多数实际目的。 N 大约为 10^7。
部分解决方案
我怀疑对我来说最好的解决方案是一种 trie,其键表示为一系列整数而不是一系列字符。
在 Python(我通常编写的代码)中尝试了很多不同的想法之后,我强烈怀疑 Clojure 会提供一种更直接的方法。因此,为什么我要问如何在 Clojure 中执行此操作。
您是否考虑过将单纯形视为组个点?使用 Clojure sets,你会得到
- 结构共享,减少存储需求,
- 相当快的平等,并且
- 并集和交集相当快。
您还可以快速枚举单纯形的面,例如三角形的边:
(defn facets [s] (map #(disj s %) s))
例如,
(facets #{1 3 6})
;(#{3 6} #{1 6} #{1 3})
我认为您的解决方案涉及以动态编程风格建立一个记忆字典,包含选择的单纯形的属性。
背景
我正在研究自己的框架,以数值方式求解单纯复形上的偏微分方程。单纯形(N 维三角形)存储为有序的点集。点由它们在包含其坐标的单独数组中的索引表示。这些单纯形中的每一个都有一小部分与之相关的信息(比如它们的体积)。我想实现一个数据结构,使我能够有效地对键对执行二进制操作以创建新键和值对以创建新值。这些新的键值对然后填充数据结构的新实例。
例子
我有以下坐标列表指定的三个点:
points = [(0, 0), (1, 0), (0, 1)]
这些坐标可以用来制作
- 一个2-单纯形(三角形):(0, 1, 2)
- 三个 1-单纯形(线):(0, 1), (1, 2), (0, 2)
- 三个0-单纯形(点):(0,), (1,), (2,)
问题
- 我想实现一个最多包含 10^9 个键值对的关联数组。
- 我需要通过对这些结构的现有实例的键和值执行二元运算来高效地创建这些结构的新实例。
- 键都是一系列从 0 到 N 的正整数。它们始终按升序排列。
- 我怀疑对于 N 在初始化时已知并保持静态的情况,这将是最简单的实现方式,这应该足以满足大多数实际目的。 N 大约为 10^7。
部分解决方案
我怀疑对我来说最好的解决方案是一种 trie,其键表示为一系列整数而不是一系列字符。
在 Python(我通常编写的代码)中尝试了很多不同的想法之后,我强烈怀疑 Clojure 会提供一种更直接的方法。因此,为什么我要问如何在 Clojure 中执行此操作。
您是否考虑过将单纯形视为组个点?使用 Clojure sets,你会得到
- 结构共享,减少存储需求,
- 相当快的平等,并且
- 并集和交集相当快。
您还可以快速枚举单纯形的面,例如三角形的边:
(defn facets [s] (map #(disj s %) s))
例如,
(facets #{1 3 6})
;(#{3 6} #{1 6} #{1 3})
我认为您的解决方案涉及以动态编程风格建立一个记忆字典,包含选择的单纯形的属性。