一.简单的复杂度分析

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);

<数据结构基础学习>(二)简单的时间复杂度分析的更多相关文章

  1. Go基础学习(二)

    数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...

  2. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  3. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  4. <数据结构基础学习>(四)链表 Part 1

    一.链表基础 动态数组.栈.队列底层都是依托静态数组实现的,靠resize来解决固定容量问题. 链表是真正的动态数据结构,是一种最简单的一种动态数据结构. 更深入的理解引用(或者指针). 更深入的理解 ...

  5. Django基础学习二

    今天继续学习django的基础 学习用户提交url如何获得返回值 1.首先需要在工程的urls文件定义指定的urls要路由给哪个函数 在这个例子中,我们定义home的urls路由给views里的tes ...

  6. salesforce lightning零基础学习(二) lightning 知识简单介绍----lightning事件驱动模型

    看此篇博客前或者后,看一下trailhead可以加深印象以及理解的更好:https://trailhead.salesforce.com/modules/lex_dev_lc_basics 做过cla ...

  7. python基础学习二 数据结构之list及相关基本操作

    list是py内置的一种数据类型,list就是列表的意思,list就是一种有序的数据集合,可以随时增加和删除list的元素. 生活中,比如我们要列出全班同学的名字,就可以用list来表示 >&g ...

  8. NetAnalyzer笔记 之 二. 简单的协议分析

    [创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 上篇我们回顾完了NetAnalyzer一些可有可无的历史,在本篇,我决定先不对NetAnalyzer做介绍,而是先 ...

  9. WebService基础学习(二)—三要素

    一.Java中WebService规范      JAVA 中共有三种WebService 规范,分别是JAX-WS.JAX-RS.JAXM&SAAJ(废弃).   1.JAX-WS规范    ...

随机推荐

  1. 从.Net到Java学习第一篇——开篇

    以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...

  2. Android 中使用 dlib+opencv 实现动态人脸检测

    1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo.该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用 ...

  3. 【NodeJS】Node.JS 开发环境安装

    1.前言 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O ...

  4. 导入JavaWeb 项目出现的问题

    前言: 环境: windown 10 JDK 1.8 Tomcat 7 eclipse 导入项目 下面错误是出现的问题 Multiple annotations found at this line: ...

  5. 安装ESXi部署OVF详细步骤

    整个安装部署过程均在个人环境进行.欧克,我们现在开始. 一.安装ESXi 1.Enter回车 2.Enter回车继续 3.F11,接受继续 4.Enter,回车继续(选择安装ESXi的设备) 5.默认 ...

  6. ASP.NET -- WebForm -- ScriptManager 类

    ASP.NET -- WebForm -- ScriptManager 类 通过 ScriptManager 可注册随后将作为页面一部分呈现的脚本. 1. 注册并立即执行脚本. --RegisterS ...

  7. SQLServer之创建LOGON触发器

    LOGON触发器工作原理 登录触发器将为响应 LOGON 事件而激发存储过程. 与 SQL Server实例建立用户会话时将引发此事件. 登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前 ...

  8. LeetCode算法题-Base 7(Java实现)

    这是悦乐书的第247次更新,第260篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第114题(顺位题号是504).给定一个整数,返回其基数为7的字符串表示.例如: 输入: ...

  9. Android--图片轮播(banner)

    使用步骤 Step 1.依赖banner Gradle dependencies{ compile 'com.youth.banner:banner:1.4.10' //最新版本 } 或者引用本地li ...

  10. [LeetCode] 12,13 整数和罗马数互转

    12. 整数转罗马数字 题目链接:https://leetcode-cn.com/problems/integer-to-roman/ 题目描述: 罗马数字包含以下七种字符: I, V, X, L,C ...