线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类。

首先让我们来看下顺序表的定义:

线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素,元素在内存的物理存储次序与它们在线性表中的逻辑次序相同,即元素ai与其直接前驱ai-1及直接后继ai+1的存储位置相邻。顺序存储的线性表也成为顺序表(sequential list)。

 

顺序表类SeqList提供线性表基于顺序存储结构的一种实现,它有两个私有成员变量table和n,table是一个存放元素的对象数组;n为线性表长度,n≤table.length。SeqList声明如下,它实现了线性表的接口LList。

package dataStructure.linearList;  
import dataStructure.linearList.LList;  public class SeqList<E> implements LList<E>                 //顺序表类,实现线性表接口  
{  private Object[] table;                                 //对象数组,私有成员  private int n;                                          //顺序表长度  public SeqList(int capacity)                            //构造方法,创建置顶容量的空表  {  this.table = new Object[Math.abs(capacity)];  this.n = 0;  }  public SeqList()                                        //指定空表的默认容量  {  this(16);  }  public boolean isEmpty()                                //判断顺序表是否为空,若空返回true  {  return this.n == 0;  }  public int length()                                     //返回顺序表长度  {  return this.n;  }  public E get(int index)                                 //返回index(初值为0)位置的对象,若序号无效,返回null  {  if(index>=0 && index < this.n)  {  return (E)this.table[index];  }  return null;  }  public E set(int index,E element)                       //设置index位置的对象为element,若操作成功,放回原对象,否则返回null  {  if(index >= 0 && index < this.n && element != null)  {  E old =(E)this.table[index];  this.table[index] = element;  return old;  }  return null;  }  public boolean add(int index,E element)                 //在index位置插入element对象,若操作成功返回true,不能插入null  {  if(element == null)                                 //不能插入null  {  return false;  }  if(this.n == table.length)                          //若数组满,则需要扩充顺序表容量  {  Object[] temp = this.table;  this.table = new Object[temp.length*2];         //重新申请一个容量更大的数组  for(int i = 0;i < temp.length;i++)  {  this.table[i] = temp[i];  }  }  if(index < 0)                                        //下标容错  {  index = 0;  }  if(index > this.n)  {  index =this.n;  }  for(int j = this.n-1;j >= index;j--)             //元素后移,平均移动n/2  {  this.table[j+1] = this.table[j];  }  this.table[index] = element;  this.n++;  return true;  }  public boolean add(E element)                           //在顺序表最后插入element对象  {  return add(this.n,element);  }  public E remove(int index)                              //移去index位置的对象,若操作成功,则返回被移去的对象,否者返回null  {  if(this.n != 0 && index >= 0 && index < this.n)  {  E old = (E)this.table[index];  for(int j = index;j < this.n-1;j++)              //元素前移,平均移动n/2  {  this.table[j] = this.table[j + 1];  }  this.table[this.n - 1] = null;  this.n--;  return old;  }  return null;  }  public void clear()                                     //清空顺序表  {  if(this.n != 0)  {  for(int i = 0;i < this.n;i++)  {  this.table[i] = null;  }  this.n=0;  }  }  public String toString()                                //返回显示所有元素的字符串,形式为(,)  {  String str = "(";  if(this.n != 0)  {  for(int i = 0;i < this.n - 1;i++)  {  str += this.table[i].toString()+",";  }  str += this.table[this.n - 1].toString();  }  return str + ")";  }  
}  

顺序表是一种随即存取结构,存取任何一个元素的get()、set()方法的时间复杂度是O(1)。

 

对顺序表进行插入或删除操作是,算法所花费的时间主要用于移动元素。在等概率情况下,插入一个元素平均需要移动一半的元素,时间复杂度为O(n)。同里,删除一个元素的时间复杂度亦为O(n)。

 

综上所述,顺序表具有下列特点:

 

①:元素的物理存储顺序直接反映表中元素的逻辑顺序,可以随机存取元素。

②:插入和删除的操作效率很低。每插入或删除一个元素,可能需要移动大量元素,其平均移动次数是顺序表长度的一半。再者,数组容量不可更改,存在因容量小造成数据溢出,或因容量过大造成内存资源浪费的问题。解决数据溢出的方法是,申请另一个更大容量的数组,并进行数组元素复制,但插入操作效率很低。 

顺序表是一种随即存取结构,存取任何一个元素的get()、set()方法的时间复杂度是O(1)。

 

对顺序表进行插入或删除操作是,算法所花费的时间主要用于移动元素。在等概率情况下,插入一个元素平均需要移动一半的元素,时间复杂度为O(n)。同里,删除一个元素的时间复杂度亦为O(n)。

 

综上所述,顺序表具有下列特点:

 

①:元素的物理存储顺序直接反映表中元素的逻辑顺序,可以随机存取元素。

②:插入和删除的操作效率很低。每插入或删除一个元素,可能需要移动大量元素,其平均移动次数是顺序表长度的一半。再者,数组容量不可更改,存在因容量小造成数据溢出,或因容量过大造成内存资源浪费的问题。解决数据溢出的方法是,申请另一个更大容量的数组,并进行数组元素复制,但插入操作效率很低。

转载于:https://www.cnblogs.com/ganchuanpu/p/7468527.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下安装jdk

参考于&#xff1a;http://www.cnblogs.com/caosiyang/archive/2013/03/14/2959087.html 一、准备阶段 ①下载jdk-6u45-linux-i586.bin&#xff0c;通过xftp上传至Linux系统中 ②在命令行执行 ./jdk-6u45-linux-i586.bin&#xff0c;生成目录jdk1.6.0_45 ③移动到/usr/share下&…

JDK source 之 ArrayList 需要注意事项

线程安全 ArrayList内部没有实现原子性操作&#xff0c;所以是非线程安全的。如果需要在线程安全的环境下使用List的话&#xff0c;需要使用Vector 或者CopyOnWriteArrayList&#xff0c;具体场景&#xff0c;自行深入了解。 扩容算法 // minCapacity 为需要的最小容量 private…

为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件

http://blog.csdn.net/morixinguan/article/details/77808088 上节&#xff0c;我们明白了proc文件系统的作用&#xff0c;接下来我们在友善之臂已经写好的led驱动的基础上&#xff0c;在proc目录下创建一个文件夹&#xff0c;然后加入led驱动的版本信息读取。 我们在init函数的…

java audiorecord_Android 录音实现(AudioRecord)

上一篇文章介绍了使用 MediaRecorder 实现录音功能 Android录音实现(MediaRecorder) &#xff0c;下面我们继续看看使用 AudioRecord 实现录音功能。AudioRecord首先看看Android帮助文档中对该类的简单概述: AndioRecord 类的主要功能是让各种 Java 应用能够管理音频资源&#…

SqlServer中的数据类型UniqueIdentifier

SqlServer中的数据类型UniqueIdentifier究竟是什么东东&#xff1f;该类型一般用来做为主键使用&#xff0c;可用SQL语法的newid()来生成一个唯一的值。我想请问的是&#xff0c;这个值是一个长整型的数据值呢&#xff0c;还是个其他的什么值&#xff1f;我在程序中该怎样去控制…

《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书

这书适合我。 哈哈&#xff0c;结合 以前的知识点&#xff0c;勉强能看懂。 讲得细&#xff0c;还可以参照着弄出来。 希望能坚持 完成啦。。。 原来&#xff0c;JSTL就类似于DJANGO中的模板。 而servlet类中的res,req&#xff0c;玩了DJANGO就觉得好熟悉啦。。。&#xff1a;&…

java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...

一、背景最近&#xff0c;小哈主要在负责日志中台的开发工作, 等等&#xff0c;啥是日志中台&#xff1f;俺只知道中台概念&#xff0c;这段时间的确很火&#xff0c;但是日志中台又是用来干啥的&#xff1f;这里小哈尽量地通俗的说下日志中台的职责&#xff0c;再说日志中台之…

脚本安装smokeping

我将提供两种方法来安装smokeping&#xff0c;一种是大家常用的普通安装&#xff0c;另一种是用脚本下自动化安装的&#xff0c;仅供大家学习&#xff0c;参考!普通安装&#xff1a;centos 5.4下安装smokeping需要的软件:(1)httpd(2)rrdtool(3)smokeping(4)fping(5)libwww-perl…

强烈推荐:Android史上最强大的自定义任务软件Tasker

强烈推荐&#xff1a;Android史上最强大的自定义任务软件Taskerhttp://bbs.mumayi.com/thread-28387-1-1.html(出处: 木蚂蚁手机乐园) Android上的Tasker绝对称得上是Android系统的神器之一&#xff0c;与Auto Memory Manager不同&#xff0c;Tasker不是加速型的软件&#xff0…

配置文件*.xml中 classpath: 与 classpath*: 的区别

首先classpath 指的是WEB-INF下面的classes目录&#xff0c;所有src目录下面的java、xml、properties等文件编译后都会在此,classes在eclipse的项目目录下是看不到的&#xff0c;它存在于部署在服务器上的项目目录WEB-INF下 classpath:指的是第一个classpath路径&#xff0c;也…

原型模式 java 深浅_JAVA设计模式---原型模式--浅客隆和深克隆

JAVA浅克隆和深克隆浅克隆&#xff1a;被复制对象的所有变量和原来相同&#xff0c;而所有的对其他对象的引用仍指向原对象。即如果复制的对象修改复制对象的变量&#xff0c;原对象不会改变。而修改引用的对象&#xff0c;二者均会发生改变。深复制(克隆)&#xff1a;被复制对…

SocketErrorCode:10022

在编写.net的网络服务器时&#xff0c;我使用了裸socket来实现。在windows上&#xff0c;或者在linux上通过.net core来跑时都没有什么问题&#xff0c;但是通过mono运行调用socket.Bind()时却总是报ErrorCode为10022的SocketException&#xff0c;表示参数无效。通过命令netst…

request.RequestContextListener

由于是使用spring mvc来做项目&#xff0c;因此脱离了HttpServletRequest作为参数&#xff0c;不能够直接使用request&#xff0c;要想使用request可以使用下面的方法&#xff1a; 在web点xml中配置一个监听 [html] view plaincopyprint?<listener> <listen…

poj1741 Tree 点分治

入门题&#xff0c;算是对树分治有了初步的理解吧。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<vector> #define REP(i,a,b) for(int ia;i<b;i) #define MS0(a) memset(…

深入理解 ajax_xhr 对象

2019独角兽企业重金招聘Python工程师标准>>> ajax技术的核心是XMLHttpRequest对象(简称XHR)&#xff0c;这是由微软首先引入的一个特性&#xff0c;其他浏览器提供商后来都提供了相同的实现。 IE5是第一款引入XHR对象的浏览器。在IE5中&#xff0c;XHR对象是通过MSX…

POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...

题意&#xff1a;给出一个多边形和一个圆&#xff0c;问是否是凸多边形&#xff0c;若是则再问圆是否在凸多边形内部。 分3步&#xff1a; 1、判断是否是凸多边形 2、判断点是否在多边形内部 3、判断点到各边的距离是否大于等于半径 上代码&#xff1a; #include <iostream&…

组函数及分组统计

分组函数 SQL中经常使用的分组函数 Count(): 计数 Max()&#xff1a;求最大值 Min()&#xff1a;求最小值 Avg()&#xff1a;求平均值 Sum()&#xff1a;求和 -- 统计emp表中的人数 select count(*) from emp; -- 统计获得奖金的人数 select count(comm) from emp;-- 求全部雇…

java数据生成excel_Java 数据库数据生成Excel

采用jxl.jar生成Excel项目开发注意事项&#xff1a; 1:导入从网上下载的jar包&#xff1a;mail.jar 和 activation.jar2:删掉C:\Program Files\MyEclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\EE_5 下 javaee.jar中的java…

两张神图介绍python3和 2.x与 3.x 的区别

有感与第一张图, 做了第二张图.转载于:https://www.cnblogs.com/Vito2008/p/5280393.html

Java-jdbc连接数据库

1、Oracle8/8i/9i数据库&#xff08;thin模式&#xff09; Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url"jdbc:oracle:thin:localhost:1521:orcl"; //orcl为数据库的SID String user"test"; String…