序言中的哈希集和队列

Hashset and Queue in prolog

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

,对于你链接的问题,我觉得没问题。 "something better" 是什么意思?

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

关于散列table,现在这是一个定义问题。 "make a hashset" 是什么意思?为什么你认为你会使用现成的数据结构?

您至少有三个选择:

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

我们(根据您的问题)不知道您是否必须为您的"hashset"实施哈希table;或者如果你认为你需要一些包含单词"hash"的东西,或者如果你想要一些通常作为散列实现的东西table 在其他语言中并且您刚刚使用了单词 "hashset" 但您不需要特定的 属性 特定于散列 table。是哪一个?

根据你的问题:

Is there a faster way to do it?

没有人知道。这是不可知的。您需要一个用例,然后您需要为该用例编写一些测试,然后您需要分析您的实现并测量时间(和内存?)。然后,您可以将它们相互比较或与 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 谓词 re-assign 索引处的值。

?- 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获取和设置应​​该是constant-time操作。

如果您有更具体的问题,您将不得不提出。