<1>线性表
线性表,顾名思义,其组成元素间具有线性关系的一种结构。
(Ps:两个变量之间存在一次函数关系,就称它们之间存在线性关系。。。更通俗一点讲,如果把这两个变量分别作为点的横坐标与纵坐标,其图象是平面上的一条直线,则这两个变量之间的关系就是线性关系。)
线性表(Linear List)是由n个类型相同的数据元素组成的有限序列,即:
LinearList=(a0,a1,···,an-1)
其接口LList声明如下,描述线性表的取值、置值、插入、删除等操作。
public interface LList<E>{ //线性表接口 boolean isEmpty(); //判断线性表是否为空 int length(); //返回线性表长度 E get(int index); //返回序号为index的对象,index的初值为0 E set(int index,E element);//设置序号为index的对象为element,返回原对象 boolean add(E element); //插入element对象,未指定位置 E remove(int index); //移除序号为index的对象,返回被移除的对象 void clear(); //清空线性表 }
线性表有顺序存储和链式存储两种结构:
public class SeqList<E> implements LList<E> //顺序表类 public class SinglyLinkedList<E> implements LList<E> //单链表类
LList接口中的方法在顺序表类和链表类中表现出多态性
<2>线性表的顺序实现
顺序存储意味着物理存储次序(一组连续内存中的位置)与逻辑次序(直接前驱与直接后继)相同。
设每个元素占用c个字节,a0的存储位置为Loc(a0),则ai的存储位置为
Loc(ai)=Loc(a0)+i*c
计算一个元素地址所需时间是一个常量,因此存取任何一个元素的时间复杂度是O(1),故顺序表示一种随机存取结构。
(数组是顺序存储的随机存取结构,在程序设计语言中,数组已被实现为一种构造数据类型。数组一旦占用一片存储空间,这片存储空间的地址和长度就是确定的,不能更改。数组只能进行赋值、取值两种随机存储操作,不能进行插入、删除操作。)
顺序表类:
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); //构造方法的重载,指定空表的默认容量 } @Override public boolean isEmpty() { //判断顺序表是否为空,若空返回true return this.n==0; } @Override public int length() { return this.n; //返回顺序表的长度 } //返回index(初值为0)位置的对象,若序号无效,然会null @Override public E get(int index) { if(index>=0&&index<this.n) return (E)this.table[index]; return null; } //设置index位置的对象为element,若操作成功,返回原对象,否则返回null @Override public E set(int index, E element) { if(index>=0&&index<this.n&&element!=null){ E old=(E)this.table[index]; //改变引用即可 this.table[index]=element; return old; } return null; } //在index位置插入element对象,若操作成功返回true,不能插入null public boolean add(int index,E element) { if(element==null) //不能插入null return false; if(this.n==this.table.length){ //若数组满,则需要扩充顺序表容量 Object[] temp=this.table; this.table=new Object[temp.length*2];//重新申请容量更大的一个数组 for(int i=0;i<temp.length;i++){ //复制数组元素,O(n) 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; } //在顺序表最后插入element对象 @Override public boolean add(E element){ return add(this.n,element); } //移除index位置的对象,若操作成功,则返回被移除去对象,否则返回null @Override public E remove(int index) { 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; } @Override public void clear() { //清空顺序表 if(this.n!=0){ for(int i=0;i<n;i++) this.table[i]=null; this.n=0; } } }
顺序表操作效率分析:
随机存取,因此存取任何一个元素的get()、set()方法的时间复杂度都是O(1)
对于插入、删除来说,所花费的时间主要用在移动元素上
设在第i个位置插入元素的概率为pi,则插入一个元素的平均移动次数为
如果在各位置插入元素的概率相同,即p0=p1=····=pn=1/(n+1),则有
换言之,在等概率情况下,插入一个元素平均需要移动一半的元素,时间复杂度为O(n),同理,删除一个元素的时间复杂度亦为O(n)。
相关推荐
### 数据结构C++ 线性表——顺序表和单链表基本操作 #### 一、概述 在《数据结构C++ 线性表——顺序表和单链表基本操作(含代码和注释).docx》文档中,作者详细介绍了如何在C++中实现顺序表和单链表的基本操作,并...
线性表——顺序表PPT学习教案 线性表是一种典型的线性结构,其基本特点是线性表中的数据元素是有序且是有限的。线性表可以分为顺序表和链表两种存储结构,今天我们主要讨论顺序表。 1. 线性表的定义 线性表是具有...
线性表作为数据结构的一种,是最基本的抽象数据类型之一,它由一系列相同类型的元素按照特定顺序排列组成。本话题我们将深入探讨线性表在实现一元稀疏多项式计算器中的应用。 一元稀疏多项式,顾名思义,是一系列...
数据结构之线性表(三)——顺序存储结构(1定义与特点) 数据结构之线性表的顺序存储结构是指将逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。这种存储结构的特点是地址连续,即知道某个元素的...
另外还实现了简单单链表、简单顺序线性表、从A链表中删除B和C链表共有的元素、单链表逆置(以整数为例)、将链表中元素按递增排序并删除所选定范围内的元素、求一个新的集合A为A和B的交集(采用单链表作为存储结构)...
链表的操作,如插入和删除,通常比顺序存储的线性表更灵活,因为它们主要涉及到节点之间的指针修改,而不需要像顺序表那样移动大量元素。然而,这也意味着链表的访问速度可能较慢,因为必须从头节点开始遍历,寻找...
数据结构算法代码实现——线性表的顺序表示与实现(二)定义线性表节点的结构 本资源主要介绍了数据结构中线性表的顺序表示和实现,包括线性表的定义、顺序存储结构、基本操作等内容。 线性表的定义 线性表是一种...
在本资源中,我们主要关注的是使用C++编程语言实现严蔚敏教授在《数据结构》一书中提及的线性表——顺序表的算法。严蔚敏教授的这本书是计算机科学领域经典的数据结构教材,其内容广泛且深入,对学习和理解数据结构...
数据结构——线性表的基本操作 数据结构是计算机科学中...线性表的基本操作包括求顺序表的长度、清空操作、判断线性表是否为空、判断顺序表是否为满、附加操作、插入操作等,都是数据结构中最基础和最重要的操作之一。
数据结构实验一线性表的基本操作 一、线性表的概念和类型 线性表是一种基本的数据结构,它是一种由零个或多个元素组成的有限序列,每个元素都是数据类型的实例。线性表可以分为两种类型:顺序存储结构和链式存储...
数据结构第二章课件——线性表 本资源主要介绍了线性表的定义和抽象数据类型,线性表的顺序存储结构和链接存储结构,以及每种线性表操作在顺序存储结构和链接存储结构上的具体实现。 1. 线性表的定义和抽象数据...
《数据结构实验报告——线性表》探讨了在互联网领域中数据结构的基础应用,特别是针对线性表这一重要概念。线性表是一种基础的数据结构,它由有限个相同类型元素构成的有序序列。本实验报告详细阐述了如何利用C++...
顺序表是数据结构的一种,它按照元素的插入顺序进行存储。每个元素都有一个固定的位置,可以通过索引快速访问。与链表不同,顺序表的元素在物理上是连续的,这使得随机访问变得高效,但插入和删除操作可能需要移动...
根据提供的文档信息,我们可以深入探讨线性表的相关概念及其两种主要实现形式——顺序表与链表。 ### 线性表定义 线性表是一种基本的数据结构,它由一系列具有相同特性的数据元素组成,这些元素按照一定的顺序排列...
本课程旨在为初学者提供一个全面的数据结构与算法基础学习框架,重点介绍在计算机科学领域中非常重要的数据结构——线性表,并具体分析其中的顺序表实现。通过本课程的学习,学生将能够理解线性表的基本概念、顺序表...
数据结构——线性表分享 一、顺序存储结构 在数据结构中,顺序存储结构是一种常用的存储方式,它将线性表的每个元素存储在一块连续的存储空间中。这种存储方式的优点是可以快速访问任意一个元素,但缺点是插入或...
线性表是数据结构中最基础且重要的概念之一,它是由n(n≥0)个相同类型元素构成的有限序列。在线性表中,元素之间的逻辑关系是一对一的关系,即每个元素都有一个前驱元素和一个后继元素,只有第一个元素没有前驱,...
【线性表】是计算机科学中一种基础的数据结构,它是由相同类型元素构成的有限序列。线性表的顺序存储结构是指将...在实际工作中,程序员需要根据具体需求选择合适的数据结构,而线性表因其简单高效,常常是首选之一。