不,这不是一个类的问题,我正在研究树和堆(部分排序的二叉树),我想知道如何正确定义这两个与通用数据结构相关的属性/动作。 / p>
答案 0 :(得分:17)
“订购”基本上是一组规则,用于确定哪些项目在其他项目之前或之后。 IE:如果对它们进行排序,则相对订单项会出现。对于强制执行排序的集合,该排序通常根据比较运算符(特别是<
),接口(Java的Comparable<T>
)或比较回调和/或函数对象(如C ++的{{ {1}})。
还有一些描述为“有序集合”的集合。这个词的使用略有不同,但相关的含义。这意味着该集合代表了项目的序列,因此具有一些内置的订单概念。 (与哈希表对比。你在哈希表中添加一些内容,如果你迭代内容,你就不知道它会出现在哪里。你知道有序集合。)列表,向量,数组等是典型的有序收藏品。但是,对于非列表示例,PHP的“数组”类型实际上是“有序映射” - 一种保留键顺序的字典类型。当您遍历数组时,键会按照它们首次插入的顺序(或者您最后使用std::less
之类的顺序)显示。
“排序”是根据给定排序实际安排项目序列的过程。它通常只对有序的集合进行...因为将一个项目放在另一个项目之前没有多大意义,这个容器没有“之前”的概念,或者不会让你首先重新排列项目。 (像集合和堆这样的结构也可以使用排序,添加和删除条目会根据排序改变基础树。有人可能会争辩说它们正在逐步“排序”。但这个词通常用于表示一个操作,是否一次重新排列。)
答案 1 :(得分:16)
非常粗略地说,一个排序指定了哪些元素应该在某个序列中的其他元素之前排序。排序是将这些元素的集合放入由排序指定的顺序的过程。
(稍微容易混淆的是,也可以谈论“排序”一系列元素,这意味着将它们排序为由排序指定的某个顺序。)
更新:
在实现方面,一个很好的例子是标准容器(例如map,http://en.cppreference.com/w/cpp/container/map),它采用额外的模板参数来提供排序。对于map,默认为std::less<Key>
。如果您想要自己的排序,则在创建地图时使用不同的比较器类型,而不是使用它。提供自己的比较器的常用方法是实现一个具有bool operator()(const Key& lhs, const Key& rhs) const
。
答案 2 :(得分:11)
IBM makes a distinction between sorted and ordered sets:
可以对集合进行排序或排序:
有序集是一个集合,其元素按照它们添加到集合的顺序排列。请注意,这是默认情况下创建集的方式。例如:
{int} S1 = {3,2,5};
和
ordered {int} S1 = {3,2,5};
等同。
有序集是一个集合,其中元素按其自然,升序(或降序)顺序排列。对于字符串,自然顺序是字典顺序。自然顺序还取决于系统区域设置。例如:
sorted {int} sortedS = {3,2,5};
和
ordered {int} orderedS = {2,3,5};
是等价的,并且对sortedS或orderedS进行迭代将具有相同的行为。 要指定降序,请添加关键字reverse。
此外,2002年国家标准与技术研究所的国家信息保障伙伴关系proposed an interpretation of the terms:
ISSUE:
术语&#34;排序&#34;之间有什么区别?和&#34;订购&#34;? 有时单词可以互换使用。
STATEMENT
虽然术语&#34;排序&#34;和&#34;订购&#34;有时使用 在IT系统讨论中可互换,它们有些不同 含义。当一个人分类时,一个人将项目分成不同的种类或者 班;当一个订单时,一个人安排特定的项目 顺序。
答案 3 :(得分:1)
我认为在术语或排序算法中考虑这一点是有帮助的。一些排序算法保留了顺序,而其他排序算法没有。例如,考虑两种天真且低效的排序算法冒泡排序和选择排序。冒泡排序保证保留订单,而选择排序则不然。保留订单意味着相同的元素不会被交换。
保留顺序非常重要,尤其是当项目包含未进行排序的其他数据时。例如,如果您按人口年龄排序,他们可能具有相同的年龄但名称不同,您可能希望保留原始订单。
在wiki上查看排序算法,它们给出了时间复杂度及其稳定性。稳定意味着保留原始订单 https://en.wikipedia.org/wiki/Sorting_algorithm
答案 4 :(得分:1)
排名:对集合的部分确定排列的比较;碰撞是可能的
rank1 = max({foo1.bar, foo2.bar})
rank2 = min({foo2.kite, foo2.kite})
排序:加权排名的组合,允许一组完全和唯一的排列,没有潜在的碰撞;当单独的显式排名不适合子集
时,插入顺序通常是后备解决方案order = {
ordering1 = (foo1.bar != foo2.bar) ? rank1(foo1, foo2) : ordering2(foo1, foo2)
ordering2 = (foo1.kite != foo2.kite) ? rank2(foo1, foo2) : fallback(foo1, foo2)
}
排序:使用特定访问和分区策略按订单排列集合
sort1 = strand(foo, order)
sort2 = bubble(foo, order)
排序:按照顺序(真或假)的集合的二进制排列状态
is_sorted = {
for (each foo)
(is_ordered(foo(n), foo(n-1)) ? continue : return false;
return true;
}
答案 5 :(得分:1)
订单关系是可传递的。排序关系不是。
您可以订购一系列整数。你只能对包含香蕉,苹果,浆果的一套进行排序......
答案 6 :(得分:1)
我刺伤了这个...... 订购是用户定义的。例如,您可以根据访问最多,最受欢迎等方式对一组字符串进行排序等。“一般”排序来自一组现有的OS方法。示例包括根据字符串区域设置按字母顺序对一组字符串进行排序。
我看到它的方式如下。如果我订购一个集合,我将指定一个谓词来确定一个项目在哪里存在。如果我对一个系列进行排序,我通常会这样做,因为我想快速查找。排序通常会导致集合中给定项目的快速查找时间。这适用于字符串,整数等。
看看我的回答,我认为订购和分类几乎可以互换。但是,我仍然会说订购是用户定义的,排序是一个已知的概念。例如,我们都知道对名称列表进行排序会产生按字母顺序排序。如果我想根据我自己的算法对名称列表进行排序,比如基于流行度,我会介绍我自己的排序算法,按照我认为合适的方式对字符串进行排序。所以,我想说如果你引入一种算法来排序,但按照你自己的要求排序,那么你就是在订购。
答案 7 :(得分:1)
有序集合意味着其元素 relative <的非易失性,可见且可重现的地址或位置的概念/ em>彼此。 排序则是按照某些标准对元素的实际展示位置。
答案 8 :(得分:1)
作为单词,它们几乎是计算机代码上下文中的同义词。例如:
order by
子句,因此您的数据行是有序的。SortedSet
和SortedMap
接口,Collections.sort()
接口有List
方法,数组有Arrays.sort()
方法。如果我要指定差异,那么我会说数组或java.util.List 已排序但未排序。
当您将对象放入array
或List
时,它们会保留它们放入的顺序,您可以通过索引访问它们,但它们不会被排序,因为< em>排序是任意的。
使用java.util.SortedSet,您可以按照自己喜欢的顺序放置对象,因为它会按natural ordering
或java.util.Comparator中的公式对它们进行排序。但是,您无法通过索引访问元素。这会使他们排序但不排序。