[问题] 不使用乘法的计算与排序问题

楼主: signdecoded (sigh)   2015-04-15 00:42:09
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
Q1. 不使用乘法如何有效率计算 X*Y 的结果
Q2. 已知两个array,里面的元素都已经是排序好的顺序,不使用
教科书里面的经典的排序方法(如:quick sort, merge sort 等)
把两个array里面的所有元素合并到另外一个新的array内
所有元素也是排序后的顺序
喂入的资料(Input):
Q1. X, Y 两个整数,不需考虑overflow的问题
Q2. A[] = {1,3,4}, B[]={2,5,7},二者都可能是动态大小的资料量
预期的正确结果(Expected Output):
Q1. 达成正常乘法的效果,但是用更有效率的方法
Q2. C[] = {1,2,3,4,5,7}
错误结果(Wrong Output):
N/A
程式码(Code):(请善用置底文网页, 记得排版)
抱歉,程式能力不好,想来这边请教"想法"就好
Q1. 我有两个想法
法1. X*Y = X + X + ...+ X,自加Y次,所以可以用一个简单循环配合加法完成
法2. 把Y转成2进位表示,例如 3*12 = 3*(1100) = 3<<3 + 3<<2
所以可以用mask的方式知道Y里面有那几个bit是1,便可以对X做位移后加法
不过直接写起来,code似乎又臭又长 -_-,且如果遇到负数的话不知是否适用?
请益是否有更聪明的方法
Q2. 我起先想到的是空桶排序,设计一个空的array,size = A B array中元素的最大值
例如: X[7]={0}
然后把两个array里面每一个元素放到值所相对应的位置
即 X[a[i]] = a[i]; X[b[j]] = b[j];
全部都放好后,把X里面非0的元素取出来就会是排好的结果
但是,一想完之后发现缺点百出 -_-
1. 如果A B array里面有0值的元素,这个想法就gg
2. 如果A Barray里面有重复值的元素,这样排可能会出错
补充说明(Supplement):
希望各位大大提供想法即可
如果违反版规,不适合在此发问的话请不吝告知,感谢 ^^
作者: LPH66 (-6.2598534e+18f)   2015-04-15 00:45:00
看起来像是作业题...是作业的话建议问 Q2 的限制范围不然单讲不能用传统方法一来太笼统, 二来排序也就这些方法这看起来像是要你们回答某种特定的算法出来的样子Q1 其实你的想法就差不多了, 仔细考虑一些细节就能写的出来
楼主: signdecoded (sigh)   2015-04-15 00:47:00
LPH66大:是面试题(汗) 空白卷自由发挥,所以想法不
作者: LPH66 (-6.2598534e+18f)   2015-04-15 00:47:00
要你们不用直接相乘, 计算步骤就会变多这很自然的
楼主: signdecoded (sigh)   2015-04-15 00:48:00
拘 XD 所以没有特别强调 限制条件
作者: LPH66 (-6.2598534e+18f)   2015-04-15 00:49:00
面试题吗...是我的话我会当场问面试官这个范围在哪bucket sort 也是许多教科书里会提到的排序算不算“传统做法”其实是可以吵(?)一下的 XD
楼主: signdecoded (sigh)   2015-04-15 00:51:00
恩 对阿,题目上面只有提到不使用 quick sort, mergesort, 但是又多加一个, etc 实在让人困惑大概是自己经验不够,应该要及时反问这个疑问 XD题目只有暗示可以善用两个array都已经是排序好的特性
作者: EdisonX (卡卡兽)   2015-04-15 01:05:00
Q1 和你一样, 用 shift 和加法 , Q2 已排序好的话可保证是 O(m+n) , 就只有考 array index 控制.
作者: cismjmgoshr (--???--)   2015-04-15 02:10:00
Q1 X*Y = X*(Y/2) + X*(Y-(Y/2)) 递回
作者: johnpage (johnpage)   2015-04-15 05:46:00
乘法不一定慢,要看cpu周期不用教科书的排序,你以为我是天才,发明的出来
作者: Push5F (帐号已卖)   2015-04-15 07:13:00
方法2
作者: cismjmgoshr (--???--)   2015-04-15 22:17:00
http://codepad.org/rDMUxxMS Q1 方法2写起来不一定又臭又长
楼主: signdecoded (sigh)   2015-04-15 22:59:00
感谢cismjmgoshr, 这方法看起来也不赖 清楚易懂感谢大家的意见,又学到了观念RRR(程式果然要再加强)
作者: vvrr (vvrr)   2015-04-16 12:28:00
Q2用2个index分别指到2个阵列的头,每次比较两边被指到的值把比较小的那个填到放结果的阵列里;被选到的index再往后++....这样好像是mergesort...抱歉0rz....
作者: TobyH4cker (Toby (我要当好人))   2015-04-16 23:17:00
万恶的etc.
作者: NilPtr (神奇的空指标)   2015-04-19 21:22:00
其实觉得 Q1 的题目要求很无理,要比指令等级的乘法快几乎没可能吧?阿 眼残看错题目 Sorry

Links booklink

Contact Us: admin [ a t ] ucptt.com