您的位置:首页 > 其它

关于排序的探讨

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的答案是肯定的,那么是不是一定能找到另一种全序关系,满足要求的必要条件而非充要条件?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 任务 c