<<算法导论>>习题4-2怎么做

feitianmouse 2007-09-28 09:54:30
题目如下:A[1...N]包含[0...n]中的所有整数数字except one,找出这个数字很简单,只要用一个辅助数组B[0...N]就可以找出少掉的这个数字,复杂度为O(n),但是现在的问题是不可以直接读取A中的整数,因为A中的整数是以二进制存取的,唯一的操作就是取其中的第几位,比如说取第j位,这个操作花费一个常量时间。
要求证明:找出那个少掉的数字仍只需要复杂度O(n)。A以外的数字仍可以通过一个常量时间读取。

(不知道题目的意思不能直接读取A中的整数,是不是紧紧不能读取10进制,因为如果可以读取二进制的话,就可以对A中的N个数用异或的方法找出那个少的数了。)
(还有感觉中文版的翻得不是很好,有些地方有点含糊,比如说最后这句"A以外的数字仍可以通过一个常量时间读取"是要求我们证明的呢,还是给的一个已知条件呢,虽然我觉得应该是个已知条件)
...全文
544 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
chouun711 2011-10-08
  • 打赏
  • 举报
回复
给定一个n,求0到n里面有多少数以0开头不难吧……
一共有2的log(n+1)上取整减1次幂个数以0开头,剩下的都是1开头
同理计算第i位自然也不难
njuptxiaot 2008-06-21
  • 打赏
  • 举报
回复
同问?
怎么能够知道0到n里面第i位是0的应该是多少个,是1的应该是多少个?
Jackiezhw 2007-09-28
  • 打赏
  • 举报
回复
TAOBO2 got it.
pfpf
feitianmouse 2007-09-28
  • 打赏
  • 举报
回复
不对吧,怎么能够知道0到n里面第i位是0的应该是多少个,是1的应该是多少个
还有在[4] [3,1,0]的时候是怎么知道应该到[3,1,0]里面去找的呢?因为个数么?如果因为个数那么0 - 5 里面少了4分成[5] [0,1,2,3]应该到哪儿找
TAOBO2 2007-09-28
  • 打赏
  • 举报
回复
首先n=4 二进制100
3 011
2 010(丢了)
1 001
0 000

取第一位分成两半『4』 『3,1,0』,
可以看出丢失的元素第一位必为0,因为0-4只有4个第一位为0的数 而这里只有3个

对【3,1,0】取第二位
【3】 【1,0】
显然丢失的元素第二位必为1,因为0-4中 第一位为0 第二位为1 的有两个,而这里只有一个

对【3】取第三位
【】 【3】
那么丢失的元素的第三位必为0,原因同上

那么 010 就是2了
feitianmouse 2007-09-28
  • 打赏
  • 举报
回复
没办法啊,语文差:)
kaishui_gu 2007-09-28
  • 打赏
  • 举报
回复
LZ是对题目不理解吧
feitianmouse 2007-09-28
  • 打赏
  • 举报
回复
To TAOBO2:
兄第,请问能够讲仔细点么?比如说:
0 1 3 4的时候怎么找?
TAOBO2 2007-09-28
  • 打赏
  • 举报
回复
上面写反了

对【1.。。N】每个元素分别取第一位
如果是0,就放左边;否则放右边。

那么所有左边的元素 第一位就是0
所有右边的元素 第一位就是1
feitianmouse 2007-09-28
  • 打赏
  • 举报
回复
To TAOBO2:
请问能够讲仔细点么?比如说:
0 1 3 4的时候怎么找?
TAOBO2 2007-09-28
  • 打赏
  • 举报
回复
每次递归 都能得到丢失的元素的二进制数的一位(左-》右)

照我上面所说的:

对【1.。。N】每个元素分别取第一位
如果是0,就放左边;否则放右边。

那么所有左边的元素 第一位就是1
所有右边的元素 第一位就是0

接下来
“所以对少了元素的一边 取每个元素的第二位 重复上面的过程 ”
这将少了元素的一边 又分为两半 其中一半元素的第二位是1,另一半元素的第二位是0

这样一直递归下去,“直到找到某一边 该边原应该包含一个元素,但是其中的元素为空,这个元素就是丢失的那个 ”
这时候该元素的二进制表示就已经完整了,值自然也就知道了
feitianmouse 2007-09-28
  • 打赏
  • 举报
回复
To TAOBO2:
如何找出这个丢失的元素的值?
caoxic 2007-09-28
  • 打赏
  • 举报
回复
N(N+1)/2减去每个数就是
TAOBO2 2007-09-28
  • 打赏
  • 举报
回复
为方便叙述 假设N为(2的幂次-1)

对【1.。。N】每个元素分别取第一位
如果是0,就放左边;否则放右边。
如果是0.....N,则两边元素应该相等
但是由于少了一个数,所以必有一边少了一个元素(有上面的假设)


所以对少了元素的一边 取每个元素的第二位 重复上面的过程
直到找到某一边 该边原应该包含一个元素,但是其中的元素为空,这个元素就是丢失的那个

T(N)=T(N/2)+N----------O(N)
feitianmouse 2007-09-28
  • 打赏
  • 举报
回复
能讲解下么?我觉得被省略掉的细节不好处理
kaishui_gu 2007-09-28
  • 打赏
  • 举报
回复
TAOBO2的算法没有错,大约需要2N次比较
feitianmouse 2007-09-28
  • 打赏
  • 举报
回复
To TAOBO2:
你好像没有明白我的意思。
按照你的思想,是不是:
0000 0001 0010 0011 0100 0101 0110 0111
1000 1001 1010 (1011->少掉的)

第一步,看第一位1应该有4个数字(:怎么知道有4个数字的),而现在只有3个,那么就要到【8,9,10】里面找
第二部,找第二位0应该有4个数字(:又是怎么知道的),而现在只有3个,那么就要到【8,9,10】里面找(这边的复杂度不是T(n/2)了,因为第一步要找3个,现在做了第二部之后还是找3个)
第三部,找第三位1应该有2个数字(:又是怎么知道的),而现在只有1个,就要到【10】里面找
第四部,找第四位1应该有1个数字(:同上),现在为0,所以为1;
结束

还有,你这种算法是不是等价与这样:
1.算出n个数字换成二进制之后的第i位上0的个数为ai;
2.遍历n位,如果第i位出现的0的个数总和为ai,则该位应该是1,如果不是,则该位应该是0
(但是这种算法的复杂度应该不是o(n)吧,感觉是o(nlgn);

以上是我的理解,不对请指出
TAOBO2 2007-09-28
  • 打赏
  • 举报
回复
“那么0 - 5 里面少了4分成[5] [0,1,2,3]应该到哪儿找”
照我上面的步骤来啊
0-5里第一位为1的应该有两个数字,现在只有一个,那么可以肯定不是少了4,就是少了5
那就要到【5】里面找
然后找第二位,发现第二位为1的有(就是5)
第二位为0的没有 那肯定就是4了

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧