您的位置:首页 > 理论基础 > 数据结构算法

一道笔试题讨论

2014-04-24 15:49 127 查看
http://bbs.csdn.net/topics/110087977

题的大意是这样的:

有两等长数组A,B,所含元素相同,但顺序不同,只能取得A数组某值和B数组某值进行比较,比较结果为大于,小于,等于,但是不能取得同一数组A或者B中两个数进行比较,也不能取得某数组中的某个值,找到一个好的算法实现正确 匹配,(即A数组中某值与B中某值等值),分析算法时间复杂度,写出算法思路即可。

回答1:

先取A0,与B0~Bn-1比较,比较结果计入一个结构数组C,结构为:{某数在B中的位置,标记,某数在A中的位置}。其中“标记”可为:大于,小于,等于。“某数在A/B中的位置”:0~n-1,为相应位置。注:第一次比较后,C中元素都为{某数在B中的位置,标记,A0}格式。
取A1,由C可知B中与A0大小相同的数,与其比较。若A2大,则与B中比A0大的值比较。将比较结果替换计入结构数组C。若A2小亦同理。
执行至完毕。
没好好学过数据结构,不知道复杂度是多少,哪位来指点一下。

回答2:

楼上这位朋友的思路还可以,不过你所说的“若A2大,则与B中比A0大的值比较”应该是 A1 吧,但是若你在比较A0 时候把结果顺序存储在结构数组里面的话,那么其实你在用“ A1” 和“B中比A0大的值比较”时,还是扫描了一遍这个结构数组,复杂度还是没能减少,
     不过根据你的思路,我想到一个方法,我们可以讨论下,其他朋友也可以指点下。
1)在A数组中随机选取一个数,(根据题意,我们并不知道这个值的确定值是多少)比如说 A[i] ,然后和B 数组中进行比较,根据你的数据结构,将B数组每个数与A[i]进行比较,若比 A[i] 大的按照从后向前存储,比 A[i] 小的从前向后存储,要是等于A[i] ,就记录下来 这个值在B的位置 j,继续比较,直到B中数组全部比较完成,然后再把这个相等的b[j] 插入空余的那个中间位置上。
2) 然后再从A 数组中取出数A[k]{k=0~n}与B[j](这个B[j] 就是A [i],因为同一数组中不能比较大小,只能采用这种方式)比较,若比B[j]大,那么从结构C中 A[i] 后面的比较,若比B[j]小,就从结构C中 A[i] 前面的比较,直到找到相等,然后更新结构数组C 中与这个相等相应值。(注意,在这里,只更新相等的那个数值的 "标记","某数在A中的位置",其它与A[k]不相同,或大,或小的情况下,不更新,即还保持A[i] 的比较结果,以利于继续比较)
3)重复步骤 2,继续取A数组 剩下的值,仍然与那个 B[j]比较,这样逐步更新结构数组C ,直到A数组全部取出比较完,那么这个程序也就完成了相应的功能。
   其实这里用到了 快速排序的某些思想。只是这个随机选择A[i],要是选择好,可以大大降低比较次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 数据结构