序言中的哈希集和队列

时间:2019-07-14 19:32:17

标签: prolog swi-prolog

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

1 个答案:

答案 0 :(得分: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*使用数据库。

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

根据您的问题:

  

有更快的方法吗?

没人知道。这是不可知的。您需要一个用例,然后需要为该用例编写一些测试,然后需要分析实现并测量时间(和内存?)。例如,您可以将它们彼此进行比较,或者与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进行获取和设置应​​该是固定时间的操作。

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

相关问题