排序算法时间复杂度的下界

《算法导论》中有一节讲的是“(比较)排序算法时间的下界”,本文将论述同一个问题,思路略有差异。本文将从信息熵的角度论述排序算法时间复杂度的下界。若本文论述过程中有错误或是不足,还请各位指正。

1. 问题归约

排序,涉及到被排序的序列和排序的方法。(比较)排序算法时间的下界对被排序的序列和排序方法做了以下限制

  • 没有关于被排序序列的先验信息,譬如序列内数据的分布、范围等,即认为序列内元素在一个开区间内均匀分布。同时,序列内元素互异。(可以从两个方面理解元素互异的限制,其一是对于随机的序列而言,两元素相同的概率约为0;其二是比较排序中没有对相同元素的特殊处理)
  • 排序方法中仅仅利用了比较运算来确定元素的顺序。不失一般性,假设每次比较仅取2个元素,比较其大小。

那么,对于输入序列为长度为的序列而言,比较的过程可以表示为从序列中选择,判断或是。排序算法的输出是。排序的过程是输入序列位置调整的过程,一旦给定输入序列和算法,那么这个调整的过程是确定的,也就是说,结合排序算法和输出的有序序列,可以知道输入序列的排列方式。

    (比较)排序算法的算法时间复杂度等价为确定输入序列的排列方式需要多少次比较操作。

2 . 信息熵

香农对信息的定义是事物运动状态和存在方式的不确定性描述。事件发生所含有的信息量(自信息量)可以表示为

对于随机变量而言,定义其平均自信息量为信息熵,可表示为

对于排序问题,我们可以认为排序算法执行之前,对于待排列数据的没有获得任何信息。在排序过程中,获得了信息使得待排列数据排列方式的不确定度减小了。待排列数据的排列方式共有种,因此其信息量为(单位:比特)

对于每次比较,可以获得或是,因此获得的信息量是(单位:比特)

因此最少需要次比较才能够解决这一问题。对应(比较)排序算法时间的下界为。由于,因此

3. 另一个问题

关于信息、自信息、信息量、信息熵的一个经典的问题可以描述如下

设有12枚同值硬币,其中有一枚为假币。只知道假币的重量和真币的重量不同,但不知道究竟是重还是轻。现采用天平左右两边轻重的方法来测量(没有砝码)。为了在天平上称出哪一枚是假币,试问必须称多少次?

由于不知道假币轻重,因此信息量为,每次测量可以获得的信息(轻-重、重-轻,一样重),因此需要称

我开始一直不觉得这个结果是对的,直到有人给出了各种数量硬币在不同情况下需要称的次数,我才接受了这个方法和结果。也就是说,选择合适的测量方式,称3次一定能够找出哪一枚是假币。

时间: 2024-08-02 02:45:22

排序算法时间复杂度的下界的相关文章

常用排序算法时间复杂度和空间复杂度简析

1. preface /**** *    This article will try to explain something about: *        --Bubble sort. *        --Quick sort. *        --Merge sort. *        --Heap sort. *    To read this, some prerequisites is necessary: *        --a survive skill in C pr

合并排序算法时间复杂度分析

一.合并已排序的两个数组,依次比较两个数组元素大小,并按大小加入到暂存数组B,最后保存到A: Algorithm: MERGE(A, p, q, r) 输入:数组A[p...q]和A[q+1...r],各自按升序排列 输出:将A[p...q]和A[q+1...r]合并后的升序排序的新数组 01. s←p; t←q+1; k←p; {s, t, p 分别指向A[p...q], A[q+1...r]和暂存数组B} 02. while s≤q and t≤r 03. if A[s] ≤A[t] the

比较排序算法时间复杂度下界为nlogn的证明

比较排序算法的时间复杂度是O(nlogn)的证明: 排序算法的比较是两两进行的,所以可以抽象成一棵二叉树,相互比较的数分别是左右叶子结点,,比较的结果存储在父节点中,依此类推.那么算法的时间复杂度就是取决于树的深度.如果要对n个数字进行比较排序,则需要进行n!次,即该二叉树有n!片叶子. 一棵深度为d的二叉树拥有的叶子结点数最大为2d个,则具有n!片叶子的二叉树的深度为logn!. logn!=logn+log(n-1)+log(n-1)+…+log(2)+log(1)≥logn+log(n-1

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

新发现:排序算法时间复杂度只有O(3n),命名为"wgw"排序法

思路:首先在待排序数组i[]中找出最大的值,以(最大值+1)的大小创建一个空数组kk[],然后遍历待排序数组i[]中的值n,其值n对应数组kk[]中的第n个元素加1.最后再把数组kk[]排好序的值赋回给数值i[]. 评价:此算法时间复杂度为O(3n) 代码实现如下: int[] i ={2,6,9,8,5,6}; int temp = i[0]; for (int k = 1; k < i.length; k++)    {    if(i[k] > temp){     temp = i[k

各种排序算法时间复杂度

各种排序算法比较 各种常用排序算法 类别 排序方法 时间复杂度 空间复杂度 稳定性 复杂性 特点 最好 平均 最坏 辅助存储 简单 插入 排序 直接插入 O(N) O(N2) O(N2) O(1) 稳定 简单 希尔排序 O(N) O(N1.3) O(N2) O(1) 不稳定 复杂 选择 排序 直接选择 O(N) O(N2) O(N2) O(1) 不稳定 堆排序 O(N*log2N) O(N*log2N) O(N*log2N) O(1) 不稳定 复杂 交换 排序 冒泡排序 O(N) O(N2) O

各种排序算法时间复杂度、稳定性、初始序列是否对元素比较次数有关

怎么记忆稳定性: 总过四大类排序:插入.选择.交换.归并(基数排序暂且不算) 比较高级一点的(时间复杂度低一点得)shell排序,堆排序,快速排序(除了归并排序)都是不稳定的,在加上低一级的选择排序是不稳定的. 比较低级一点的(时间复杂度高一点的)插入排序,               冒泡排序,归并排序,基数排序都是稳定的. (4种不稳定,4种稳定). 怎么记忆初始序列是否对元素的比较次数有关: [cpp] view plain copy /** * @brief 严版数据结构书代码 *   

时间复杂度,相关排序算法时间复杂度的比较

常见的时间复杂度: 常见的时间复杂度大小比较: 常见的排序算法的时间复杂付比较: 原文地址:https://www.cnblogs.com/yangzhixue/p/12227287.html

计数排序算法——时间复杂度O(n+k)

计数排序 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法. 算法思想 计数排序对输入的数据有附加的限制条件: 1.输入的线性表的元素属于有限偏序集S: 2.设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n). 在这两个条件下,计数排序的复杂性为O(n). 计数排序的基本思想是对于给定的输入序列中的每一个元