Haskell 除了二叉搜索树之外,还有其他有效的数据结构来表示集合吗
正如我们所知,在Haskell中,一组元素由模块中的二叉搜索树表示,这是有效的。然而,大多数操作要求元素是Haskell 除了二叉搜索树之外,还有其他有效的数据结构来表示集合吗,haskell,set,Haskell,Set,正如我们所知,在Haskell中,一组元素由模块中的二叉搜索树表示,这是有效的。然而,大多数操作要求元素是Ord类的实例 然而,一般集合不需要它的元素是Ord的实例。因为集合中没有重复的元素,所以它的元素作为Eq类的实例就足够了 在Haskell中,我只能想到通过单链表实现,就像默认的[a],但是单链表不如BST有效,而BST需要Ord类 顺便说一下,在Python中,set类不需要它的元素是可排序的。只有定义了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
Ord
类的实例
然而,一般集合不需要它的元素是Ord
的实例。因为集合中没有重复的元素,所以它的元素作为Eq
类的实例就足够了
在Haskell中,我只能想到通过单链表实现,就像默认的[a]
,但是单链表不如BST有效,而BST需要Ord
类
顺便说一下,在Python中,set
类不需要它的元素是可排序的。只有定义了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
class Fruit:
def __init__(self, name):
self.name = name.title()
def __repr__(self):
return self.name
def __eq__(self, other):
return self.name == other.name # defines the equality operation
def __ne__(self, other):
return self.name != other.name # defines the unequality operation
def __hash__(self):
return hash(self.name) # so that Fruit instance can be an element of a set
?:x=水果(“苹果”)
?:y=水果(“苹果”)
?:z=水果(“苹果”)
?:{x,y,z}
{苹果}
?:xPython在作弊
作为动态类型化语言的一个副作用,Python可以避免这种情况。让Python跟踪it变量类型的相同机制也使得对它们施加psudo排序变得容易
Haskell作为一种静态类型语言,特别是一种具有第一类函数的静态类型语言,不能为数据类型创建任意顺序。因此,Data.Set
要求Ord
有效。如果不按顺序向集合中添加新值,则会变成O(n)。我猜python使用哈希代码的“Ord实例”来实现集合,除了二进制搜索树之外,还有其他选项。请参见Data.IntSet
(一个PATRICIA树)和Data.HashSet
(一个哈希数组映射的trie)。要详细说明@dfeuer:Data.HashSet
(来自无序容器
库)可能是您最好的选择;它使用Hashable
而不是Ord
,允许存储更多类型。我不认为您可以完全摆脱约束。@bradrn,可能不会有更多类型。但是一组稍有不同的类型,而且效率更高。你的英文文本说“只有\uuuuueq\uuuu
和\une\uuuuuuu
”,但你的代码说“…还有\uuuuuuuuuuuuuu散列”。有数据。HashSet
需要可散列的,Eq a
-但它也是一棵树。我认为它与动态键入无关。在C#和Java中,您可以拥有与Python中具有相同访问/更新时间复杂性的(哈希)集。并非Python中的所有值都是可哈希的,而且利用可用的可变数据结构绝非“欺骗”。@Elmex80s我的说法与速度无关。Haskell集合也非常快,但要求程序员(或标准库)需要提供一个Ord
实例。动态类型的功能是根据存储在内存中的值的内部标头对所有值进行免费psudo排序。我对Java或C#中数据的低级表示不太了解,无法判断它们是否有类似的值头可以使用,但Haskell在从STG表示转换时会删除类型信息。所以,如果我理解正确的话,你的意思是为了速度,有一些东西与顺序显式或隐式相关。由于haskell的HashSet
需要它的元素是可散列的,我知道HashSet
大致相当于python的集合,对吗?
x <= y