zoukankan      html  css  js  c++  java
  • 对已知有限集合中缺失或重复元素的查找

    问题描述: 一直有限集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‘ 进行排序,然后将元素多的数组在 短的数组里进行顺序查找,找到的元素从短数组里删去,找不到的元素即为重复或删去的元素,这个算法复杂度是排序算法的复杂度。

  • 相关阅读:
    快速排序
    将指定目录下的所有子文件或子目录加载到TreeView
    导入英汉文本,用字符串切割,泛型集合存储的英汉字典
    取年月日的字符串方法
    简化的MVC-导入模板HTML,导入数据txt,用字符串方法生成JS菜单
    索引器的使用
    打开文件练习
    泛型委托
    将正则表达式转化成确定的有限自动机
    青蛙过桥
  • 原文地址:https://www.cnblogs.com/zemliu/p/2743845.html
Copyright © 2011-2022 走看看