急:两个2个算法题
发布网友
发布时间:2022-05-01 04:20
我来回答
共2个回答
热心网友
时间:2022-06-24 09:04
http://cache.baidu.com/c?word=%B7%D6%D6%CE%3B%B2%DF%C2%D4&url=http%3A//www%2E91tech%2Ecn/BBS/printpage%2Easp%3FBoardID%3D17%26ID%3D3582&b=0&a=91&user=
http://cache.baidu.com/c?word=strassen&url=http%3A//www%2Eprogramfan%2Ecom/club/showbbs%2Easp%3Fid%3D78010&b=0&a=112&user=
热心网友
时间:2022-06-24 09:04
设计一个有效的算法,可以进行两个n位大整数的乘法运算
小学的方法:O(n2) 效率太低
分治法:
X=a2n/2+b
Y=c2n/2+d
XY=ac2n+(ad+bc)2n/2+bd
复杂度分析
T(n)=O(n2) 没有改进
为了降低时间复杂度,必须减少乘法的次数。为此,我们把XY写成另外的形式:
XY = ac 2n + ((a-c)(b-d)+ac+bd) 2n/2 + bd 或
XY = ac 2n + ((a+c)(b+d)-ac-bd) 2n/2 + bd
复杂性:
这两个算式看起来更复杂一些,但它们仅需要3次n/2位乘法[ac、bd和(a±c)(b±d)],于是
T(n)=O(nlog3) =O(n1.59) 较大的改进
细节问题:两个XY的复杂度都是O(nlog3),但考虑到a+c,b+d可能得到m+1位的结果,使问题的规模变大,故不选择第2种方案。
用STRASSEN方法求矩阵乘积:
例2-3 [矩阵乘法] 两个n×n 阶的矩阵A与B的乘积是另一个n×n 阶矩阵C,C可表示为假如每一个C(i, j) 都用此公式计算,则计算C所需要的操作次数为n3 m+n2 (n- 1) a,其中m表示一次乘法,a 表示一次加法或减法。
为了得到两个矩阵相乘的分而治之算法,需要: 1) 定义一个小问题,并指明小问题是如何进行乘法运算的; 2) 确定如何把一个大的问题划分成较小的问题,并指明如何对这些较小的问题进行乘法运算; 3) 最后指出如何根据小问题的结果得到大问题的结果。为了使讨论简便,假设n 是2的幂(也就是说, n是1,2,4,8,1 6,.)。
首先,假设n= 1时是一个小问题,n> 1时为一个大问题。后面将根据需要随时修改这个假设。对于1×1阶的小矩阵,可以通过将两矩阵中的两个元素直接相乘而得到结果。
考察一个n> 1的大问题。可以将这样的矩阵分成4个n/ 2×n/ 2阶的矩阵A1,A2,A3,和A4。当n 大于1且n 是2的幂时,n/ 2也是2的幂。因此较小矩阵也满足前面对矩阵大小的假设。矩阵Bi 和Ci 的定义与此类似.
根据上述公式,经过8次n/ 2×n/ 2阶矩阵乘法和4次n/ 2×n/ 2阶矩阵的加法,就可以计算出A与B的乘积。因此,这些公式能帮助我们实现分而治之算法。在算法的第二步,将递归使用分而治之算法把8个小矩阵再细分(见程序2 - 1 9)。算法的复杂性为(n3 ),此复杂性与程序2 - 2 4直接使用公式(2 - 1)所得到的复杂性是一样的。事实上,由于矩阵分割和再组合所花费的额外开销,使用分而治之算法得出结果的时间将比用程序2 - 2 4还要长。
为了得到更快的算法,需要简化矩阵分割和再组合这两个步骤。一种方案是使用S t r a s s e n方法得到7个小矩阵。这7个小矩阵为矩阵D, E, ., J,矩阵D到J可以通过7次矩阵乘法, 6次矩阵加法,和4次矩阵减法计算得出。前述的4个小矩阵可以由矩阵D到J通过6次矩阵加法和两次矩阵减法得出.
用上述方案来解决n= 2的矩阵乘法。将某矩阵A和B相乘得结果C,如下所示:
因为n> 1,所以将A、B两矩阵分别划分为4个小矩阵,每个矩阵为1×1阶,仅包含一个元素。1×1阶矩阵的乘法为小问题,因此可以直接进行运算。利用计算D~J的公式,得:
D= 1(6-8)=-2
E= 4(7-5)= 8
F=(3 + 4)5 = 3 5
G=(1 + 2)8 = 2 4
H=(3-1)(5 + 6)= 2 2
I=(2-4)(7 + 8)=-3 0
J=(1 + 4)(5 + 8)= 6 5
根据以上结果可得:
对于上面这个2×2的例子,使用分而治之算法需要7次乘法和1 8次加/减法运算。而直接使用公式(2 - 1),则需要8次乘法和7次加/减法。要想使分而治之算法更快一些,则一次乘法所花费的时间必须比11次加/减法的时间要长。
假定S t r a s s e n矩阵分割方案仅用于n≥8的矩阵乘法,而对于n<8的矩阵乘法则直接利用公式(2 - 1)进行计算。则n= 8时,8×8矩阵相乘需要7次4×4矩阵乘法和1 8次4×4矩阵加/减法。每次矩阵乘法需花费6 4m+ 4 8a次操作,每次矩阵加法或减法需花费1 6a次操作。因此总的操作次数为7 ( 6 4m+ 4 8a) + 1 8 ( 1 6a) = 4 4 8m+ 6 2 4a。而使用直接计算方法,则需要5 1 2m+ 4 4 8a次操作。要使S t r a s s e n方法比直接计算方法快,至少要求5 1 2-4 4 8次乘法的开销比6 2 4-4 4 8次加/减法的开销大。或者说一次乘法的开销应该大于近似2 . 7 5次加/减法的开销。
假定n<1 6的矩阵是一个“小”问题,S t r a s s e n的分解方案仅仅用于n≥1 6的情况,对于n<1 6的矩阵相乘,直接利用公式( 2 - 1)。则当n= 1 6时使用分而治之算法需要7 ( 5 1 2m+ 4 4 8a) +1 8 ( 6 4a) = 3 5 8 4m+ 4 2 8 8a次操作。直接计算时需要4 0 9 6m+ 3 8 4 0a次操作。若一次乘法的开销与一次加/减法的开销相同,则S t r a s s e n方法需要7 8 7 2次操作及用于问题分解的额外时间,而直接计算方法则需要7 9 3 6次操作加上程序中执行f o r循环以及其他语句所花费的时间。即使直接计算方法所需要的操作次数比St r a s s e n方法少,但由于直接计算方法需要更多的额外开销,因此它也不见得会比S t r a s s e n方法快。
n 的值越大,Strassen 方法与直接计算方法所用的操作次数的差异就越大,因此对于足够大的n,Strassen 方法将更快。设t (n) 表示使用Strassen 分而治之方法所需的时间。因为大的矩阵会被递归地分割成小矩阵直到每个矩阵的大小小于或等于k(k至少为8,也许更大,具体值由计算机的性能决定). 用迭代方法计算,可得t(n) = (nl og27 )。因为l og27 ≈2 . 8 1,所以与直接计算方法的复杂性(n3 )相比,分而治之矩阵乘法算法有较大的改进。
数学智商测试题?一筐鸡蛋,一个一个拿,正好拿完, 2个2个拿,还剩一...
这不是智力题,是计算题,有算法的。2个2个拿、4个4个拿、8个8个拿都剩一个,这个数是奇数。令这个数是8m+1。这个数+1,能被5整除,这个数又是奇数,因此这个数的个位数字是9。1个1个拿、3个3个拿、7个7个拿、9个9个拿都正好拿完,这个数是7和9的公倍数。7和9的最小公倍数是63...
任意两个两位数相乘的简便算法
第一步:将两个两位数的个位相乘。如上述的3X2=6;8X6=48。将得出积的个位数作为两个两位数乘积的个位;将得出积的十位数向前进位,若积是个位数,则向前进位0。所以:a1的个位是6;a2的个位是8;其中要心里记住a2向前进了数字4。第二步: 将两个两位数的十位数字分别与两个两位数的个位数字...
求一个数列算法:1,2,7,8,13,14,19,20,24,29,30,35,36,41,42,47,51,5...
1、2、7不看 8=2+7-1 13=7+8-2 14=8+13-7 19=13+14-8 以此类推,看出来了吗?就是从8开始,所有的数值都是前两个数值之和减去再前面那个数值的差
算法题,求解加详细步骤?
这不是什么算法,主要是找规律。第一行是基本,没有白圈代表 1;然后你把每行都从右开始数,数到白圈结束,每个白圈数一次;第二行,一个白圈,从右数第一个位置,所以是 1 + 1 = 2(加的 1 表示相对于第一行);第三行,一个白圈,从右数第二个位置,所以是 2 + 1 = 3;第四行...
急解一个数据结构的题(C语言)
题目如下:两个一元多项式相乘的算法M(x)=A(x)*B(x)=A(x)*[b1X^e1+b2X^e2+...+bnX^en]也就是A(x)和B(x)都个是一个一元多项式。例如:M(x)=A(x)*B(x)=(2x^2+3x^3+4x^4)*(5x^2+6x^3+7... 题目如下: 两个一元多项式相乘的算法 M(x)=A(x)*B(x) =A(x)*[b1X^e1+b2X^...
一桶水,2个小和尚抬,3个小和尚抬几次就抬满了?
=400(米)本题考查路程问题,以及混合运算的掌握。已知一桶水需要2个小和尚抬,所以三个小和尚实际走过的路程和为600x2=1200(米),用路程和除以总人数就可以求出一个小和尚需要走多少米,可列式:600x2÷3=400(米)。四则混合运算顺序:1、同级运算时,从左到右依次计算;2、两级运算时,...
设两个算法在同一台机器上执行,其执行时间分别是n^2和2^n,要是前者...
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可...
数学排列组合的算法、如图两个、有什么区别、求算法谢谢
具体算法如下:全排列算法:1. 将数组中的第数依次与后面的数交换,形成新的排列。2. 每次交换后,递归到下一位,直到最后一位交换完毕。3. 输出排列。组合算法:1. 从数组的第数开始往后取,取到指定数量的数时输出。2. 如果未取到指定数量的数,则从当前位置的下数开始递归取数,以此类推。3...
求助NSGA2算法问题
算法首先从非支配集开始,逐个选取,直到达到所需的个体数量。如果最后一个非支配集中仍有剩余,会选择crowd distance较大的个体,以保证多样性在选择中的重要性。总的来说,NSGA-II通过非支配集划分和crowd distance排序,实现了多目标优化问题中的有效选择,确保了种群的多样性和优化效率的平衡。
算法作业!!求两个不等长有序数组的中位数!
1. 把 A 平均分为前后两个部分,前部分有 x 个元素,后部分有 n1-x 个元素(由于 A 是有序的,所以后一部分的所有元素大于前一部分)。A[x] = A的后一部分的第一个元素。2. 同理把 B 也平均分成前后两个部分,前部分有 y 个元素,后部分有 n2-y 个元素。B[y] = B的后一部分的...