• 对已知有限集合中缺失或重复元素的查找


    问题描述: 一直有限集U,U内元素各不相同,先从U中删去/添加元素 x1, x2, ... , xn (0<=n<=U.length, xi 属于 U)得到 U',找出所有删去/添加的元素, 要求时间复杂度为O(n),空间复杂度为O(1)

    1.先讨论最简单的情况,我们只从集合U中删除/添加 1个元素

    例如, U = {5, 3, 1, 4, 2}   U' = {5, 3, 1, 2}

    又如   U = {5, 3, 1, 4, 2}   U' = {5, 3, 1, 4, 1, 2}

    这种情况解法很简单,一般来讲如下:

    1) 设sum(U)表示集合U所有元素之和,则删除的元素为 sum(U) - sum(U'), 添加的元素为 sum(U') - sum(U)

    2) 根据异或的性质, A ^ A = 0, A ^ 0 = A, 设添加或删除的元素为x, 可知 U ^ U' = x

    2. 假设是从集合U中删除/添加 2 个元素 a, b, 又如何

    1) 假设sum(U)表示U所有元素之和,容易知道 sum(U) - sum(U') = +/- (a + b),由数学知识容易知道解2元方程需要两个方程,那么现在需要构造第二个方程。设product(U)表示U所有元素之积,那么 product(U) / product(U') = a*b 或 1/(a*b), 如果说这里product(U)有可能溢出,我们可以改用平方和。那么由这两个方程

    sum(U) - sum(U') = +/- (a + b)

    product(U) / product(U') = a * b 或 1 / (a * b)

    即可解出所求的a, b

    2) 使用异或,实际上此时 U ^ U' = a ^ b, 我们已经无法继续得到 a 或者 b的值

    3. 假如删除/添加的元素有n个, a1, a2, ... , an ,又如何?

    1) 可以继续使用解方程组的形式,当然你得找的到这么多方程组,还能解得出来

    2) 想到原来双数组查找重复元素的方法, 可以先对 U 和 U‘ 进行排序,然后将元素多的数组在 短的数组里进行顺序查找,找到的元素从短数组里删去,找不到的元素即为重复或删去的元素,这个算法复杂度是排序算法的复杂度。

  • 相关阅读:
    动态规划之背包问题
    Python中import导入上一级目录模块及循环import问题的解决
    Anaconda介绍、安装及使用教程
    负载均衡基础知识
    TCP和UDP的区别(转)
    microsoft visual c++ 14.0 is required问题解决办法
    python使用requests时报错requests.exceptions.SSLError: HTTPSConnectionPool
    解决Anaconda无法更新的问题
    彻底的理解TCP协议的三次握手和四次分手
    android调试工具 adb命令学习
  • 原文地址:https://www.cnblogs.com/zemliu/p/2743845.html
Copyright © 2020-2023  润新知