序言中的哈希集和队列
Hashset and Queue in prolog
我需要制作一个哈希集,我的第一个想法是使用关联列表或字典。然而,查找和插入过程具有 O(logN) 复杂性。有更快的方法吗?
我还需要一个队列。我找到了一个使用差异列表的实现 ,但我想知道是否有更好的东西。
,对于你链接的问题,我觉得没问题。 "something better" 是什么意思?
编辑:和here is a link to a hash-table implementation in Prolog.
关于散列table,现在这是一个定义问题。 "make a hashset" 是什么意思?为什么你认为你会使用现成的数据结构?
您至少有三个选择:
- 使用现有的 key-value 数据结构(查看
library(assoc)
和 SWI-Prolog dict
)并且不关心它是如何实现的;
- 根据您的具体规范实施数据结构;
- 不使用 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.
使用arg
和setarg
获取和设置应该是constant-time操作。
如果您有更具体的问题,您将不得不提出。
我需要制作一个哈希集,我的第一个想法是使用关联列表或字典。然而,查找和插入过程具有 O(logN) 复杂性。有更快的方法吗?
我还需要一个队列。我找到了一个使用差异列表的实现
编辑:和here is a link to a hash-table implementation in Prolog.
关于散列table,现在这是一个定义问题。 "make a hashset" 是什么意思?为什么你认为你会使用现成的数据结构?
您至少有三个选择:
- 使用现有的 key-value 数据结构(查看
library(assoc)
和 SWI-Prologdict
)并且不关心它是如何实现的; - 根据您的具体规范实施数据结构;
- 不使用 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.
使用arg
和setarg
获取和设置应该是constant-time操作。
如果您有更具体的问题,您将不得不提出。