【问题标题】:Hashset and Queue in prolog序言中的哈希集和队列
【发布时间】:2019-07-14 19:32:17
【问题描述】:

我需要创建一个哈希集,我的第一个想法是使用关联列表或字典。然而,查找和插入过程具有 O(logN) 复杂度。有更快的方法吗?
我也需要排队。我找到了一个使用差异列表的实现here,但我想知道是否有更好的方法。

【问题讨论】:

标签: prolog swi-prolog


【解决方案1】:

queue in the answer,对于您链接的问题,我觉得很好。 “更好的东西”是什么意思?

编辑:和here is a link to a hash-table implementation in Prolog

关于哈希表,这是一个定义问题。 “制作哈希集”是什么意思?为什么你认为你会使用现成的数据结构?

您至少有三个选择:

  1. 使用现有的键值数据结构(查看 library(assoc) 和 SWI-Prolog dict),而不关心它是如何实现的;
  2. 根据您的确切规范实施数据结构;
  3. 不要使用Prolog中定义的数据结构,而是通过assert*retract*使用数据库。

我们不知道(根据您的问题)您是否必须为您的“哈希集”实现哈希表;或者如果您认为您需要包含“hash”一词的东西,或者如果您想要通常在其他语言中实现为哈希表的东西,而您只需使用了“哈希集”这个词,但您不需要特定于哈希表的特定属性。是哪一个?

根据您的问题:

有更快的方法吗?

没有人知道。这是不可知的。您需要一个用例,然后您需要为该用例编写一些测试,然后您需要分析您的实现并测量时间(和内存?)。例如,您可以将它们相互比较或与 Java HashSet 进行比较。在那之前,一切都只是猜测。

如果您想使用选项 2。并实现具有 hash table 属性的数据结构,您必须自己做。

如果您在决定如何实现散列函数或如何在 Prolog 中创建数组时需要帮助,您应该提出更具体的问题。

如果您在决定什么是最适合您的选择(上述三个之一或其他)方面需要帮助,您需要提出更具体的问题。

简单介绍一下 Prolog 中的数组。许多谓词都记录在in the section on Term manipulation

您可以使用 Prolog 术语来创建数组。例如,这是一个大小为 5 的数组,其中包含 [a,b,c,d,e] 原子:

array(a, b, c, d, e)

您可以使用arg/3 获取索引处的元素:

?- A = array(a, b, c, d, e), arg(3, A, X).
A = array(a, b, c, d, e),
X = c.

您可以使用*setarg 谓词在索引处重新分配值。

?- A = array(a, b, c, d, e), arg(3, A, X), setarg(3, A, hello), arg(3, A, Y).
A = array(a, b, hello, d, e),
X = c,
Y = hello.

使用argsetarg 获取和设置应​​该是常数时间操作。

如果您有更具体的问题,您必须提出。

【讨论】:

  • 您可能要提到setarg/3 是非标准的。
猜你喜欢
  • 2020-03-14
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 2021-12-15
  • 2019-12-20
相关资源
最近更新 更多