繁体   English   中英

删除偶/奇数以找到二进制表示的数字数组中的缺失数字

[英]Removing even/odd numbers to find missing number in an array of array of numbers represented in binary

这与第5版《破解编码面试》中的问题5.7(在位操作下)有关(如果is问题不适用于SO,请让我知道正确的位置,然后我将其移动):

数组A [1..n]包含从0到n的所有整数,但缺少一个数字。 在此问题中,我们无法通过单个操作访问A中的整个整数。 A的元素以二进制表示,我们可以用来访问它们的唯一操作是“获取A [i]的第j位”,这需要固定的时间。 编写代码以查找丢失的整数。 你能在O(n)时间内完成吗?

应用的算法是这样的:

  1. 检查列表中所有数字的最低位。
  2. 计算LSB中1和0的出现次数。 如果count(0)<= count(1),则遗漏数字的LSB为0。否则为1。
  3. 删除所有LSB与步骤2中找到的结果不匹配的数字。
  4. 重复1到4,并在每次迭代中逐步检查下一个LSB​​。

有人可以解释步骤3背后的逻辑吗? 基本上,它会从当前列表中删除所有奇/偶数(取决于找到丢失数字的位),并在下一次迭代中使用修改后的列表。 我们为什么要做这个?

第3步旨在(极大地)改善算法的运行时间。 如果包括步骤3,则整个算法是使用LSB作为分支决策器的二进制搜索算法。 如果省略了步骤3,则它仍然是二进制搜索,但是实现的方式不会在每次遍历中对数变快(这将超过O(n)界限)。

顺便提一句,正如所写的那样,似乎有点移位,或者术语LSB的使用相当自由。

该算法不起作用。 如果数组中元素的数量为偶数,则步骤2可以找到相等的0和1。 例如,当缺失的数字在范围的一端或另一端时,可能会发生这种情况。

如果数组中的元素数不偶数,它将在步骤3之后的下一次迭代中。

附录

这是一个例子。

设置:0、1、3

在步骤1&2之后,我们有1 LSB = 0和2 LSB = 1。 因此,根据步骤2,LSB必须为0。到目前为止,还不错。

第3步之后,从LBS = 1的集合中删除值,我们得到:

设定:0

在步骤1&2之后,我们有1 LSB'= 0和0 LSB'= 1。 因此,根据步骤2,LSB'必须为1。

至此,我们完成了(删除了LSB'= 0的元素后该集合为空),并已将2标识为答案(LSB'= 1,LBS = 0)。

这是如何运作的?

每次迭代后,请考虑将数组中的值右移一位以放弃在上一次迭代中确定的位。 这将在数​​组中为所有值(缺少的值除外)创建重复项。 该算法只是丢弃这些重复项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM