#C++初学记录(算法效率与度量)
时间性能
**算法复杂性函数:
当n的数据规模逐渐增大时,f(n)的增长趋势:
* 当n增大到一定值以后,计算公式中影响最大的就是n的幂次级最高的项,并且其他的常数项和低幂次项都可以忽略,我们更关注的是它是一个什么量级的算法,是线性的还是n方的,还是指数级的。
<font size=4 face="微软雅黑">**大O表示法**
* 函数f、g定义域为自然数,值域为非负实数集
* **定义:**如果存在正数c和$n_0$,使得对任意的$$ n \geq n_0 $$ 都有$$ f(n) \leq cg(n)。\]
- 称f(n)在集合O(g(n))中,简称f(n)是O(g(n))的,或f(n)=O(g(n))。
- 大O表示法:表达函数增长率上限
- 一个函数增长率的上限可能不止一个
- 大O表示法不关心小范围的(n较小)的特例。
大O表示法的单位时间
- 一个简单的布尔或算数运算 - O(1)
- 简单I/O
- 指函数的输入/输出
例如:从数组读取数据等操作 - 不包括键盘文件等I/O
- 指函数的输入/输出
- 函数返回
大O表示法的运算规则
- 加法规则: $$f_1(n)+f_2(n)=O(max(f_1(n),f_2(n)))$$
( 最耗时的那一段。) - 乘法规则: $$ f_1(n)·f_2(n)=O(f_1(n)·f_2(n)) $$
(适用于while、for等循环结构)- 顺序结构,if结构,swith结构
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
k++;
嵌套循环中第一个和第二个for都是O(n)的时间复杂度,两者的乘积是:
\]
算法渐进分析:大\(\Omega\)表达式
- 定义:如果存在正数c和\(n_0\),使得对所有n\(\geq n_0\),都有f(n)\(\geq\)cg(n),
则称f(n)在集合\(\Omega\)(g(n))中,或f(n)=\(\Omega\)(g(n)) - 大O表示法和大\(\Omega\)表示法的唯一区别在于不等式的方向
- 采用大\(\Omega\)表示法时,最好找出在函数增值率的所有下限中那个最“紧”(即最大)的下界
增长率大小比较:$$\log_2n \leq n \leq n \log_2n \leq n^2 \leq 2^n$$
算法复杂性分析
例:顺序寻找k值
- 顺序从一个规模为n的一维数组中找出一个给定的k值
- 最佳情况 O(1)
- 数组的第一个元素就是k值
- 只需要检查第一个元素
- 最差情况 O(n)
- 数组的最后一个才是k
- 检查数组中所有的n个元素
- 如果等概率分布 O(n)
- k值出现在n个位置上的概率都是1/n
- 概率不等
- 出现在第一个位置的概率为1/2
- 出现在第二个位置上的概率为1/4
-出现在其他位置的概率都是$ \frac {1-1/2-1/4}{n-2} $
#C++初学记录(算法效率与度量)的更多相关文章
- [C语言] 数据结构-算法效率的度量方法-事前分析估算方法
事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算,抛开与计算机硬件软件有关的因素,一个程序的运行时间,依赖于算法的,好坏和问题的输入规模,所谓问题输入规模是指输入量的多少 推导过程,比 ...
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...
- CUDA并行计算 | CUDA算法效率提升关键点概述
文章目录 前言 存取效率 计算效率 性能优化要点 展现足够的并行性 优化内存访问 优化指令执行 前言 CUDA算法的效率总的来说,由存取效率和计算效率两类决定,一个好的CUDA算法必定会让两类效率 ...
- 【uva 1617】Laptop(算法效率--贪心,2种理解)
题意:有N条长度为1的线段,要求使每条线段分别在相应区间,且"空隙"数目最小.输出"空隙"数.(1≤N≤100000) 解法:(P.S.我这题竟做了2个多小时, ...
- 【uva 1615】Highway(算法效率--贪心 区间选点问题)
题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到 ...
- 【bzoj 3433】{Usaco2014 Jan} Recording the Moolympics(算法效率--贪心)
题意:给出n个区间[a,b),有2个记录器,每个记录器中存放的区间不能重叠.求2个记录器中最多可放多少个区间. 解法:贪心.只有1个记录器的做法详见--关于贪心算法的经典问题(算法效率 or 动态规划 ...
- 关于贪心算法的经典问题(算法效率 or 动态规划)
如题,贪心算法隶属于提高算法效率的方法,也常与动态规划的思路相挂钩或一同出现.下面介绍几个经典贪心问题.(参考自刘汝佳著<算法竞赛入门经典>).P.S.下文皆是我一个字一个字敲出来的,绝对 ...
- #C++初学记录(算法4)
A - Serval and Bus It is raining heavily. But this is the first day for Serval, who just became 3 ye ...
- #C++初学记录(贪心算法#结构体#贪心算法)
贪心算法#结构体 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋 ...
随机推荐
- JS实现重载
在js中,我们实现重载常用的方式有: 1.根据传入参数的类型执行不同的操作. 2.利用参数中特殊的参数值进行不同的操作. 3.根据参数的个数进行重载. 这里对第三种重载方式的实现进行说明. 实现第三种 ...
- vue mixins是什么及应用
mixins是什么? 官网对此的解释比较文绉绉,通俗的理解很简单,就是提供功能抽象 如A,B,C ...Z等很多个页面用到同一个功能,此时的做法就应该把该功能抽象出来,mixins就是干这个的 当然, ...
- Java 初始化块
初始化块是和成员变量.成员函数一个级别的.一般用于类的初始化,也可执行其他java代码,作用和构造函数相同. 创建对象时,初始化块在构造函数之前执行. 初始化块分为普通初始化块.静态初始化块. 普通初 ...
- Xcode 10 Archive 时电脑卡死
Xcode 10 Archive Unity5.x 导出工程时电脑卡死.解决办法:Targets - Build Settings - Debug Information Format 设置成DWAR ...
- java系统化基础-day02-运算符、选择结构、循环结构
1.java中的运算符 package com.wfd360.day02; import org.junit.Test; import java.math.BigInteger; /** * 1.算术 ...
- PC软件/web网站/小程序/手机APP产品如何增加个人收款接口
接入前准备 通过 XorPay 注册个人收款接口,原理是帮助你签约支付宝和微信(不需要营业执照)支持个人支付宝和个人微信支付接口,大概几分钟可以开通,开通后即可永久使用 PC 网站接入 效果:用户点击 ...
- ACAG 0x01-4 最短Hamilton路径
ACAG 0x01-4 最短Hamilton路径 论为什么书上标程跑不过这道题-- 首先,这道题与今年CSP-S2的D1T3有着异曲同工之妙,那就是--都有$O(n!)$的做法!(大雾) 这道题的正解 ...
- Codeforces D. Intercity Travelling(区间组合)
题目描述: D. Intercity Travelling time limit per test 1.5 seconds memory limit per test 256 megabytes in ...
- selenium与webdriver驱动与firefox、 chrome匹配版本
一.Chrome python3 selenium3.11.0(直接pip安装即可) chromedriver_win32:2.38 Chrome版本: 65.0.3325.146(正式版本)(32 ...
- selenium常用的API(七)判断元素是否可见
web页面不可见的元素虽不在页面上显示,但是存在于DOM树中,这些元素webdriver也能找到. element.is_displayed()方法可以判断元素是否在页面上显示,如果显示返回True, ...