订购和分拣有什么区别?

时间:2013-06-21 16:22:51

标签: c++ data-structures tree

不,这不是一个类的问题,我正在研究树和堆(部分排序的二叉树),我想知道如何正确定义这两个与通用数据结构相关的属性/动作。 / p>

9 个答案:

答案 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)

作为单词,它们几乎是计算机代码上下文中的同义词。例如:

  • SQL有一个order by子句,因此您的数据行是有序的。
  • Java有SortedSetSortedMap接口,Collections.sort()接口有List方法,数组有Arrays.sort()方法。

如果我要指定差异,那么我会说数组或java.util.List 已排序但未排序

当您将对象放入arrayList时,它们会保留它们放入的顺序,您可以通过索引访问它们,但它们不会被排序,因为< em>排序是任意的

使用java.util.SortedSet,您可以按照自己喜欢的顺序放置对象,因为它会按natural orderingjava.util.Comparator中的公式对它们进行排序。但是,您无法通过索引访问元素。这会使他们排序但不排序