[問題] 不使用乘法的計算與排序問題

作者: 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