请教:有难度的算法笔试题。

li1gang11 2007-09-19 01:00:38
1)15分
如下数据结构:
typedef struct TreeNode {
char c;
TreeNode *leftchild;
TreeNode *rightchild;
}

请实现两棵树是否相等的比较,相等返回0否则返回其它值.并说明你的算法复杂度
int CompTree(TreeNode* tree1, TreeNode* tree2);

注:A,B两棵树相等当且仅当RootA->c==RootB->c,而且A和B的左右子树对应相等或
者左右互换后相等.

2)15分
已知一个字串由GBK汉字和ansi编码的数字字母混合组成,编写C语言函数实现从中去掉所有
ansi编码的的数字和字母(包括大小写).要求在原字串上返回结果。

int filter_ansi(char* gbk_string);
  注:汉字的GBK编码范围是0x8140 - 0xFEFE

3)30分
芯片测试:有2k块芯片,已知好芯片比坏芯片多.请设计算法从其中找出一片
好芯片,说明你所用的比较次数上限.
 其中:好芯片和其它芯片比较时,能正确给出另一块芯片是好还是坏.
坏芯片和其它芯片比较时,会随机的给出好或是坏。

4)40分
请设计一个网页存储系统,能存储千万量级的网页。

要求:
1.支持按照URL为键值的随机添加,删除和修改网页
2.支持多个线程同时添加,修改和删除
3.支持多线程按照入库时间批量的获取网页,并尽可能的快
提示:设计应包括如下几方面:
1.网页的存储方式设计,即硬盘数据的组织形式
2.如何支持随机查找
3.如何优化批量检索
4.增删改查之间的同步和互斥,如何达到最大的并发.
系统限制和一些参考参数:
硬盘400G, 内存4G
硬盘的I/O比内存的I/O速度慢1000倍
硬盘的连续I/O比随机I/O快10倍
网页的平均长度为25K
附加:
请说明你的系统在亿到十亿规模的扩展方法.
...全文
1162 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjk2752 2008-08-07
  • 打赏
  • 举报
回复
支持一下
liuyuantuo 2008-08-06
  • 打赏
  • 举报
回复
天哪,最后一题,崩溃了,都看不懂的
solar 2008-08-06
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 tianyazifan 的回复:]
2、若好芯片解大于1000,则本题得解,若坏芯片解大于1000,则进入第三步。
[/Quote]

这个结论怎么得出的?
既然“坏芯片和其它芯片比较时,会随机的给出好或是坏”,那么不管其概率多么小,总存在这种情况: 拿一个坏芯片与其余的1999个芯片比较时,结果得出多余1000个好芯片
tianyazifan 2008-08-06
  • 打赏
  • 举报
回复
T3:解
声明:因为2000片芯片好的多于坏的。故好芯片多余1001片,好芯片少于999片。
1、从2000片中随机取出一片芯片,令剩下的1999片芯片与其比较。得到1999个结果
因为1999片芯片中至少1000片为好芯片,故1999个结果中好芯片解必大于1000,坏芯片同理。
2、若好芯片解大于1000,则本题得解,若坏芯片解大于1000,则进入第三步。
3、将剩余的1999片芯片,随即取出1片,抛弃。
4、将剩余的1998片芯片,类似于1的方法求解。
。。。
时间复杂对最坏为o(n^2)
tianyazifan 2008-08-06
  • 打赏
  • 举报
回复
T3解:
因为好的芯片比坏的新片多。所以,2000中至少1001片好的。
从2000中随即取出一片芯片。则剩下的1999个芯片中至少1000个好芯片。
将这个芯片与1999个芯片比较。
若随即取出的芯片是好的,则1999中的至少1000个芯片将判断其为好芯片,另外不到999个芯片将随即判断其好坏,
因此,将判断结果累加。结果为好芯片的解必大于1000.
若随即取出的芯片是坏的,同理可得,结果为怀芯片的解必大于1000.
这样就可以测出这个随即取出的芯片是好还是坏。

若为好,得解。时间复杂度为o(n)
若为坏,则在1999个芯片中,随即剔除一个芯片,将芯片数变为1998个,然后进行之前的操作。
最差情况找到999个坏的芯片时,还剩下1个坏的芯片。
则剩下的芯片毕竟是好芯片。得解。时间复杂度为o(n^2)
fly1008 2008-08-05
  • 打赏
  • 举报
回复
学习!
xianyuxiaoqiang 2008-08-05
  • 打赏
  • 举报
回复
MARK下,慢慢看
solar 2008-08-05
  • 打赏
  • 举报
回复
第3题没有解
因为坏芯片的行为是随机的,那么就意味着理论上不能排除所有坏芯片的行为与好芯片全部一模一样,所以无解
hai040 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 realdragon2 的回复:]
mark~ 学习
[/Quote]
realdragon2 2008-08-05
  • 打赏
  • 举报
回复
mark~ 学习
guzhilei1986 2008-08-05
  • 打赏
  • 举报
回复
1)确定一个广搜的序列,然后比较序列是否相等即可(要考虑到左右颠倒的问题)
3)我觉得关键的问题是在坏和别的芯片比较得出的结构是随机的,随机只有两种可能:好和坏。随便找出两个芯片a和b,
1.拿a和b多次比较,如果好坏不定,那说明a是坏的,进行第二次比较;要是一直是好的,那说明a是好的,b也是好的,到这里就结束了。
2.再拿b和a比较,如果一直是坏的,那说明b是好的,因为a是坏的已经确定;如果是好坏不定,那么b也是坏的。那就保留下a,再在剩下的芯片中挑一个和a比较,如果一直是坏的,那就说明刚挑出来的是好的。如果好坏不定那就再挑一个。
哈哈,不知道这样的方法行不行。
UncleQiong 2008-08-05
  • 打赏
  • 举报
回复
学习。但完全看不懂了
apollofsc2008 2008-08-05
  • 打赏
  • 举报
回复
关于第三题想问一个问题,题目中说“坏芯片和其它芯片比较时,会随机的给出好或是坏”,里面的随机是什么意思?比如说2个坏的芯片相互测试,测试10次,这10次的结果都是随机的,还是说这10次测试的结果是一样的(因为他们同样的芯片测试的结果相同)。如果是后者的话算法就要复杂一些,而且和概率有关了。
勇敢的天牛 2008-08-05
  • 打赏
  • 举报
回复
4)40分
请设计一个网页存储系统,能存储千万量级的网页。

要求:
1.支持按照URL为键值的随机添加,删除和修改网页
2.支持多个线程同时添加,修改和删除
3.支持多线程按照入库时间批量的获取网页,并尽可能的快
提示:设计应包括如下几方面:
1.网页的存储方式设计,即硬盘数据的组织形式
2.如何支持随机查找
3.如何优化批量检索
4.增删改查之间的同步和互斥,如何达到最大的并发.
系统限制和一些参考参数:
硬盘400G, 内存4G
硬盘的I/O比内存的I/O速度慢1000倍
硬盘的连续I/O比随机I/O快10倍
网页的平均长度为25K
附加:
请说明你的系统在亿到十亿规模的扩展方法.

这个就是俺的工作啊...
e_sharp 2008-08-05
  • 打赏
  • 举报
回复
mark先
xianyuxiaoqiang 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 xianyuxiaoqiang 的回复:]
C/C++ code
10次结果都…
[/Quote]
有点眼花了。。。是9
xianyuxiaoqiang 2008-08-05
  • 打赏
  • 举报
回复
PS:偶把数量搞错了,是2K。。。
不过算法大体是一样的。
xianyuxiaoqiang 2008-08-05
  • 打赏
  • 举报
回复

/*
个人觉得第三题是个概率题,得到的结果是否满足要求要看具体对芯片要求怎样。

现假设按照一般的小概率事件评判标准来:即小概率事件发生的概率<=0.3%。我们在实际生活中一般认为小概率事件是不可能发生的,即如果这个芯片出错的概率<=0.3%(当然可以按照具体要求调节该参数),那么我们就认为这是好芯片了。
再假设,坏的芯片测试其他芯片结果正确的概率为0.5,那么如果用坏的芯片A连续测试芯片B,10次结果都一样的概率为0.5的9次方,即0.20%,已经是小概率事件了。我们可以认为这种情况不可能发生,即A其实是好芯片(至少是满足约束条件的)。
基于上面的讨论,现给出算法如下:
*/
/**************************
1.从芯片堆中任取两块芯片,标记为A,B
2.用A测试B,如果发现B是好的,转步骤3,否则转步骤4
3.用A测试B,如果发现B是好的,判断::(如果测试次数少于9次,循环步骤3,否则转步骤5),否则转步骤6
4.用A测试B,如果发现B是坏的,判断::(如果测试次数少于9次,循环步骤4,否则转步骤5),否则转步骤6
5.A满足约束条件,可以当好芯片使。算法结束。
6.A满足坏芯片条件。(没找到好的不要紧,坏的也有用)转步骤7。
7.把B放回芯片堆,从该堆中999个芯片中任取一个出来,反复测试A,如果<=9次测试中发现存在一次测A的结果A是好芯片,那么这块芯片就可以认为是坏的,舍弃之,继续从998个芯片中任取一个出来,重复7,直到有一块芯片测试A时连续9次结果A是坏芯片,这块芯片就是要找的好芯片了。
**************************/
/*
粗略分析一下该算法的复杂度、可行性:
1、因为好芯片比坏芯片多,最坏情况下,501好芯片499坏芯片。那么随机抽样拿到坏芯片的概率约0.5,连续9次拿到坏芯片概率<0.3%,属于小概率事件。假设步骤1--6发现第一块A是坏芯片,则用了9次测试,再假设步骤7发生了小概率事件,即连续找到9个坏芯片,那么又用了最多9×9次测试,最后找到好芯片,又用了9次测试,所以总计9×11=99次测试。

2、现在撇开概率,看看其他情况:
2.1 步骤5的所谓好芯片有一定概率是伪劣产品。虽然概率很低,但在仪器要求很高的地方,1/1000000的出错率都不能有!那么,极端情况测试总数将是(log0.5(p))×N,p是产品出错率,log0.5(p)对应上述情况中的参数9,具体可能是个较大的数如20,而N运气差的人可能会遇到两三百,从而比较次数从不到100升至成千上万。
2.2 由步骤6确定的坏芯片是100%坏的,因此步骤7筛掉的坏芯片当然也是100%坏的,这倒是可以用来将成千上万的坏芯片挑出来处理掉。

*/

//有什么不当之处,欢迎大家提出指正!
gezichong 2008-08-04
  • 打赏
  • 举报
回复
看不懂。。。标记一下。
Jack_Sun_Lnpu 2008-08-04
  • 打赏
  • 举报
回复
正在琢磨第三题。
还是不明白
加载更多回复(11)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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