学习数据结构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结束之后,我们很快就要迎来更加丧心病狂的省选了-_-|| 所以从写完上一篇博客开始到现在我一直深陷数据结构和网络流的漩涡不能自拔 今天终于想起来写博客(只是懒吧.. ...
随机推荐
- navicat 远程连接服务器1130,1045问题报错处理
本人踩坑多次,一开始网上搜罗,解决办法大同小异,摸索了很久才全部解决完成,小小bug真磨人啊 首先,根据我的踩坑记录,navicat 1045和navicat 1130貌似属于同一种解决方案,都是修改 ...
- [Debug] How to Debug a NestJs Backend using the Chrome Dev Tools
TO debug NestJS code with Chrome dev tool, we can run: node --inspect-brk dist/rest-api/src/main.js ...
- vant - Navbar slot 插槽使用
//子组件 <template> <van-nav-bar> <slot slot="left" name="left">& ...
- c++ 将float 类型转换成string 类型
string Convert(float Num) { ostringstream oss; oss<<Num; string str(oss.str()); return str; }
- 微信小程序基本语法
渲染 .js page ({ data :{ memo:'hello world' } }) .wxml <view>{{memo}}</view> 绑定id .js page ...
- web 介绍
Web介绍: w3c:万维网联盟组织,用来制定web标准的机构(组织) web标准:制作网页遵循的规范 web准备规范的分类:结构标准.表现标准.行为标准. 结构:html.表示:css.行为:Jav ...
- CMD下文件操作
CMD下常用文件操作指令 1.输入盘符 如C: 然后回车,相当于进了C盘(c盘一般进的是桌面目录) 2.输入 cd 目录名 然后回车(目录名是c盘中的一级目录名,也可为c盘中的目录路径).如cd mm ...
- 【大数据应用技术】作业九|安装关系型数据库MySQL 安装大数据处理框架Hadoop
本次作业的要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3161 1.安装MySql 按ctrl+alt+t打开终端窗口,安 ...
- vs2015 编译obs studio 遇到的几个错误
1. >D:\project\vs\obs\ObsProject\obs-studio\plugins\win-wasapi\win-wasapi.cpp(245): error C2065: ...
- Netty执行流程分析与重要组件介绍
一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle 处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...