为什么'set'数据结构被告知无序?

时间:2012-04-25 06:44:18

标签: data-structures

嗯,我认为它是完全有序的,因为元素的位置取决于它们的散列函数,因此如果这些对象是不可变的,那么在将它们放入集合之后,它们的位置将保持不变。每当你打印你的套装时,你都会有完全相同的元素顺序。当然,在计算哈希函数之前,你无法预测它们的位置,但无论如何。

4 个答案:

答案 0 :(得分:3)

通用/抽象数据类型

来自 Aho,Hopcroft,Ullmann set 的定义:'数据结构与算法',Addison-Wesely,1987:

  

集合是成员(或元素)的集合; [...]一组中的所有成员都不同,[...]

抽象数据类型 set 没有 ordered unordered 的特性。 定义了一些在一组上运行的方法 - 但它们都没有与排序有关(例如参见 Martin Richards :'数据结构和算法')。

如果一组中的每个元素也在另一组中,则看到两组相等 - 并且没有其他元素。

当你写下一个集合(以及集合中的所有元素)时,你需要按照某种顺序写下它们。请注意,这只是适当集合的表示。

示例:包含元素1,2和3的集合可以写为{1,2,3},{1,3,2},{3,1,2}等等。这些只是同一组的不同表示。

具体实施

在不同的编程语言中, sets 以不同的方式实现,并考虑到不同的用例。

在某些语言(如python,JAVA)中,标准集实现不会在其接口中公开排序。

在某些语言(如C ++)中,标准集实现在其接口​​中公开排序。

示例(C ++):

  

在内部,集合中的元素总是按照在容器构造上设置的特定严格弱排序标准从低到高排序。

     

模板< class Key,class Compare = less,              class Allocator = allocator>类集;

(见C++ set)。

答案 1 :(得分:2)

哈希函数(通常)不是集合的外部可见或可修改参数;此外,即使您有一个哈希函数已知且具有良好特征的实现,您也无法指定哈希值冲突时的行为。

通常的总结是该集的实现可能会强加订单,但接口却不会。

答案 2 :(得分:2)

你指的是集合的定义?根据我的理解,«set»是包含许多独特元素的数据结构的名称,通常允许添加和删除。其他一切都没有保证,可能会受到实施。

它没有说明没有订单,但没有针对每个有效实施的特定订单。哈希表的使用很常见,但也可以使用任何类型的列表或树。

所以顺序可能是通过一个哈希函数(已经有很多可能的实现),或者与添加顺序有关或者...

答案 3 :(得分:0)

在将新元素添加到HashSet之后,它会被修改,并且根据哈希值计算,新元素可能会放置在任何位置。因此,不会保留先前的顺序。