• 寻找所缺的数


    算法导论第四章思考题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之内所缺的数。



  • 相关阅读:
    安装VMware,出现Microsoft Runtime DLL 安装程序未能完成安装,解决方法
    linux mysql udf 提权
    XXE漏洞学习
    了解Metasploit中的Payloads(有效载荷)
    Metasploit 如何使用Exploits(漏洞)
    Metasploit 使用MSFconsole接口
    Metasploit 模块和位置
    Nmap速查手册
    Linux常用命令大全(非常全!!!)
    Web中常见的绕过和技巧
  • 原文地址:https://www.cnblogs.com/longhuihu/p/10423412.html
Copyright © 2020-2023  润新知