一.简单的复杂度分析

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. python模块--zipfile文件压缩

    zipfile模块是python中一个处理压缩文件的模块,解决了不少我们平常需要处理压缩文件的需求 ,本文主要谈谈zipfile几个常用的用法. 首先我在Windows操作系统中创建如下的文件目录: ...

  2. cmd实现批量文件的base64加密并双击加密文件后正常运行

    之前,一个朋友让我用cmd做个简单的文档加密(base64),对于不太懂电脑的人来说看不懂就行.但是当那个人点击加密后的文件可以正常运行,问咋写? 其实,像这种要求不高的加密来说,随便下载个加密软件就 ...

  3. django 创建admin用户名跟密码

    一.django中创建用户名和密码 (venv) D:\project\py37project\Djangopro\Procrm>Python37 manage.py createsuperus ...

  4. #022 Python 实验课

    拍7游戏 描述 “拍7游戏”规则是:一堆人围成一圈,开始时,任意指定一人说出数字“1”后,一圈人按顺时针方向,每人按整数由小到大的顺序一人一个地报出后续数字“2”.“3”......,当遇到为“7”的 ...

  5. Windows操作系统分类

    Windows主要有桌面版和服务器版.移动版三个版本 桌面版现在主流是WindowsXP.WindowsVista.Windows7.Windows8.Windows10 其中WindowsXP已经被 ...

  6. python之面相对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  7. 数据类型:list列表[]、元祖tuple()、dict字典{}

    List 列表[] 可变的 lst = [1,2,3,4] #改 lst[(元素下标)] = '需要修改的' #通过下表修改 lst[下标:下标] = '需要修改的' #通过范围修改 #加 lst.a ...

  8. java 服务端I/O非阻塞实现05

    /** * 非阻塞IO多线线程服务端 * 当一个任务进入多线程,这个任务线程需要处理接收信息.发送信息.因而发生I/O阻塞问题 * 利用selector可以实现异步 * */ public class ...

  9. 使用github 的相关博客

    基于hexo+github搭建一个独立博客     如何用Github的gh-pages分支展示自己的项目     使用git clone error: RPC failed     Git的使用-- ...

  10. Git以一个远程分支为基础新建一个远程分支(转载)

    例如现在有两个分支,master和develop git checkout master //进入master分支git checkout -b frommaster //以master为源创建分支f ...