大整数乘法——分治算法的时间复杂度
1.1原始的低效算法
我们将n位(为方便讨论简化问题,我们假设n是2的幂)十进制整数(二进制也可以)X、Y都分为2段,每段的长度是n/2位。
如果现在直接用递归或分治进行编程,其算法复杂度为:
其中:T(n)代表规模为n的问题,系数4表示问题缩小到T(n/2)时,包含四次乘法(上式中AC/AD/BC/BD四次)
这是在没有进行优化情况下的算法复杂度(注意,此处虽然用了分治思想,但分治并不会降低算法复杂度,反而因其需要使用栈,增加了算法的空间复杂度)。
1.2高效的算法(运用了数学的小技巧)
我们知道,大整数乘法的基本运算是“乘法”运算,我们可以通过减少乘法的次数来降低算法复杂度!
从公式中可以发现,原来有四个基本乘积项:AC、AD、BC、BD,现在只有三个基本乘积项:(A-B)(C-D)、AC、BD。乘法运算的数量降低了,下面看看其复杂度变化:
复杂度从n2降到n1.59
1.3补充
有的小伙伴可能会问了,如果不分成两段,分成三段,四段甚至n段的时候时间复杂度会降低,结论是:
在大整数乘法中,当把大整数分为2段时,算法时间复杂度最低n1.59
随着段数逐渐增加,算法的时间复杂度也随之增加,当分段增加到n段时,算法时间复杂度退化到n2
转载于:https://www.cnblogs.com/apex-wzw/p/10464044.html
大整数乘法——分治算法的时间复杂度相关推荐
- java 整数乘法的算法,大整数乘法——分治算法的时间复杂度
1.1原始的低效算法 我们将n位(为方便讨论简化问题,我们假设n是2的幂)十进制整数(二进制也可以)X.Y都分为2段,每段的长度是n/2位. 如果现在直接用递归或分治进行编程,其算法复杂度为: 其中: ...
- 大整数乘法---FFT算法
//迭代FFT的乘法方法 // POJ 1405 Heritage /** * input data mode: * the number array 1,2,3,4 use base U = ...
- PYTHON:大整数乘法(分治法)
何为分治法: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.即一种分目标完成程序算法,简单问题可用二分法 ...
- 【分治算法】大整数乘法
前言 最近开了算法导论课,上来就是递归分治,大整数乘法就是分治法的典型案例,通过参考网上书上我终于编程实现了大整数乘法,特此纪念 原理 由于两个大整数直接相乘太大,所以我们可以将它划分成几个小块分别相 ...
- 【算法/C语言】大整数乘法(分治)
题目: 用分治算法编程实现两个n位十进制大整数的乘法运算. 思路: 参考大整数乘法的详解 伪码: Function MulOfLargeInt(X,Y,n)** 输入:n位乘数X,Y,位数n 输出:X ...
- 分治算法经典问题---大整数乘法(1~32位大整数乘法)C++
大整数乘法 大整数乘法(1~32位大整数乘法) 分治的思想 实验题目及要求(大整数乘法) 算法分析(result=m4*10^2^+(m2+m3)*10^n/2^+m1) 算法分析 代码 源文件 ma ...
- 【分治】大整数乘法(C++)
刚发现个问题,,初学时竟然是使用的long型进行计算的,导致这篇文章虽展现了分治的想法,但并没有实际解决大整数乘法的计算问题. 仅供参考,日后再改 一.大整数乘法 一般计算方法 有n位大整数X和Y,计 ...
- 分治法实验之大整数乘法(算法设计分析)
分治法实验之大整数乘法 01. 问题描述 02. 输入格式 03. 输出格式 04. 输入样例 05. 输出样例 06. 问题分析 07. 算法设计 08. 代码实现 09. 测试结果 10. 复杂度 ...
- python两数相乘代码_Python 实现大整数乘法算法的示例代码
我们平时接触的长乘法,按位相乘,是一种时间复杂度为 O(n ^ 2) 的算法.今天,我们来介绍一种时间复杂度为 O (n ^ log 3) 的大整数乘法(log 表示以 2 为底的对数). 介绍原理 ...
- 大整数乘法(Karatsuba算法的字符串形式的C++实现)
#include <iostream> #include <sstream> #include <cstring> using namespace std;/函数声 ...
最新文章
- 《分布式服务架构:原理、设计与实战》第二章彻底解决分布式系统一致性的问题...
- 2019世界机器人大赛总决赛在河北保定开赛
- SoC嵌入式软件架构设计之二:虚拟内存管理原理、MMU硬件设计及代码分块管理...
- listview 每行后面的小箭头_主卧带小衣帽装修,这几个装修方案,你喜欢哪个?...
- 95-40-038-java.util.concurrent-ConcurrentLinkedQueue
- Kotlin学习总结(1)——Kotlin快速入门
- 人脸方向学习(十三):Face Tracking-人脸跟踪KCF解读
- 网络工程师笔记--网络管理技术
- Abaqus简单部件受力分析
- 嵌入式软件开发与互联网软件开发模式差异
- JavaNIO读取文件
- python的sqlite3说明_python之sqlite3使用详解
- 安卓比IOS好的12个原因
- c语言编程利用泰勒级数,C语言程序设计:用泰勒级数计算cos
- 深度学习论文: An Improved One millisecond Mobile Backbone及其PyTorch实现
- android 文件管理 ca,安卓Android手机添加根证书
- JAVA超全笔试/面试考试题.(500问)--第三章面试题全面收录
- 超详细的软件安装包制作打包流程(C/S客户端)
- OP-TEE 简易驱动编写:启动TZPC与TZPCDEP
- 利用DncZeus框架开发UWB室内定位网关
热门文章
- tcp和udp协议的聊天 和udp协议的时间同步机制-----编码
- React-Native Fetch使用Promise封装(一)
- 系统剪切板的使用UIPasteboard
- [译] What is some general advice for a new PhD student?
- 快速从mysqldump文件中恢复一个表
- 关于百度地图根据经纬度获取城市信息的接口
- Activity是如何挂载Pargment的Day35
- C#中对 XML节点进行添加,删除,查找和删除操作
- 教学思路SQL之入门习题《学员成绩》 二、基础单表查询
- linux 跳板机得搭建