如何找到输入中缺少的4字节数?

时间:2016-09-18 14:53:30

标签: python algorithm

我有这样的任务,实际上根本不知道如何开始。 在输入上,我有一个巨大的4字节正数。数字可以重复。我知道其中一个数字不包含在输入数组中。如何使用最少的资源找到这个数字?

4 个答案:

答案 0 :(得分:3)

最简单的代码可能是(在伪代码中):

function find_missing(input)
    sort!(input)   # in-place sort, should take most of the time
    val = 0
    for d in input    # go over sorted input
        if d == val
            val += 1
        end
        if d > val
            break
        end
    end
    return val
end

上面的函数应该返回缺失值或者为零(如果由于整数的回绕而没有缺失值)。如果缺失值为零,则会出现一些混乱,但修复很简单并留给读者。

注意:这不是最快的方法。更快的方法将使用多次传递将输入分割为子集并使用最大可用内存分析这些子集。

答案 1 :(得分:0)

我不确定我是否完全理解你的问题。但是,根据我的理解,你有一个整数数组和一个输入(也是整数)。

{{1}}

在这种方法中,输入没有排序,它具有O(n log n)时间复杂度,而且,您不存储整个输入(假设输入来自外部文件)。唯一的内存要求是保存整数集。如果原始数字列表中存在许多冗余,则该组的大小将显着减小。设置查找是O(1)。因此,所提供的解决方案具有O(n)时间复杂度,其中n是输入项的数量。

答案 2 :(得分:0)

您尚未指定如何知道原始值集的含义,因此我将继续并假设您有两个值列表set1set2,它可能包含也可能不包含重复项,可能会也可能不会以相同的顺序排列,并且会因您希望识别的单个元素而不同。我不会担心这些集合的起源。

使用该设置,您可以对所有数据进行异或。结果将是您缺失的值。为了说明这一点,我有一个小的演示,它创建了两个相同的列表,从第二个列表中随机删除一个元素(并保留用于检查的值),对列表进行洗牌,并进行异或。

import random as r
from functools import reduce

def xor_all(lst):
    return reduce(lambda x,y: x ^ y, lst)

set1 = [1,2,3,3,4,5,6,7,8,8,9]
r.shuffle(set1)
set2 = [1,2,3,3,4,5,6,7,8,8,9]
rv = set2.pop(r.randrange(len(set2)))
r.shuffle(set2)

print("deleted value was: ", rv)
print("xor_all identified: ", xor_all(set1) ^ xor_all(set2))

答案 3 :(得分:0)

我和Dan Getz一起假设这个问题。 Dan的解决方案在最坏的情况下为您提供O(n log n)运行时。

现在这个疯狂的想法: 如何跳过“最重”的开销O(n log n)的排序部分?不要从排序开始,只需维护一个Hashmap个全4字节正整数,其中整数本身作为键,false作为默认值。 一些伪代码:

开始

foreach number in the input:
   if the number is in the valid range:
      if the corresponding hashmap entry has the value set to `false`, toggle it to `true`
      otherwise, do nothing and skip to the next input
foreach Hashmap entry
      if the value is `false` return the key of that entry

<强>端

Hashmap的大小小于或等于输入的大小(n)。 最坏情况下的运行时复杂度O(n) 在内存方面,你需要额外的O(n)内存。很可能它会比Dan Gretz解决方案更糟糕(取决于他使用的排序算法,如果我假设正常的合并排序,那么我的解决方案可能会在大部分时间浪费更多内存并且会浪费相同或更少的内存量在合并排序的最后一步中)