线性表的顺寻存储结构
数据结构:
数据结构也是分两个部分,一个是数据部分,一个是结构部分:
数据:
能够被计算机存储、识别和计算的东西都叫数据,但是这些数据都是以二进制存储的
硬盘中的:MP3、JPG、doc、AVI、EXE、TXT
内存中的:变量、常量、数组、对象、字节码
而结构则是数据与数据之间的一种或多种特定的关系。
虽然两者在概念上是独立的,但是在数据结构里面,少其一则程序的结构就是不完整的,因此 数据结构就是数据+数据之间的关系,两者的结合,组成数据结构,让我们的程序更加完整。
那么数据结构主要解决什么样的问题呢?——将零散的数据“整齐划一”,方便后续操作。
在前期阶段学习的时候,学到过数组,将一堆分散的变量,定义到数组里面,变成一堆连续的变量,方便对整体进行操作。因此,学习数据结构让我们对数据有一个比较方便的管理方式。
数据的结构:
逻辑结构:是指数据元素之间的相互关系,是我们想象出来的,并没有实质性的将其存储在计算机中
集合结构:集合结构中的数据元素除了同属于一个集合外,他们之间没有其他关系
线性结构:线性结构中的数据元素之间是一对一的关系
树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
图形结构:也叫网状结构,其数据元素是多对多的关系
物理结构:是指数据的逻辑结构在计算机中的存储形式
顺序存储结构:开辟一组连续的空间存储数据(查找快,增删慢)通常用数组来实现,数组中空间本身是连续的,保证了数据之间的关系
链式存储结构:开辟一组随机的空间存储数据(增删快,查找慢) 通常用节点来实现,节点不仅要存储数据,还要存储下一个节点的位置以保证数据之间的关系
算法
算法的概念是:解决特定问题求解步骤的描述,在计算机中表现为指令的有序系列,并且每条指令表示一个或多个操作。
设计算法要提高程序运行的效率,这里效率大都指算法的执行时间,这里提供两种方法:
1事后统计方法:这种方法主要是通过已经设计好的程序和数据,利用计算机计时器对不同算法程序的运行时间进行比较,从而确定算法效率的高低。但是这样会有很多缺陷:必须事先编好程序,在进行运行,如果程序处理的数据量较大,则会花费大量的时间和精力(计算一年都不成问题)时间的比较主要依赖于计算机硬件和软件环境算法的测试数据设计困难,在数量较小的时候,不管什么算法其运行时间都是很微小的,相差几乎为零,如果数据量大了,算法的优越性就出来了,但是这样又会耗费时间
2事前分析估算方法:这种方法主要在计算机程序编制前,依据统计方法对算法进行估算,一个高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:算法采用的策略、方法(决定算法好坏的根本)编译产生的代码质量(软件来支持)问题的输入规模机器执行指令的速度(硬件性能)
时间复杂度
官方定义:一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),存在一个正常数c使得fn*c>=T(n)恒成立。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。其中的关系是:O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2^n)<O(n!)<O(n^n)在计算时间复杂度时,忽略常数,只保留幂的最高次,且忽略幂高项的系数(我们考虑的时间复杂度都是最坏的情况)
线性表的顺寻存储结构
定义:零个或多个数据元素的有限序列
若将线性表记为(a1,…,ai-1,ai,ai+1,…,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱。
所以线性表元素的个数n(n>=0),定义为线性表的长度,当n=0时,成为空表。
举个列子:
我们现在在大学里,我们是几个班级一起上课,我们宿舍有一个特别帅气、热心、有趣的舍友叫浩然(王阳明说的养浩然正气,的浩然)…我们经常会让他帮我们去教室占座位,他总是答应。每次早上他一吃完早饭就会冲去教室,挑一个好地方(符合天时地利的好地方),把他书包放在一个位置,在拿几本书挨着书包的位置一个位置放一本,如果书不够就用笔或者水杯来代替,长长一排5个座位,总是让他一个人搞定,真的是中国好舍友。(想要微信的私聊,好说,好说…)
这个不是看一次能搞定的,你要做好心里准备!!!
线性表接口List的定义:
package com.oupeng.线性表;
/** List是线性表的最终父类接口*/
public interface List<E> {/*** 获取线性表中元素的个数(线性表的长度)* @return 线性表中有效元素的个数*/public int getSize();/*** 判断线性表是否为空* @return返回一个*/public boolean isEmpty();/*** 在线性表中指定的index角标处添加元素e* @param index指定的角标0<=index<=线性表的有效长度*/public void add(int index,E e);/*** 在线性的表头插入一个元素* @param e 要插入的元素,在指定的角标0处*/public void addFirst(E e);/*** 在线性表尾插入一个元素* @param e要插入的元素 指定在角标size处*/public void addLast(E e);/*** 在线性表中获取指定index角标处的元素* @param index 所指定的角标* @return 在角标所对应的元素*/public E get(int index);/*** 获取线性表中表头的元素* @return 表头元素*/public E getFirst();/*** 获取线性表中表尾的元素* @return 表尾元素 */public E getLast();/*** 修改线性表中指定的index处的元素为新元素e* @param index指定的角标* @param e 新元素*/public void set(int index,E e);/*** 判断线性表中是否包含指定的元素e 默认从前往后找* @param e要判断是否存在的元素* @return 元素的存在性布尔类型值*/public boolean contains(E e);/*** 在线性表中获取指定元素e的角标 默认从前往后找* @param e 要查询的数据* @return 数据在线性表中的位置*/public int find(E e);/*** 在线性表中删除指定角标处的元素 并返回* @param index 指定的角标 0<=index<size* @return 删除掉的老元素*/public E remove(int index);/*** 删除线性表中的表头元素* @return 表头元素*/public E removeFirst();/*** 删除线性表中的表尾元素* @return 表尾元素*/public E removeLast();/*** 早线性表中删除指定元素e* @param e*/public void removeElement(E e);/*** 清空线性表*/public void clear();}
现在来说说线性表的顺序存储结构:指的是用一段地址连续的存储单元,依次存储线性表的数据元素。就是用数组实现的,List接口下有一个用数组实现的子类叫ArrayList,它实现了List接口中的所有方法,并且根据自己的性质和属性有自己特有的方法。下面是它与List接口之间的关系(类与接口之间是实现的关系,与类与类之间泛化关系类似)
package com.oupeng.线性表;/*** 用顺序存储结构实现的List-顺序线性表-顺序表*/public class ArrayList<E> implements List<E>{private static int DEFAULT_SIZE=10; //容器的默认容量private E[] data; //存储数据元素的容器private int size; //线性表的有效元素的个数 //data.length表示线性表的最大容量Capacitypublic ArrayList() {// this.data=(E[]) new Object[DEFAULT_SIZE];
// this.size=0;this(DEFAULT_SIZE);}/*** 创建一个容量为指定capacity的一个线性表* @param capacity*/public ArrayList(int capacity) {this.data=(E[]) new Object[capacity];this.size=0;}/*** 将一个数组封装成为一个线性表* @param arr*/public ArrayList(E[] arr) {}@Overridepublic int getSize() {return size;}@Overridepublic boolean isEmpty() {return size==0;}@Overridepublic void add(int index, E e) {//向指定位置添加元素if(index<0||index>size) {throw new ArrayIndexOutOfBoundsException("add函数角标越界");}if(size==data.length) {//判断是否已满resize(2*data.length);}for(int i=size-1;i>=index;i--) {//添加元素data[i+1]=data[i];}data[index]=e;size++;}/*** 改变data的长度(扩容,缩容)* @param newLen 新数组大的长度*/private void resize(int newLen) {E[] newData=(E[]) new Object[newLen];for(int i=0;i<size;i++){newData[i]=data[i];}data=newData;}@Overridepublic void addFirst(E e) {add(0,e);}@Overridepublic void addLast(E e) {add(size,e);}@Overridepublic E get(int index) {//获取指定角标的元素if(index<0||index>size) {throw new ArrayIndexOutOfBoundsException("get函数角标越界");}return data[index];}@Overridepublic E getFirst() {return get(0);}@Overridepublic E getLast() {return get(size-1);}@Overridepublic void set(int index, E e) {//修改if(index<0||index>size) {throw new ArrayIndexOutOfBoundsException("set函数角标越界");}data[index]=e;}@Overridepublic boolean contains(E e) {//是否包含指定元素eif(isEmpty()) {return false;}for(int i=0;i<size;i++) {if(data[i]==e) {return true;}}return false;}@Overridepublic int find(E e) {//根据元素找角标if(isEmpty()) {return -1;}for(int i=0;i<size;i++) {if(data[i]==e) {return i;}}return -1;}@Overridepublic E remove(int index) {//删除指定角标位置if(index<0||index>size-1) {throw new ArrayIndexOutOfBoundsException("remove函数角标越界");}E e=get(index);for(int i=index+1;i<=size-1;i++) {data[i-1]=data[i];}size--;//最短不能小于默认容量//有效的个数小于等于容量的四分之一if(data.length>DEFAULT_SIZE&&size<=data.length/4) {//判断是否缩容resize(data.length/2);}return e;}@Overridepublic E removeFirst() {return remove(0);}@Overridepublic E removeLast() {return remove(size-1);}@Overridepublic void removeElement(E e) {//删除指定元素int index=find(e);if(index==-1) {throw new IllegalArgumentException("删除元素不存在");//非法参数异常}remove(index);}@Overridepublic void clear() {size=0;}public String toString() {StringBuilder sb=new StringBuilder();//StringBuilder没锁,快//每次都显示现在的有效个数,和最大容量sb.append("ArrayList: size="+size+",capacity="+data.length+"\n");if(isEmpty()){sb.append("[]");}else{sb.append('[');for(int i=0;i<size;i++){sb.append(data[i]);if(i==size-1){sb.append(']');}else{sb.append(',');//用","拼接的时候会产生好多字符串}}}return sb.toString();}public int getCapacity(){//return data.length;}public void swap(int i,int j){//自动交换角标//i j 判断
// assert i>=0&&i<=size-1;
// assert j>=0&&j<=size-1;E temp=data[i];data[i]=data[j];data[j]=temp;}public boolean equals(Object obj) {//比较内容if(obj==null){return false;}if(obj==this){return true;}if(obj instanceof ArrayList){//必需时ArrayList才可以比较ArrayList l=(ArrayList) obj;if(getSize()==l.getSize()){for(int i=0;i<getSize();i++){if(get(i)!=l.get(i)){return false;}}return true;}}return false;}
}
线性表的顺寻存储结构相关推荐
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
- 链表list(链式存储结构实现)_5 线性表的链式存储结构
系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...
- 从零开始学数据结构和算法(二)线性表的链式存储结构
链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...
- 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...
- 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...
- 数据结构开发(5):线性表的链式存储结构
0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? ...
- 线性表(链式存储结构)C语言
文章目录 一.线性表的链式存储结构 二.代码 1.头文件与宏定义: 2.对链表的定义及主要使用函数: 3.测试函数(主函数): 三.运行结果 一.线性表的链式存储结构 线性表的链式存储结构的特点是用一 ...
- Python 数据结构 之 线性表 的链式存储结构
用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明: Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...
- 【数据结构】CH2 线性表的链式存储结构
目录 一.链表概述 1.相关定义 二.单链表 1.插入和删除节点的操作 (1)插入结点 (2)删除结点 2.建立单链表 (1)头插法 (2)尾插法 3.线性表基本运算在单链表中的实现 (1)初始化线性 ...
最新文章
- lj245a引脚功能图_如何快速读懂时序图?
- 第十二届蓝桥杯决赛JavaC组真题——详细答案对照(全网唯一:异或变换100%数据)
- Java EE 7 / JAX-RS 2.0 – REST上的CORS
- Django之序列化
- 过拟合问题——正则化方法
- 我是买家项目随想-展望2011
- 2018年python工作好找吗-Python的发展状况-2018年
- 互联网公司如何有效执行流程的心得
- uc android 面试题,一道新浪UC部门软件测试面试题
- jupyterLab增大字体大小
- Java 基于JavaMail实现向QQ邮箱发送邮件
- NLP之TF之LSTM:基于Tensorflow框架采用PTB数据集建立LSTM网络的自然语言建模
- matlab:预测股票价格走势
- Excel2003 去除重复项
- 推荐一款绝对不能错过的 ORM 框架 dbVisitor,目前版本 4.3.0
- Github标签管理
- 必应词典win10问题
- 3.4只读存储器ROM
- 汇编语言各“标志位”含义
- 《麦肯锡方法》读书笔记11
热门文章
- c盘越来越大怎么清理?清理C:\Windows\System32\DriverStore\FileRepository
- PHP 百度图片搜索功能API接口开发
- oracle定时清理aud$
- java异常排列方式_java中排序报:Comparison method violates its general contract异常的解决...
- 写在前面的一些话:《Learning OpenCV》中文版 .
- “牛气冲天”预交卷,2022年雨花区会怎样“如虎添翼”?
- 深圳MPD大会 讲师演讲稿 2014-10
- linux 输出到文件 新,如何将Linux命令输出保存到文件的两种方法
- Kibana中KQL的使用
- scandisk.exe 流氓软件的删除