一道笔试题讨论
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],要是选择好,可以大大降低比较次数。
题的大意是这样的:
有两等长数组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笔试题
- 关于 ServletContext 的一道笔试题
- 笔试的一道题目
- js数组方法的一道笔试题考察点详解
- 一道笔试题的思考(二)
- 一道外企Java笔试题!
- 记一道笔试题
- 一道笔试题的思考(三)
- 通过一道笔试题理解c#静态构造函数
- 一道关于C++ 继承/虚函数 笔试题
- 全志科技的一道笔试题
- 一道迅雷笔试题引发的..写给不知道c/c++序列点的人(转)
- 一道笔试题,求解
- 华为公司的笔试题:写一个Stack,注意处理异常。这里给出一个exception c++上讨论的一个简易版本代码。
- 某公司校招笔试题 树形递归4维DP 图论 烦人的分类讨论
- [置顶] 2017.9.9网易校招笔试最后一道编程解答
- 2015IBM上海的一道笔试题
- 一道某互联网公司的笔试题(Android九宫格锁屏)