prolog中的Hashset和Queue

prolog中的Hashset和Queue,prolog,swi-prolog,Prolog,Swi Prolog,我需要创建一个哈希集,我的第一个想法是使用关联列表或字典。然而,查找和插入过程具有O(logN)复杂性。有更快的方法吗? 我还需要排队。我发现了一个使用差异列表的实现,但我想知道是否有更好的方法。对于您链接的问题,我觉得很好。你说的“更好的东西”是什么意思 编辑:和 关于哈希表,这现在是一个定义问题。“创建哈希集”是什么意思?为什么您认为您会使用现成的数据结构 您至少有三种选择: 使用现有的键值数据结构(查看库(assoc)和SWI Prologdict),而不关心它是如何实现的 根据您的具体规

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

对于您链接的问题,我觉得很好。你说的“更好的东西”是什么意思

编辑:和

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

您至少有三种选择:

  • 使用现有的键值数据结构(查看
    库(assoc)
    和SWI Prolog
    dict
    ),而不关心它是如何实现的
  • 根据您的具体规格实施数据结构
  • 不要使用Prolog中定义的数据结构,而是通过
    assert*
    retract*
    使用数据库
  • 我们不知道(从你的问题)你是否必须为你的“哈希集”实现一个哈希表;或者,如果您认为您需要一些包含“hash”一词的内容,或者如果您想要一些通常在其他语言中实现为哈希表的内容,并且您刚刚使用了“hashset”一词,但不需要哈希表特定的属性。是哪一个

    根据你的问题:

    有没有更快的方法

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

    如果你想选择2。实现一个具有a属性的数据结构,你必须自己做

    如果您在决定如何实现哈希函数或如何在Prolog中生成数组方面需要帮助,您应该询问更具体的问题

    如果你需要帮助来决定什么是对你最好的选择(上面三个选项中的一个或其他),你需要问更具体的问题

    只简单介绍一下Prolog中的数组。许多谓词都有文档记录

    您可以使用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.
    
    使用
    arg
    setarg
    获取和设置应该是固定时间操作


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

    您可能想提到
    setarg/3
    是非标准的。下面是一个在Prolog中非常全面的哈希表实现: