算法初探——大O表示法
#include <stdio.h>
#include<malloc.h>
int sum2(int n)//时间复杂度为常数,记为大欧--》O(1)
{
int sum = ;//
sum = (n +)*n / ;//
return sum;
}
int sum1(int n)//n-> ∞时,时间复杂度O(n)
{
int sum = ;//
for (int i = ; i <= n; i++)
sum += i;//n
return sum;
}
/*
算法测试求1到n的和
*/
int main(void)
{
printf("sum1=%d\n", sum1());
printf("sum2=%d\n", sum2());
return ;
}
sum1所用指令步长明显比sum2多,sum2采用等差数列求和方式极大减少了运行时间。
我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。
“大O记法" :在这种描述中使用的基本参数是n,即问题实例的规模,把复杂性或运行时间表达为n的函数。这里的“O”表示量级(order),比如说“二分检索是O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法O ( f(n) )表示当n增大时,运行时间至多将以正比于f(n)的速度增长。
这种渐进估计对算法的理论分析和大致比较是非常有价值的,但在实践中细节也可能造成差异。
O(1)
int a=1;int b=1;int c=1;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
上面使用的是时间复杂的度量。类似时间复杂度,同样有空间复杂度。空间复杂度指程序需要开辟的存储空间。
如上代码:
#include <stdio.h>
#include<malloc.h>
int sum2(int n)//空间复杂度 4-》O(1)
{
int sum = ;//
sum = (n +)*n / ;//
return sum;
}
int sum1(int n)//空间复杂度 8-》O(1)
{
int sum = ;//
for (int i = ; i <= n; i++)//
sum += i;//0
return sum;
}
算法初探——大O表示法的更多相关文章
- 【从0到1学算法】大O表示法
一般我们在选择算法时,都是想要选择效率最高的算法.那算法的效率,用什么表示?没错!就是用大O表示法. PS: 大O表示法中,log即为log2,后面不再说明. 下面以简单查找和二分查找,在含有n个元素 ...
- 算法的时间复杂度(大O表示法)
定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”. 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性 ...
- python数据结构与算法学习自修第二天【时间复杂度与大O表示法】
#!/usr/bin/env python #! _*_ coding:UTF-8 _*_ from Queue import Queue import time que = Queue() time ...
- 【算法】二分查找法&大O表示法
二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...
- 算法时间复杂度、空间复杂度(大O表示法)
什么是算法? 计算机是人的大脑的延伸,它的存在主要是为了帮助我们解决问题. 而算法在计算机领域中就是为了解决问题而指定的一系列简单的指令集合.不同的算法需要不同的资源,例如:执行时间或消耗内存. 如果 ...
- 算法图解学习笔记01:二分查找&大O表示法
二分查找 二分查找又称折半查找,其输入的必须是有序的元素列表.二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止:如果x<a[ ...
- 算法图解之大O表示法
什么是大O表示法 大O表示法可以告诉我们算法的快慢. 大O比较的是操作数,它指出了算法运行时间的增速. O(n) 括号里的是操作数. 举例 画一个16个格子的网格,下面分别列举几种不同的画法,并用大O ...
- 重拾算法之复杂度分析(大O表示法)
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- 算法的时间复杂度——"大O分析法"(转载)
原文地址:https://my.oschina.net/gooke/blog/684026 一下为本人笔记:) 场景:在解决计算机科学领域的问题时,经常有好多个方法都可以,想找到最优的方法,就有了时间 ...
随机推荐
- VB.NET服务器端令客户端下载PDF文件
后台JS调用另一个控件,通过SESSION传递sDocumentPath 控件后台代码如下 Response.Clear() '如果不清,则有可能将页面源码作为文件内容的一部分传递给用户 ...
- VNC-tigervnc-server远程调用图形化
远程调用Linux图形化,很不错的.. 01.远程Linux须装图形化 yum groupinstall -y 'Desktop' 'X Window System' #xclock试图形 ...
- 国内四大炒股软件APP 全面技术解析
随着人们的焦点逐步由电脑PC端转为手机端之后,国内炒股软件也逐步开始推出手机炒股APP,但是面对如此众多的都以“最牛.最佳”等冠名的APP真的实至名归吗?为了大家不再走弯路,不沉迷智能选股,笔者将近期 ...
- FCT需求分析
1. 系统组成 系统从硬件角度看是由芯片.电源,时钟,总线组成, 当中总线分为控制总线和数据总线. 芯片是单个的硬件单元,可实现多种功能.有些功能有性能需求,在计算机系统中大部分功能都须要软件配合. ...
- Linux-Linux下安装redis报错"undefined reference to__sync_add_and_fetch_4"解决办法
如果出现这种错误可以在make的时候加上CFLAGS="-march=i686" 即 make CFLAGS="-march=i686" ----------- ...
- gVim中重新载入当前文件
http://club.topsage.com/thread-2251455-1-1.html有些时候当前打开的文件可能被外部程序不知不觉改变了,这个时候我们就需要重新打开这个文件,或是重读/重载一个 ...
- Linux Pin Control 子系统
Pin Control Subsystem是Linux内核抽象出的一套用于控制硬件引脚的一套子系统. 1.源文件列表 源码位于linux/drivers/pinctrl目录下,源文件列表如下: 文件名 ...
- pycurl 学习笔记--getinfo 函数
通过 pycurl.Curl 对象的 getinfo 函数,可以获取到响应的如下信息: (参考: http://curl.haxx.se/libcurl/c/curl_easy_getinfo.htm ...
- 线程模型、pthread 系列函数 和 简单多线程服务器端程序
一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用 ...
- Hive学习之函数DDL和Show、Describe语句
创建/删除函数 创建暂时函数 以下的语句创建由class_name实现的暂时函数,该函数被创建后仅仅能够在当前会话中使用.会话结束后函数失效. 实现函数的类能够是Hive类路径中的随意类.能够使用Ad ...