之前学习过了数组的静态实现方法,同时将数组的所有有可能实现的方法都统一实现了一遍,之后支持了泛型的相关

概念,接下来就是如何对数组进行扩容的操作也就是实现动态数组。

private void resize(int newcapacity){
E[] newdata = (E[]) new Object[newcapacity];
for (int i = 0; i < newcapacity; i++) {
newdata[i] = data[i];
}
data = newdata;
}

在此处,我们写了一个关于resize的操作,其原理就是对就数组容量的扩容,扩容其原来的二倍。

同理,我们还可以进行对删除操作的优化,如果删完数据后,数组的容量有一半多是不用的空间,我们就可以进行删

掉一半的操作。

  public E remove(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("require index >= 0 and index > size!");
}
E ret = data[index];
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
data[size] = null; // loitering Objects != memory leak
if(size == data.length / 2){
resize(data.length/2);
}
return ret;
}

注意代码的第11,12行 进行了优化。

至此,我们就把数组的动态的实现整理完毕了。

接下来,我简单的描述一下时间复杂度的分析。

O(1) O(n) O(lgn) O(nlogn) O(n^2)

大O是描述的算法运行时间和输入数据之间的关系。

O(n)中 n表示的是元素的个数  算法和n呈线性关系。

那么O(n^2)则表示的是 成二次方的关系。

针对于不同的算法,我们需要针对不同的变量进行变量控制,来确定这个算法是否是最快的。

同理,删除操作也是相应的时间复杂度。

在看完时间复杂度之后,我们引入一个resize的时间复杂度分析。

对于添加的时间复杂度分析,我们可以看到,resize的时间复杂度分析是O(n),那么我们按最坏时间复杂度分析,

我们就将添加的时间复杂度算为O(n),但是并不是每次添加元素我们都要resize的 ,所以假设capacity = n,n+1次

addLast,触发resize,总共进行2n+1次基本操作平均,每次addLast操作,进行两次基本操作。这样均摊计算,时间复

杂度是O(1)的!,同理removeLast()的时间复杂度也是O(1)的,但是,如果我们综合去看待这个方法时,就会出现问

题。在填满数据后,我调用addLast()方法时,需要扩容,紧接着我又调用removeLast()方法,又开始缩容,一直这

样下去,时间复杂度一直是O(n),这样就产生了时间复杂度震荡。出现的原因是:removeLast()时,过于着急,我们

可以让他懒惰一些,也就是说可以在等到size  ==  capacity/4时,才将capacity减半。

这样,我们自己写完的动态数组就完成了!

学习数据结构Day2的更多相关文章

  1. SqList *L 和 SqList * &L的区别/学习数据结构突然发现不太懂 小祥我查找总结了一下

    小祥在学习李春葆的数据结构教程时发现一个小问题,建立顺序表和输出线性表,这两个函数的形参是不一样的. 代码在这里↓↓↓ //定义顺序表L的结构体 typedef struct { Elemtype d ...

  2. Spark菜鸟学习营Day2 分布式系统需求分析

    Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...

  3. Python学习日记 --day2

    Python学习日记 --day2 1.格式化输出:% s d  (%为占位符 s为字符串类型 d为数字类型) name = input('请输入姓名') age = int(input('请输入年龄 ...

  4. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  5. 数据结构之Queue | 让我们一块来学习数据结构

    前面的两篇文章分别介绍了List和Stack,下面让我们一起来学习Queue 数据结构之List | 让我们一块来学习数据结构 数据结构之Stack | 让我们一块来学习数据结构 队列的概况 队列是一 ...

  6. 数据结构之LinkedList | 让我们一块来学习数据结构

    highlight: monokai theme: vue-pro 上一篇文章中使用列表(List)对数据排序,当时底层储存数据的数据结构是数组.本文将讨论另外一种列表:链表.我们会解释为什么有时链表 ...

  7. 数据结构之Set | 让我们一块来学习数据结构

    数组(列表).栈.队列和链表这些顺序数据结构对你来说应该不陌生了.现在我们要学习集合,这是一种不允许值重复的顺序数据结构.我们将要学到如何创建集合这种数据结构,如何添加和移除值,如何搜索值是否存在.你 ...

  8. MySQL 学习 --- 数据结构和索引

    本文参考了多篇文章集成的笔记,希望各位学习之前可以阅读以下参考资料先 概述 文章分几个部分 :第一部分介绍了B-Tree 和 B+Tree 这种数据结构作为索引:第二部分介绍索引的最左前缀原则和覆盖索 ...

  9. 省选算法学习-数据结构-splay

    于是乎,在丧心病狂的noip2017结束之后,我们很快就要迎来更加丧心病狂的省选了-_-|| 所以从写完上一篇博客开始到现在我一直深陷数据结构和网络流的漩涡不能自拔 今天终于想起来写博客(只是懒吧.. ...

随机推荐

  1. vue饿了么UI库-笔记

    1. :rules="{required: true, message: '有效期不能为空'}" :rules="{type:'date',required: true, ...

  2. Refactoring open source business models

    https://opensource.com/business/16/4/refactoring-open-source-business-models They say you never forg ...

  3. 洛谷 SP338 ROADS - Roads 题解

    思路 dfs(只不过要用邻接表存)邻接表是由表头结点和表结点两部分组成,其中表头结点存储图的各顶点,表结点用单向链表存储表头结点所对应顶点的相邻顶点(也就是表示了图的边).在有向图里表示表头结点指向其 ...

  4. BZOJ 3672: [Noi2014]购票 树上CDQ分治

    做这道题真的是涨姿势了,一般的CDQ分治都是在序列上进行的,这次是把CDQ分治放树上跑了~ 考虑一半的 CDQ 分治怎么进行: 递归处理左区间,处理左区间对右区间的影响,然后再递归处理右区间. 所以, ...

  5. BZOJ 4919: [Lydsy1706月赛]大根堆 set启发式合并

    这个和 bzoj 5469 几乎是同一道题,但是这里给出另一种做法. 你发现你要求的是一个树上 LIS,而序列上的 LIS 有一个特别神奇的 $O(n\log n) $ 做法. 就是维护一个单调递增的 ...

  6. scylladb docker-compose 用户密码认证配置

    scylladb 对于用户的认证配置还是比较简单的,以下是一个docker-compose 配置的说明 环境准备 docker-compose 文件 version: "3" se ...

  7. 洛谷 P3385 【模板】负环 题解

    P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入格式 第一行一个正整数T ...

  8. DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全属性的对象.)

    目录 一丶简介 1.DACL是什么. 2.如何创建一个自己控制的文件. 3.SDDL是个什么鬼. 二丶 编写SDDL 控制的文件 一丶简介 1.DACL是什么. DACL称为自主访问的控制列表.是应用 ...

  9. 农场派对(party)(信息学奥赛一本通 1497)

    [题目描述] N(1≤N≤1000)头牛要去参加一场在编号为 x(1≤x≤N) 的牛的农场举行的派对.有 M(1≤M≤100000) 条有向道路,每条路长 Ti(1≤Ti≤100):每头牛都必须参加完 ...

  10. [bzoj 4833]最小公倍佩尔数

    传送门 Description   Let \((1+\sqrt2)^n=e(n)+f(n)\cdot\sqrt2\) , both \(e(n)\) and \(f(n)\) are integer ...