Data structures 为什么“set”数据结构被告知是无序的?

Data structures 为什么“set”数据结构被告知是无序的?,data-structures,Data Structures,我认为它是完全有序的,因为元素的位置取决于它们的散列函数,因此如果对象是不可变的,那么在你把它们放入集合后,它们的位置将保持不变。每次你,比如说,打印你的集合,你会得到完全相同的元素顺序。当然,在计算它们的哈希函数之前,您无法预测它们的位置,但无论如何。哈希函数通常不是集合的外部可见或可修改的参数;此外,即使您有一个哈希函数已知且具有良好特征的实现,也不能指定哈希值冲突时的行为 通常的总结是,集合的实现可能会强加一个顺序,但接口不会。通用/抽象数据类型 来自Aho,Hopcroft,Ullman

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

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

通常的总结是,集合的实现可能会强加一个顺序,但接口不会。

通用/抽象数据类型 来自Aho,Hopcroft,Ullmann的集合定义:“数据结构和算法”,Addison Wesely,1987:

集合是成员或元素的集合;[...] . 一个集合的所有成员都是不同的,[…]

抽象数据类型集不具有有序或无序的特征。 有一些定义的方法是对集合进行操作的,但它们都与排序无关,例如,参见Martin Richards:“数据结构和算法”

如果一个集合中的每个元素都在另一个集合中,并且没有其他元素,那么两个集合被视为相等

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

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

具体实施 在不同的编程语言中,集合以不同的方式实现,并考虑不同的用例

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

在C++等语言中,标准集实现公开了接口中的排序。 C++示例:

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

模板<类键,类比较=更少, 类分配器=分配器>类集合


请参阅。

您指的是集合的哪个定义?在我的理解中,«set»是一个数据结构的名称,它包含许多独特的元素,通常允许添加和删除。其他一切都无法保证,可能需要执行

它并没有说没有顺序,但对于每个有效的实现都没有特定的顺序。哈希表的使用很常见,但也可以使用任何类型的列表或树


因此,顺序可能是通过hashfunction实现的,或者与加法顺序相关,或者……

将新元素添加到HashSet后,它会被修改,新元素可能会被放置在任何位置,具体取决于哈希值的计算。因此,之前的订单不会得到维护。

无序并不意味着每次都会更改订单,它意味着无法从用户角度控制订单,也不一定能够预测订单…@deceze谢谢,您从何处获得此定义?@deceze啊。我只是看到了这些引文,并试图找到它。-1:根据未指定的语言和未指定的实现,集合可能会被排序,甚至可能没有可用于元素的哈希函数。@AndreasFlorath:是的,但在没有语言信息的情况下,不适合做出任何假设,肯定或否定,关于它。@Andreas,这个问题对任何语言都不具体,但我想到了Python。@muistooshort:通过这个答案,我想提醒问题的作者更准确一些,因为这个问题在某些上下文中是错误的,集合数据结构被告知是有序的。同时作者补充了更多的信息。有了这些信息和你的提示,我将尝试重新制定我的答案。是的,更新是有意义的。抱歉耽搁了,我不得不睡觉,在这中间工作。我从这里定义了:它是从一个粗俗的课程中讲到的。维基百科也说:在计算机科学中,集合是一个抽象的数据结构,它可以存储某些值,没有任何特定的顺序,也没有重复的值。我们可能看不到或控制不了它,但有一个命令!