8.1-3 证明:对于长度为n的n!中输入中至少一半而言,不存在线性时间的比较排序算法。对于n!中的1/n部分而言又怎样呢?1/2n部分呢?

  解:即在决策树模型中求1/2, 1/n, 1/2n 部分的平均路径长度。分别为 \lg\frac{n!}{2}, \lg\frac{n!}{n}, \lg\frac{n!}{2^{n}}。渐近时间复杂度均为O(nlgn)。

  8.3-4 说明如何在O(n)时间内,对0到n2-1之间的n个整数进行排序。

  解: 这个问题技巧性较强。基数排序,以n为基数,数长度为2,每位有n个可能取值。时间复杂度O(n)。

 8.3-5 在本节的第一个卡片排序算法中,为排序d位十进制数,在最坏情况下需要排序几遍?最坏情况下操作员要看管几堆卡片?

  解:第一个卡片排序算法,即从高位开始进行基数排序。用这种方法进行排序,第一遍情况下把所有数分为10组,然后需要对每组数据的第二位进行一遍排序,最坏情况下每组数据又分为10组。

    这样当前组每排序一遍就分为10组数据。第一位排序1遍,第二位10遍,第i位10i-1 遍,最坏情况下需排序(10d - 1)/9 遍。在第d位共有10d  堆。

 8.4-4 在单位圆中有n各点,p_{i} = (x_{i}, y_{i}),使得 0 < {x_{i}}^{2} + {y_{i}}^2 \le 1, i = 1, 2, \dots, n。假设所有点都是均匀分布的,亦即,某点落在某一区域中的概率与该区域的面积成正比。请设计一个 \Theta(n) 期望时间的算法,来根据点到原点的距离 d_{i} = \sqrt{{x_{i}}^{2} + {y_{i}}^{2}} 对n个点排序。

  解:桶排序: 点均匀分布,则每个桶的尺寸应相等,即每个桶在圆中所占据的面积相等。把圆分为n个部分,第一个部分是以原点为圆心的圆,其他部分是以原点为圆心的圆环。设第i部分的半径为

ri (外圆环到原点距离),则对于相邻的i,j。i < j,有 rj - ri = 1/n,又r1 = 1/n。据此可求可ri ,可得各圆环的半径。

 8.4-5 一个随机变量X的的概率分布函数P(x)定义为P(x) = Pr{X <= x}。假设n个随机变量X1,X2, ...,Xn 符合连续概率分布函数P, 它在O(1)时间内计算。说明如何在线性时间期望内排序这n个数。

  解:X符合分布P,不一定是均匀分布,且不知范围。但P(x)值属于[0, 1],且对于X严格单调递增,排序P(x)即排序X。将P(x)均匀分为n个部分,由于X随机选取,所以落入每个范围的概率相同。

如果 (i-1)/n <= p(xi) < i/n,则将它放入第i个桶中。

8-2 以线性时间排序

  解: a) b) c) 可用同一算法解决:用两个指针i, j。i -> 0, j -> 1。从右往左扫描数组,如果 j > i 则交换j, i 所指的元素,否则移动指针。

    d) 算法同a)中算法,在比较两元素大小的时候可以用基数排序,a)中算法比较次数不超过n。两个元素基数排序时间为O(d)。时间复杂度为O(dn)。

    e) 还是上代码吧:

 1 void inplace_counting_sort(int *arr, int size, int k) 2 { 3     int *temp = (int*)malloc(sizeof(int)*k); 4     int *temp1 = (int*)malloc(sizeof(int)*k); 5     int *temp2 = (int*)malloc(sizeof(int)*k); 6     int i; 7     for(i = 0; i < k; i++) 8     { 9         temp[i] = 0;10         temp1[i] = 0;11         temp2[i] = 0;12     }13     for(i = 0; i < size; i++)14     {15         temp[arr[i]] += 1;16         temp1[arr[i]] += 1;17         temp2[arr[i]] += 1;18     }19     for(i = 1; i < k; i++)20     {21         temp[i] += temp[i-1];22         temp1[i] += temp1[i-1];23     }24     25     // from size-1 to 0, make sure every element is in its right postion.26     int j = size - 1;27     while(j >= 0)28     {29         int value = arr[j];30         // if value in its rightpostion,skip this position; otherwise swap the values in 31         // arr[j] and arr[temp[value]]32         if((j >= temp1[value]-temp2[value])&&(j <= temp1[value]-1))33         {34             if(temp[value] == j+1)35                 temp[value]--;36             j--;37         }38         else39         {40             arr[j] = arr[temp[value]-1];41             arr[temp[value]-1] = value;42             temp[value]--;43         }44     }45 46     free(temp);47     free(temp1);48     free(temp2);49 }

  8-4 水壶

  解:a) 略

    b) 两种水壶共有n!中对应,决策树模型中节点个数不少于n!。比较次数最少为lgn!。

         c) 类似快速排序:

     1. 从红色水壶中随机挑选一个水壶r,找到对应的蓝色水壶b,并将蓝色水壶分为容量大于r和小于r的两部分r>, r<。

       2. 用b将红色水壶分为容量大于b和小于b的两部分b>, b<。

     3. 利用上述方法分别比较r>, b> 和 r<, b<。

转载于:https://www.cnblogs.com/meteorgan/archive/2012/03/01/2375152.html

算法导论-线性时间排序习题解相关推荐

  1. 时间排序python_算法导论 第八章 线性时间排序(python)

    比较排序:各元素的次序依赖于它们之间的比较{插入排序O(n**2) 归并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)} 本章主要介绍几个线性时间排序:(运算排序非比 ...

  2. 最大子数组问题 线性时间_我最喜欢的线性时间排序算法

    最大子数组问题 线性时间 by Franziska Hinkelmann 通过Franziska Hinkelmann 我最喜欢的线性时间排序算法 (My Favorite Linear-time S ...

  3. 算法导论 第二部分——排序和顺序统计量

    一.堆排序 : 原址排序 复杂度: nlg n 最大堆: A[parent(i)] > = A[i] 最小堆: A[parent(i)] < = A[i] 除了最底层外,其它层都是满状态. ...

  4. 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现

    计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 算法思想 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将 ...

  5. 第8章 线性时间排序

    一.概念 任何比较排序在最坏情况下都要用O(lgn)次比较不进行排序 计算排序.基数排序.桶排序都是稳定排序 二.代码 #include <iostream> #include <c ...

  6. 【算法导论】 内部排序算法总结

    排序名称 时间复杂度 空间复杂度 稳定性 直接插入排序 O(n^2) O(1) 稳定 折半插入排序 O(n^2) O(1) 稳定 希尔排序 O(n^2) O(1) 不稳定 冒泡排序 O(n^2) O( ...

  7. 算法导论 — 8.1 排序算法的下界

    笔记 我们所熟知的插入排序.归并排序.快速排序等排序算法,它们的排序过程都依赖于比较元素间的大小,我们称这些算法为比较排序.本节讨论比较排序算法的运行时间的下界. 给定一个输入序列 < a 1 ...

  8. 算法导论6:排序小结和最值取法 2016.1.6

    今天想做测试各个排序算法运行时间比较的程序,来对这几天学的排序算法小结一下.所以我先生成了1000000个1~150之间的随机数存到文件里.然后做了一个测试运行时间的程序.想看一下结构.但是结果效果并 ...

  9. 算法导论-排序(四)计数排序(线性时间排序)

    目录 1.计数排序介绍 2.流程图 3.代码实现 4.性能分析 5.参考资料 内容 1.计数排序介绍 什么是计数排序? 计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为 ...

最新文章

  1. 手动修改oracle scn号,SCN(系统改变号)
  2. 【计算机网络】网络安全 : 公钥分配 ( 公钥使用者 | 公钥分配 | CA 证书格式 | CA 证书吊销 )
  3. centos配置yum本地源
  4. 小米自动化运维平台演进设计思路
  5. python打开setting_Django自带日志 settings.py文件配置方法
  6. Makefile的写法
  7. 【数据库基础知识】plsql安装及配置
  8. python txt 操作_python TXT文件操作
  9. web网页打印设计的CSS样式
  10. b2c京东流程图_京东商城网上交易流程分析
  11. 使用pyQt5 + agora + leanCloud实现基于学生疲劳检测的在线课堂
  12. sqlserver200864位下载_sql server 2008 r2 32位下载-sql server 2008 r2 3264位 中文版 - 河东下载站...
  13. Minecraft 1.19.2 Forge模组开发 01.Idea开发环境配置
  14. 基于51单片机的红外遥控器设计
  15. 如何维持手机电池寿命_教你一招,可以让你的手机电池容量长期维持在峰值,延长电池寿命...
  16. 三分钟带你领路Java-JFrame窗体美化
  17. OpenLayers3基础教程——OL3 介绍control
  18. 稀里糊涂地被评为博客之星的候选人了,那就麻烦大家帮忙投个票吧~
  19. 程序员最爱用的在线代码编辑器合集,哪款是你的最爱?
  20. 难过!能不能放下抢票套路,我只想买好好回家过年!我在网上抢火车票:多加了100元的加速包,却依然买不到票...

热门文章

  1. Spring mvc Controller接口
  2. 创建服务factory和service方法的区别
  3. C#文件目录IO常见操作汇总
  4. lxml读取本地html文件,如何使用Python和lxml来解析本地html文件?
  5. 判断字符串中是否包含指定字符(JavaScript)
  6. linux入门_Linux入门的10种方法
  7. Bootstrap3 警告框插件的使用方法
  8. Bootstrap 弹出提示插件Popover 的方法
  9. 玩游戏计算机丢失msvcp,Win10系统玩吃鸡提示游戏缺少msvcp140.dll的解决方法
  10. php实现数字英文验证码,PHP英文数字验证码生成类