除二进制搜索树外,是否有任何有效的数据结构来表示Set

时间:2019-03-13 06:20:25

标签: haskell set

我们知道,在Haskell中,一组元素由Data.Set模块中的二进制搜索树表示,这很有效。但是,大多数操作都要求elememt是Ord类的实例。

但是,一般集不需要其elememt即可成为Ord的实例。由于集合中没有重复的元素,因此将其元素作为Eq类的实例就足够了。

在Haskell中,我只能想到单个链表的实现,就像默认的[a]一样,但是单个链表的效率不如BST,而BST需要{{1 }}类。

顺便说一句,在Python中,Ord类不需要其元素是可排序的。仅定义set__eq__(与Haskell的__ne__类相对应)即可,例如:

Eq
  

?: x =水果('苹果')

     

?: y =水果('苹果')

     

?: z =水果('Apple')

     

?: {x,y,z}

     

{Apple}

     

?: x <= y

     

回溯(最近通话最近一次):

     

文件“”,模块中的第1行

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
     

TypeError:“水果”和“水果”的实例之间不支持“ <=”

所以我想知道Haskell中是否有一些有效的数据结构可以用来表示x <= y ,但不需要Set类。

1 个答案:

答案 0 :(得分:3)

Python在作弊。 All values in Python are hashable and set() is just a dictionary with no value.

Python可以避免这种情况,因为它是动态类型化语言的副作用。使Python跟踪其变量类型的机制也很容易在其上施加伪指令。

Haskell作为一种静态类型的语言,尤其是具有一流功能的静态类型的语言,不能为数据类型发明任意顺序。因此,Data.Set要求Ord高效。无需订购就将新值添加到集合将变为O(n)。