快排的O(NlogN)真的最快了吗?
相信大家都已经知道如归并排序、快速排序等算法能在把排序的时间复杂度降为O(NlogN)级别,而排序的时间复杂度理论上最好是O(N)级别,因为最优情况也得把数据读取一遍。所以要探讨的问题是还有没有排序算法能把时间复杂度降为O(N)或者说趋近于O(N)?由于本人也不是数学专业,所以证明排序时间复杂的下界不多说。但是在特定条件下排序的时间复杂度可以降到O(N)级别,比如桶排序。
基于比较的排序的时间复杂度下界
我们之前看的算法大都是基于比较的排序,这里也是证明基于比较的排序的时间复杂度下界。
由判定树证明
判定树简单地说就是叶节点是所有可能情况,非叶节点是中间过程,路径是判定条件。理解如下图:
进一步对于N个数据,有N!个可能情况,即N!个叶节点。
证明:假如有N的结点,第一个节点的可能选择有N种,它选择完后,第二个结点的可能选择有N-1种,依次类推,第N个结点的可能选择有N种,即全部可能:N * (N-1) * …. * 1 = N! 种。判定树的最低高度是log(N!)。
证明:易知它是一个满二叉树,根据满二叉树定理,结点总个数nums = 2 * N! - 1。又同时它是一颗很平衡的二叉树,即每个结点的左右子树的高度之差不大于1,所以把最底层所有结点向右靠齐,可得到一个完全二叉树。完全二叉树的高度:d = (int)log(2 * N! - 1) + 1 = (int)log(2 * (N! - 1/2)) + 1 > log(2 * (N! -1/2)) >= log(N!)。基于比较的排序的时间复杂度下界是Nlog(N)
证明:d > log(N!) = log(N * (N - 1) … 1) = log(N) + log(N - 1) + … + log(1) >= log(N) + log(N - 1) + … + log(N/2) >= log(N/2) + log(N/2) + … + log(N/2) >=(N/2)log(N/2)。所以基于比较的排序的时间复杂度下界是Nlog(N)。