习题一初步理解时间复杂度大O表示法案例
1.如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?
如上:a+b+c=1000, a平方+b平方=c平方 求出所有abc可能的组合?
思路方法:用枚举法,a,b,c 一个一个试。
//枚举法:
//a=0 ... a=1000;
//b=0 ... c=1000;
//c=0 ... c=1000;
//三个嵌套循环实现
//方法一:三个嵌套循环实现
$start = time();
echo "方法一:开始运行...\r\n";
for($a=0;$a<1001;$a++)
{
for($b=0;$b<1001;$b++)
{
for($c=0;$c<1001;$c++)
{
if($a+$b+$c==1000 && $a*$a+$b*$b==$c*$c)
{
echo "a=$a , b=$b , c=$c \r\n";
}
}
}
}
$end = time();
$total = $end-$start;
echo "开始时间:".date("Y-m-d H:i:s",$start)."\r\n";
echo "结束时间:".date("Y-m-d H:i:s",$end)."\r\n";
echo "共执行时间:$total 秒\r\n";
//共执行时间:34 秒
方法一:时间复杂度计算
关于如上程序方法一:时间复杂度的计算与大O表示法理解
时间复杂度 T : 一层循环执行1000次, 二层循环执行1000次, 三层循环执行1000次, if条件两行代码总体看做两个步骤 2次
时间复杂度执行的步骤可看做为:
T = 1000*1000*1000*2
如果 a+b+c= 2000
时间复杂度则可看做为:
T = 2000*2000*2000*2
如果 a+b+c= 3000
时间复杂度则可看做为:
T = 3000*3000*3000*2
如果 a+b+c= N
时间复杂度则可看做为:
T = N*N*N*2
T(n)=N^3*2
T(n)=N^3*10 (细化分:不是很关注的,对于这个)
T(n)=N^3*k (k 细分的系数对,可以忽略,不考虑那么细致可以看做 T(n) = N^3)
系数对数据走势并不影响,可以忽略,主要是和N有关的几次方影响数据走向的态势。 渐进函数与时间复杂度
T(n) = k*g(n)+c k常数,c实常数
g(n) = N^3
g(n) 叫作 T(n) 的渐进函数
有关时间复杂度理解比较枯燥麻烦:具体相关定义如下:
如上实例的:g(n) 就可以看作是 时间复杂度T(n) 的大O表示法, n就是解决问题的规模
时间复杂度
T(n) = k*g(n)+c
大O表示法就是:
O(n) = g(n) = N^3 (忽略掉常数和实常数)
//方法二:分析题目得出结论 c= 1000-a-b, 优化程序! $start = time();
echo "方法二:开始运行...\r\n";
for($a=0;$a<1001;$a++)
{
for($b=0;$b<1001;$b++)
{
$c = 1000-$a-$b;
if($a*$a+$b*$b==$c*$c)
{
echo "a=$a , b=$b , c=$c \r\n";
}
}
}
$end = time();
$total = $end-$start;
echo "开始时间:".date("Y-m-d H:i:s",$start)."\r\n";
echo "结束时间:".date("Y-m-d H:i:s",$end)."\r\n";
echo "共执行时间:$total 秒\r\n";
//共执行时间:0 秒 方法二:时间复杂度计算:
T(n) = n * n + (1 + max(1,0));
= n * n + 2
= n^2 + 2
则大O表示法,忽略常数就是:
T(n) 大O表示法: O(n) = n^2
时间复杂度的几条基本计算规则
- 基本操作,即只有常数项,认为其时间复杂度为O(1)
- 顺序结构,时间复杂度按加法进行计算
- 循环结构,时间复杂度按乘法进行计算
- 分支结构,时间复杂度取最大值
- 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略
- 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度
习题一初步理解时间复杂度大O表示法案例的更多相关文章
- 算法的时间复杂度——"大O分析法"(转载)
原文地址:https://my.oschina.net/gooke/blog/684026 一下为本人笔记:) 场景:在解决计算机科学领域的问题时,经常有好多个方法都可以,想找到最优的方法,就有了时间 ...
- 算法的时间复杂度(大O表示法)
定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”. 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性 ...
- Graph Cuts初步理解
一些知识点的初步理解_8(Graph Cuts,ing...) Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation).立 ...
- 算法时间复杂度、空间复杂度(大O表示法)
什么是算法? 计算机是人的大脑的延伸,它的存在主要是为了帮助我们解决问题. 而算法在计算机领域中就是为了解决问题而指定的一系列简单的指令集合.不同的算法需要不同的资源,例如:执行时间或消耗内存. 如果 ...
- 初步理解IOC和DI和AOP模式
初步理解IOC和DI和AOP模式 控制反转(IOC) 控制反转(IOC,Inversion of Control)是一种转主动为被动关系的一种编程模式,有点类似于工厂模式,举个栗子, 下面这个这不是I ...
- 初步理解require.js模块化编程
初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...
- 白话算法:时间复杂度和大O表示法
转自:https://www.jianshu.com/p/59d09b9cee58 每一个优秀的开发者脑中都有时间概念.他们想给用户更多的时间让用户做他们想做的事情.他们通过最小化时间复杂度来实现这一 ...
- javascript 原型及原型链的初步理解
最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...
- Spring学习笔记--环境搭建和初步理解IOC
Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...
随机推荐
- luogu4208
P4208 [JSOI2008]最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边 ...
- (转)mysql更改数据目录
mysql 更改默认数据目录 http://www.cnblogs.com/chenny7/p/3642363.html 本文主要介绍在CentOS下通过yum命令安装MySQL之后,如何移动默认数据 ...
- ICEM-带死角弯管
原视频下载地址:https://yunpan.cn/cqRiHaQiLi8I7 访问密码 b5c6
- LeetCode 第 152 场周赛
一.质数排列(LeetCode-1175) 1.1 题目描述 1.2 解题思路 先统计出1-n中有多少个质数,得到质数个数\(x\),剩下的数\(y = n - x\): 使用排列组合公式得出结果 \ ...
- Go by Example-图解数组
基本概念 1.数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 2.在 Go 中因为数组的内存布局是连续的,所以可以通过索引(位置 ...
- MyBatis 与 Hibernate
MyBatis 是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需关注 SQL 语句本身,而不用再花费精力去处理诸如注册驱动.创建 Connection.配置 Statem ...
- Linux 连接memcache 拒绝连接,防火墙关闭,selinux disabled 仍然不行,最后在外站找到原因,为服务器添加memcache访问权限
最后啊,不行,直接装memcached https://www.runoob.com/memcached/memcached-install.html 附上连接:https://www.presta ...
- 服务挂后Dump日志
JAVA_HOME=/usr/java OUTPUT_HOME=~/output DEPLOY_HOME=`dirname $0` HOST_NAME=`hostname` DUMP_PIDS=`ps ...
- 《你不知道的JavaScript(上)》笔记——this全面解析
首先要理解调用位置: 调用位置就是函数在代码中被调用的位置(而不是声明的位置). 最重要的是要分析调用栈(就是为了到达当前执行位置所调用的所有函数). 我们关心的调用位置就在当前正在执行的函数的前一个 ...
- python 了解一点属性的延迟计算
写在前面 本以为百度搜索这类知识的文章应该有很多, 然后我看了前面几篇后,基本上都是类似的内容,我想找些与众不同的博客看下,来拖宽这方面的广度,我就随机点到了第10页,结果第10页的内容基本跟属性的延 ...