学习数据结构Day2
之前学习过了数组的静态实现方法,同时将数组的所有有可能实现的方法都统一实现了一遍,之后支持了泛型的相关
概念,接下来就是如何对数组进行扩容的操作也就是实现动态数组。
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的更多相关文章
- SqList *L 和 SqList * &L的区别/学习数据结构突然发现不太懂 小祥我查找总结了一下
小祥在学习李春葆的数据结构教程时发现一个小问题,建立顺序表和输出线性表,这两个函数的形参是不一样的. 代码在这里↓↓↓ //定义顺序表L的结构体 typedef struct { Elemtype d ...
- Spark菜鸟学习营Day2 分布式系统需求分析
Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...
- Python学习日记 --day2
Python学习日记 --day2 1.格式化输出:% s d (%为占位符 s为字符串类型 d为数字类型) name = input('请输入姓名') age = int(input('请输入年龄 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- 数据结构之Queue | 让我们一块来学习数据结构
前面的两篇文章分别介绍了List和Stack,下面让我们一起来学习Queue 数据结构之List | 让我们一块来学习数据结构 数据结构之Stack | 让我们一块来学习数据结构 队列的概况 队列是一 ...
- 数据结构之LinkedList | 让我们一块来学习数据结构
highlight: monokai theme: vue-pro 上一篇文章中使用列表(List)对数据排序,当时底层储存数据的数据结构是数组.本文将讨论另外一种列表:链表.我们会解释为什么有时链表 ...
- 数据结构之Set | 让我们一块来学习数据结构
数组(列表).栈.队列和链表这些顺序数据结构对你来说应该不陌生了.现在我们要学习集合,这是一种不允许值重复的顺序数据结构.我们将要学到如何创建集合这种数据结构,如何添加和移除值,如何搜索值是否存在.你 ...
- MySQL 学习 --- 数据结构和索引
本文参考了多篇文章集成的笔记,希望各位学习之前可以阅读以下参考资料先 概述 文章分几个部分 :第一部分介绍了B-Tree 和 B+Tree 这种数据结构作为索引:第二部分介绍索引的最左前缀原则和覆盖索 ...
- 省选算法学习-数据结构-splay
于是乎,在丧心病狂的noip2017结束之后,我们很快就要迎来更加丧心病狂的省选了-_-|| 所以从写完上一篇博客开始到现在我一直深陷数据结构和网络流的漩涡不能自拔 今天终于想起来写博客(只是懒吧.. ...
随机推荐
- python中的object
继承 object 类的是新式类,不继承 object 类的是经典类,在 Python 2.7 里面新式类和经典类在多继承方面会有差异: class A: def foo(self): print(' ...
- 做勇敢女孩 https://www.bilibili.com/video/av14346123?from=search&seid=14078047355739050009
So a few years ago, I did something really brave, or some would say really stupid. I ran for congres ...
- 洛谷 P2212 [USACO14MAR]浇地Watering the Fields 题解
P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...
- shell脚本编程基础之for循环
循环结构 循环需要有进入条件和退出条件,如果没有退出条件,则就会一直循环下去 for 变量 in 列表:do 循环体 done 生成列表及示例 {1..100}:生成1到100的整数列表 `comma ...
- git sh.exe 乱码
其实很简单,只需要在 git 安装目录中的 etc 目录下修改 bash.bashrc 文件. 在该文件头部加入: export LANG=zh_CN.utf-8alias ls='ls --show ...
- node.js切换多个版本
开言 试用场景就是我们开发项目的时候,有可能一个项目需要v10版本,另一个项目需要v8版本,遇到这种问题,我们不能卸载再重新安装对应的版本去开发,遇到这样的问题的时候,那我们就可以去用另一种方式去切换 ...
- fastq 转换为 fasta
使用 awk awk '{if(NR%4 == 1){print ">" substr($0, 2)}}{if(NR%4 == 2){print}}' XXX.fastq & ...
- 第07组 Beta冲刺(5/5)
队名:摇光 队长:杨明哲 组长博客:求戳 作业博客:求再戳 队长:杨明哲 过去两天完成了哪些任务 文字/口头描述:暂时没有. 展示GitHub当日代码/文档签入记录:(组内共用,已询问过助教小姐姐) ...
- 绿色地狱 - 纽博格林赛道详解 | Nürburgring
Nürburgring - Green Hell [統哥] 車迷人生必去一趟的德國紐柏林賽道之旅 F1赛道通常短而宽,一是为了观赏性,二是为了安全. 而Nürburgring赛道则是F1赛道的极端反面 ...
- Python中为什么没有++和–(自增/减)(转)
原文地址:http://blog.csdn.net/guang09080908/article/details/47273775(侵删) 这两天看了一些网上各大互联网公司的面试题,发现腾讯特别喜欢考察 ...