Data structures Clojure:如何用整数序列而不是字母序列实现trie? 背景

Data structures Clojure:如何用整数序列而不是字母序列实现trie? 背景,data-structures,hash,clojure,Data Structures,Hash,Clojure,我在自己的框架下工作,用数值方法求解单纯形复形上的偏微分方程。单纯形(N维三角形)存储为有序的点集。点在包含其坐标的单独数组中由其索引表示。这些simplex中的每一个都有一小块与之相关的信息(比如它们的卷)。我想实现一个数据结构,它允许我高效地对键对执行二进制操作以创建新键,并对值对以创建新值。然后,这些新的键值对填充数据结构的新实例 例子 我有以下坐标列表中指定的三个点: points=[(0,0)、(1,0)、(0,1)] 这些坐标可用于生成 一个2-单纯形(三角形):(0,1,2) 三

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

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

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中实现这一点。

您想过将Simplex视为点集吗?使用Clojure,您将获得

  • 结构共享,尽可能减少存储需求
  • 相当快的平等,以及
  • 相当快的并集和交集
还可以快速枚举单纯形的面,例如三角形的边:

(defn facets [s] (map #(disj s %) s))
比如说,

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

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

嗨,费曼!你为什么怀疑Clojure更合适?在用python实现这个想法的过程中,您发现了哪些缺点?不是缺点本身,我只是探索了很多从未实现的方法。它们都是非常函数化和递归的,所以我开始思考Clojure可能会提供一个更具启发性的框架。我并不是说Python不够好,我只是怀疑在Clojure的框架中,解决我的特定问题的最佳方法可能会变得更加明显:索引是密集的还是稀疏的?索引是密集的,并且从0到N都有。这实际上看起来很有希望。我将在一两天内对此进行修补,最终可能会接受你的答案。因为我是Clojure的新手,所以我只想有机会再次检查它是否符合我的要求。