关于排序的探讨
2012-07-20 15:23
162 查看
所有的排序算法,不论是堆排、快排还是冒泡排序,都有一个假设前提:被排的各个元素之间存在着一种全序关系。所谓全序,简单说就是是这样一种关系:1,自反性,<a,a>属于R;2,反对称性,如果<a,b>属于R,且<b,a>属于R,则a==b;3,传递性,如果<a,b>属于R,<b,c>属于R,则<a,c>属于R;4,可比较性,要不<a,b>属于R,要不<b,a>属于R。由此可见,实数上的"≤"关系都属于全序。各位看官暂且不要纠结于这个不甚严密的定义。
排序的时间复杂度下限可以达到O(nlogn),其实是O(log(n!)),正是因为存在的这种全序关系(不一定要一定满足这个全序关系,比如"<"比较就不是全序,但是它的补集是全序);而同时,一列数据能够排序,也是因为存在这种全序关系。只要存在全序关系,一列数据才可以形成一条链。
对于存在全序关系的,我们可以采用各种经典的排序算法,假如不存在呢?比如对一个字符串数组排序,要求:如果s1是s2的子串,s1要排在s2的前面。只有这一个要求,因为有很多字符串是没有办法比较的,当然排序的结果有很多种了。如果要用到传统的排序算法,就需要定义一种全序结构。
项目中就遇到了这种情况,想了很久也没想出很好的解决办法。就换了个思路,如果一种全序能够满足上面要求的必要条件,也应该可以的。比如,s1是s2的子串的一个必要条件就是s1的长度小于s2的长度,这样,只要定义小于比较为长度就满足需求了。虽然能完成任务,但是还不满足,留下了两个问题:
1,如果要用到传统的排序算法,达到O(nlogn)时间复杂度下界,元素一定要满足全序关系(或者补集全序)吗?
2,如果问题1的答案是肯定的,那么是不是一定能找到另一种全序关系,满足要求的必要条件而非充要条件?
排序的时间复杂度下限可以达到O(nlogn),其实是O(log(n!)),正是因为存在的这种全序关系(不一定要一定满足这个全序关系,比如"<"比较就不是全序,但是它的补集是全序);而同时,一列数据能够排序,也是因为存在这种全序关系。只要存在全序关系,一列数据才可以形成一条链。
对于存在全序关系的,我们可以采用各种经典的排序算法,假如不存在呢?比如对一个字符串数组排序,要求:如果s1是s2的子串,s1要排在s2的前面。只有这一个要求,因为有很多字符串是没有办法比较的,当然排序的结果有很多种了。如果要用到传统的排序算法,就需要定义一种全序结构。
项目中就遇到了这种情况,想了很久也没想出很好的解决办法。就换了个思路,如果一种全序能够满足上面要求的必要条件,也应该可以的。比如,s1是s2的子串的一个必要条件就是s1的长度小于s2的长度,这样,只要定义小于比较为长度就满足需求了。虽然能完成任务,但是还不满足,留下了两个问题:
1,如果要用到传统的排序算法,达到O(nlogn)时间复杂度下界,元素一定要满足全序关系(或者补集全序)吗?
2,如果问题1的答案是肯定的,那么是不是一定能找到另一种全序关系,满足要求的必要条件而非充要条件?
相关文章推荐
- [个人原创]关于java中对象排序的一些探讨(一)
- [个人原创]关于java中对象排序的一些探讨(三)
- [个人原创]关于java中对象排序的一些探讨(二)
- 关于mysql对字符串的数字的排序
- 关于使用线程的排序速度
- SortedList关于RecyclerView的排序,去重,更新
- 关于MWI平行宇宙数的探讨
- 关于"Java中方法参数的传递方式"的探讨
- 关于透明和不透明排序问题
- 一个关于文件结构体数组的条件排序函数
- 关于ORACLE数据库中汉字显示乱码问题的探讨
- C语言关于回调函数和this指针探讨
- 探讨关于OSPF的network配置
- 关于插入排序元素之间比较次数的计算
- 杭电水题--排序 关于strtok的一些问题
- 关于选择排序和快速排序--2017-09-24
- 关于Jlkink SDK的探讨
- Java关于List<String> 进行排序,重写Comparator()方法
- MYSQL 关于两个经纬度之间的距离由近及远排序
- 关于java继承中父类方法可见性探讨