zoukankan      html  css  js  c++  java
  • 寻找所缺的数

    算法导论第四章思考题4-2:

          某数组A[1..n]包含所有从0到n的整数,但其中一个整数不再数组中。在这个问题中,我们不能由单一的操作来访问A中的一个完整整数,我们所能用的唯一操作就是“取A[i]的第j位”,这个操作所花的时间为常数。设计一种算法能在O(n)时间内找出所缺的整数。A之外的任一完整整数任可以由一个单一的操作来访问。


    思路:第四章的主题是“递归式”,这个问题很可能可以采用分治法,采用某种手段将问题的规模缩小。下面所采用的除法符号”/"为计算机整形除法计算符。


    (1)对于A中所有整数的最低位来说,如果A是有序的,0和1是交替出现的,0的总个数和1的总个数最多差1。依据n是奇偶性可以判定0~n的最低位0的个数和1的个数。那么对A[1..n]的最低位进行一轮统计,就可以得出所缺的那个数的最低位是0还是1。

         a)假设n为偶数,那么0~n的最低位0的个数是n/2+1,1的个数是n/2。进行一轮统计后如果所缺整数的最低位是0,那么我们只要对这些最低位是0的数组项进行继续调查就能找出所缺的整数:忽略最低位,问题转化为在这个子数组中找出0到n/2所缺的数;如果发现所缺的数的最低位是1,同样只要对这些最低位是1的数组项进行继续调查:忽略最低位,问题转化为在这个子数组中找出0到n/2-1所缺的数。

         得出的递归式是: T(n) = T(n/2) + n。


        PS:如果n是偶数,那么对序列中0~n所有偶数进行除2处理,得到的序列是0~n/2;对0~n中所有的奇数进行除2处理,得到的序列是0~n/2-1。

               如果n是奇数, 那么对序列中0~n所有偶数进行除2处理,得到的序列是0~n/2;对0~n中所有的奇数进行除2处理,得到的序列是0~n/2。

         b)n为奇数,类似a)的分析方法。

    (2)假设考虑最高位。假设 k = [log2 n]—取整,即A中的数项有k+1位。那么0~n中的最高位为0的个数为2k (0~ 2k -1) ,最高位为1的个数是n-2k

    对最高位进行一轮统计可以得出结论:所缺的数字在0~2k -1内,还是2k ~n内,如果是前者忽略最高位,问题转化为在子数组中寻找 0~2k -1中所缺的项;

    如果是后者,忽略最高位,问题转化为在子数组中寻找0~n-2k 中缺少的数。

    另一题:

    如果不像上题那样限制读取数据方式,如何寻找A[1...n]中所缺的数。

    (1)对0~n求和,在减去A中数据的和。

    (2)用异或操作,0^1^...^n^A[1]^...^A[n] 为所缺的数。

    (3)利用快速排序在一轮快排结束后,如果中轴元素b所处的位置要么为b+1,要么为b;如果是前者,问题转化为在A[b+2...n]中寻找b+1~n之内所缺的数;如果是后者,问题转化为在A[1~b-1]中寻找0~b-1之内所缺的数。



  • 相关阅读:
    完美解决CTRL+空格不能切换中/英文输入法的问题
    【Delphi内联汇编学习1】Delphi与汇编
    替换bmp图片中的颜色 good
    将四个BYTE数值转换成IEEE754标准的浮点数(两种方法:用Addr函数取字节数字的首地址,或者用Absolute关键字)
    在delphi的exe文件中嵌入另外一个exe文件
    Qt中的串口编程之三
    使用MIDAS访问远程Access数据库
    QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite
    Qt for Linux:环境搭建(CentOS 6.5 32位)——完全从零安装
    Qt for Windows:使用WinPcap开发高性能UDP服务器
  • 原文地址:https://www.cnblogs.com/longhuihu/p/10423412.html
Copyright © 2011-2022 走看看