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

摘要:
《算法导论》中有一节关于“(比较)排序算法时间的下限”。本文将讨论相同的问题,但观点略有不同。本文将从信息熵的角度讨论排序算法的时间复杂度下限。(比较)排序算法时间的下限对排序序列和排序方法施加以下限制。没有关于排序序列的先验信息,例如序列中数据的分布和范围,也就是说,序列中的元素被认为在开放区间中均匀分布。(比较)排序算法的算法时间复杂度相当于需要多少比较操作来确定输入序列的排列。

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

1. 问题归约

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

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

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

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

2 . 信息熵

    香农对信息的定义是事物运动状态和存在方式的不确定性描述。事件排序算法时间复杂度的下界第7张发生所含有的信息量(自信息量)可以表示为

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

    对于随机变量排序算法时间复杂度的下界第9张而言,定义其平均自信息量为信息熵,可表示为

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

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

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

    对于每次比较,可以获得排序算法时间复杂度的下界第4张或是排序算法时间复杂度的下界第5张,因此获得的信息量是(单位:比特)

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

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

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

3. 另一个问题

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

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

    由于不知道假币轻重,因此信息量为排序算法时间复杂度的下界第20张,每次测量可以获得排序算法时间复杂度的下界第21张的信息(轻-重、重-轻,一样重),因此需要称

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

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

免责声明:文章转载自《排序算法时间复杂度的下界》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python程序打包成.exe----pyinstaller工具DirectX 官方文档下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

七大查找算法

顺序查找 二分查找 插值查找 斐波那契查找 树表查找 分块查找 哈希查找 查找是在大量的信息中寻找一个特定的信息元素。在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。 查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。 查找算法分类: 1)静态查找和动态查找: 注:静态或者动态都是针对查找表而言的...

在Eclipse下搭建Android开发环境教程,HelloWord

本文将全程演示Android开发环境的搭建过程,无需配置环境变量。所有软件都是写该文章时最新版本,希望大家喜欢。 我们昨天向各位介绍了《在NetBeans上搭建Android SDK环境》,前不久也介绍过《在MyEclipse 8.6上搭建Android开发环境》,都受到了读者的欢迎。但是很多朋友都认为NetBeans在中国用户不多,MyEcli...

数据结构学习——shell排序的C语言实现

shell排序:   这个排序的命名是来自发明者的名字,和排序的方法没有字面上的联系。所以不要因为名字而感觉很难。在K&R的C程序设计语言中书中只用了几行代码很简洁的实现了这个排序算法。那就来看看这个排序是如何实现的。 原理:   我们将所要排序的序列(大小为n)划分成组,组的数量一般是可以用这个序列的大小的一半来定义(也就是d = n/2),然...

几种常见的排序算法分析

选择排序 选择排序是一种非常直观且简单的排序算法。它工作的流程是这样的: 首先找出数组中最小的那个元素,将它和数组的第一个元素交换位置;然后在第二个到最后一个元素中间找到最小的那个元素与数组的第二个元素交换位置。 就这样依次遍历,直到将整个数组排序。 选择排序不是稳定排序,但是是原地排序,时间复杂度是平方级,空间复杂度为1。 C++代码实现如下: #inc...

【转】在Eclipse下搭建Android开发环境教程

本文将全程演示Android开发环境的搭建过程,无需配置环境变量。所有软件都是写该文章时最新版本,希望大家喜欢。   一 相关下载 三 Eclipse配置   (1)Java JDK下载   1 安装android 开发插件   (2)Eclipse下载   2 配置Android SDK   (3)下载Android SDK   3 新...

redis的zset结构跳表

一、数据结构与算法——跳表 什么是跳表 跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见右边的示意图)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法...