【问题标题】:Clojure: How to implement a trie with sequences of integers rather than letters?Clojure:如何使用整数序列而不是字母来实现 trie?
【发布时间】:2015-02-02 15:56:37
【问题描述】:

背景

我正在研究自己的框架,以数值求解单纯复形上的偏微分方程。单纯形(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 更合适?您在尝试用 python 实现这个想法时发现了哪些缺点?
  • 本身并不是缺点,我只是探索了很多从未完全实现的方法。它们都非常实用且非常递归,所以我开始认为 Clojure 可能会提供一个更有启发性的框架。我并不是说 Python 不够,我只是怀疑解决我的特定问题的最佳方法可能会在 Clojure 的框架中变得更加明显
  • 索引是密集的还是稀疏的?
  • 索引密集,取0-N的每一个值。

标签: data-structures hash clojure


【解决方案1】:

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

  • 结构共享,尽可能减少存储需求,
  • 相当快的平等,并且
  • 相当快的联合和交叉。

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

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

例如,

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

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

【讨论】:

  • 哇。这实际上看起来很有希望。我将对此进行一两天的修改,最终可能会接受您的回答。由于我是 Clojure 的新手,我只想有机会仔细检查它是否符合我的要求。
猜你喜欢
  • 2016-09-12
  • 2022-12-18
  • 2019-07-22
  • 2019-11-03
  • 1970-01-01
  • 2010-11-29
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多