博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性表的顺序存储结构之顺序表类的实现_Java
阅读量:7012 次
发布时间:2019-06-28

本文共 4744 字,大约阅读时间需要 15 分钟。

在上一篇博文——线性表接口的实现_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
 implements LList
                 //顺序表类,实现线性表接口  {      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)。

 

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

 

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

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

转载地址:http://syqtl.baihongyu.com/

你可能感兴趣的文章
前端状态管理与有限状态机
查看>>
读Zepto源码之Data模块
查看>>
Redux助力美团点评前端进阶之路
查看>>
【闭包概念】关于闭包概念不同解读——你可以自己理解。
查看>>
More-iOS国际化一站式解决方案
查看>>
BCH一周年:从硬分叉到顺风顺水
查看>>
数据结构和算法面试题系列—排序算法之快速排序
查看>>
打破行业壁垒!阿里云OpenSearch开启个性化搜索里程碑
查看>>
面试官,你再问我 Bit Operation 试试?
查看>>
PSV 3.60 固化升级到 3.68 破解完全攻略
查看>>
Android 路由框架
查看>>
vue踩坑记- Cannot find module 'wrappy'
查看>>
【实操干货】KVM命令管理虚拟机与性能优化
查看>>
机器学习资料合计(一)
查看>>
webpack由浅入深——(webapck简易版)
查看>>
2 - 建立 Django 博客应用
查看>>
【iOS报错】“this class is not key value coding-compliant for the key userPhoneNum”给字典设置键值对的时候报错...
查看>>
UI技术总结--性能优化
查看>>
Android NDK JNI 开发之旅01 环境搭建入门篇
查看>>
Javascript之迭代器模式
查看>>