<数据结构基础学习>(二)简单的时间复杂度分析
一.简单的复杂度分析
O(1) O(n) O(logn) O(logn) O(n^2)
大O描述的是算法的运行事件和输入数据之间的关系
Eg:
数组求和
public static int sum(int[] nums){
int sum = 0;
for(int num:nums){
sum += num;
}
return sum;
}
O(n),n为nums中的元素个数。算法和n呈线性关系。
忽略常数,实际时间T=c1*n+c2。
T = 2 *n +2 O(n)
T = 2000*n + 10000 O(n)
T=1*n*n+0 O(n^2)
T=2*n*n+300n+10 O(n^2)
大O为渐进事件复杂度,描述n趋近于无穷的情况
Eg:
1.添加操作
addLast(e) O(1)
addFirst(e) O(n)
add(index, e) 分析方法,严格计算需要概率论计算期望 O(n/2) = O(n)
整体来说,添加操作为O(n)的操作,通常情况下,考虑是最坏的情况
2.resize O(n)
3.删除操作
removeLast() O(1)
removeFirst() O(n)
remove(index, e) O(n/2) = O(n)
整体来说,删除操作为O(n)的操作
4.修改操作
set(index, e) O(1) 数组优势:支持随机访问
5.查询操作
get(index) O(1)
contains(e) O(n)
find(e) O(n)
总体来说
增:O(n)
删:O(n)
改:已知索引O(1);未知索引O(n)
查:已知索引O(1);未知索引O(n)
二.均摊时间复杂度与复杂度的震荡
1.均摊复杂度
假设capacity = n,n+1次addLast,触发resize,总共进行2n+1次基本操作
平均,每次addLast(e)操作,进行2次基本操作
这样均摊计算,均摊时间复杂度是O(1)的。 与当前size无关
removeLast(e)同理
2.复杂度的震荡
同时看addLast和removeLast操作
当capacity = n,此时size = n,addLast(e)与removeLast(e)都会触发resize
addLast 扩容O(n)
removeLast 缩容 O(n)
addLast 扩容O(n)
removeLast 缩容O(n)
......
产生了复杂度的震荡
出现问题原因:removeLast时resize过于着急(Eager)
解决方案:Lazy
remove方法中,当size=capacity/4,才将capacity减半,同时需要保证缩容得到的数组空间data.length/2!=0
if(size == data.length / 2 && data.length / 2 != 0)
resize(data.length/2);
<数据结构基础学习>(二)简单的时间复杂度分析的更多相关文章
- Go基础学习(二)
数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
- <数据结构基础学习>(四)链表 Part 1
一.链表基础 动态数组.栈.队列底层都是依托静态数组实现的,靠resize来解决固定容量问题. 链表是真正的动态数据结构,是一种最简单的一种动态数据结构. 更深入的理解引用(或者指针). 更深入的理解 ...
- Django基础学习二
今天继续学习django的基础 学习用户提交url如何获得返回值 1.首先需要在工程的urls文件定义指定的urls要路由给哪个函数 在这个例子中,我们定义home的urls路由给views里的tes ...
- salesforce lightning零基础学习(二) lightning 知识简单介绍----lightning事件驱动模型
看此篇博客前或者后,看一下trailhead可以加深印象以及理解的更好:https://trailhead.salesforce.com/modules/lex_dev_lc_basics 做过cla ...
- python基础学习二 数据结构之list及相关基本操作
list是py内置的一种数据类型,list就是列表的意思,list就是一种有序的数据集合,可以随时增加和删除list的元素. 生活中,比如我们要列出全班同学的名字,就可以用list来表示 >&g ...
- NetAnalyzer笔记 之 二. 简单的协议分析
[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 上篇我们回顾完了NetAnalyzer一些可有可无的历史,在本篇,我决定先不对NetAnalyzer做介绍,而是先 ...
- WebService基础学习(二)—三要素
一.Java中WebService规范 JAVA 中共有三种WebService 规范,分别是JAX-WS.JAX-RS.JAXM&SAAJ(废弃). 1.JAX-WS规范 ...
随机推荐
- angular应用容器化部署
angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...
- Linux 环境 Maven 安装&仓源配置
索引: 目录索引 参看代码 GitHub: maven.txt 一.Linux (DeepinOS) 环境 1.官网下载 https://maven.apache.org/download.cgi 2 ...
- Git命令备忘
最近在用Git,查了点相关资料,逻辑依然不太明了,先整理一部分备忘,以后补充 一.本地Git与Github/码云的关联 1. 设置本地用户名,邮箱 git config --global user.n ...
- c/c++ 多线程 unique_lock的使用
多线程 unique_lock的使用 unique_lock的特点: 1,灵活.可以在创建unique_lock的实例时,不锁,然后手动调用lock_a.lock()函数,或者std::lock(lo ...
- python3.x pool.map方法的实质
我使用多进程的一般方式,都是multiprocessing模块中的Pool.map()方法.下面写一个简单的示例和解析.至于此种方法使用多进程的效率问题,还希望大佬予以指正. 示例: "&q ...
- Win10解除网速限制让网速飞起来
Win10隐藏了20%的网速,下面叫你怎么释放它: 1.按Win+R调出运行,输入gpedit.msc点击确定; 2.点击windows设置,右击基于策略Qos,选择高级Qos设置: 3.勾选如图方框 ...
- 创建你的第一个Composer/Packagist包
今天我们要介绍一下如何通过Composer和Packagist向PHP社区贡献代码包.首先,如果你是一个PHP开发者但是还不知道什么是Composer,请先参考了一下这篇文章http://docs.p ...
- A Deep Learning-Based System for Vulnerability Detection
本篇文献作者提出了一种基于深度学习来检测软件漏洞的方案. 摘要:作者开始基于深度学习的漏洞检测研究,是为了减轻专家手工定义特性的繁琐任务,需要制定一些指导性原则来适用于深度学习去进行漏洞探 ...
- “软到不行”的WWDC2018
转载请标明来源:https://www.cnblogs.com/zhanggui/p/9154542.html 简介 一年一度的WWDC于北京时间6月5号凌晨1点在加利福利亚州圣何塞的麦克恩利会议中心 ...
- 超哥笔记 --nginx入门(6)
一 NGINX 1 nignx是什么 nginx是一个开源的支持高性能,高并发的web服务和代理服务软件. nginx比他大哥apache性能改进许多,nginx占用的系统资源更少,支持高并发连接,有 ...