K:线性表的实现—顺序表
所谓顺序表,就是顺序存储的线性表。顺序存储就是用一组地址连续的存储单元依次存放线性表中各个数据元素的存储结构。
线性表中所有数据元素的类型是相同的,所以每一个数据元素在存储器中占用相同的大小的空间。假设每一个数据元素占b个存储单元,且a0(即线性表中的第一个数据元素)的存储地址为Loc(a0)(此地址也称为线性表的基地址),则第i个数据元素的地址可表示为:
Loc(ai)=Loc(a0)+i*b 其中0<=i&&i<=n-1
从以上可知,只要顺序表的基地址和每一个数据元素所占的存储空间的大小,就可以计算出第i个数据元素的地址,即顺序表具有按数据元素的位序号随机存取的特点。
顺序表的特点:
线性表中逻辑上响铃的数据元素,在物理存储位置上也是相邻的
存储密度高,但需要预先分配“足够应用”的存储空间(也就是够用的存储空间),这可能将会造成存储空间的浪费;其中,存储密度=数据元素本身值所需的存储空间/该数据元素实际所占用的空间
便于随机存取
不便于插入和删除操作,这是因为在顺序表上进行插入和删除操作会引起大量的数据元素的移动
因为数组也具有随机存取的特点。为此,一般,顺序表采用数组来进行实现
顺序表的实现代码:
public class ArrayList<T> implements List<T>
{
private Object[] listElem;//顺序表的存储空间
private int curLen;//顺序表当前长度
public ArrayList(int maxSize)
{
this.listElem=new Object[maxSize];
this.curLen=0;
}
public void clear()//清空
{
this.curLen=0;
}
public boolean isEmpty()//判空
{
return this.curLen==0;
}
public int length()//求长度
{
return this.curLen;
}
public T get(int i)throws Exception//按位查找(在查找前判断位置是否合法),时间复杂度为O(1)
{
if(i<0||i>this.curLen-1)
throw new Exception(“查找的位置不合法”);
return (T)this.listElem[i];
}
public int indexOf(T x)//按值查找,时间复杂度为O(n)
{
int j=0;
while(j<this.curLen&&!((T)this.listElem[j]).equals(x))
j++;
if(j<this.curLen)
return j;
else
return -1;
}
public void insert(int i,T x)throws Exception//插入,时间复杂度为O(n)
{
if(this.curLen==listElem.length)//判断其否无法再加入元素
throw new Exception(“顺序表已满”);
if(i<0||i>this.curLen)
throw new Exception(“插入位置不合法”);
for(int j=this.curLen;j>i;j--)//将后面的元素往后移动
{
listElem[j]=listElem[j-1];
}
listElem[i]=x;
this.curLen++;
}
public void remove(int i)throws Exception//删除操作,时间复杂度为O(n)
{
//if(isEmpty())
//throw new Exception(“顺序表为空”);
if(i<0||i>this.curLen-1)
{
throw new Exception(“删除位置不合法”);
}
for(int j=i;j<this.curLen-1;j++)
listElem[j]=listElem[j+1];
this.curLen--;
}
}
从以上的实现中可以看出,对于顺序表而言,其插入,删除,以及按值查找的操作的时间复杂度为O(n),从而可知,顺序表有如下局限性:
若要将线性表扩充存储空间,则需要重新创建一个地址连续的更大的存储空间,并把所有的数据元素都复制到新的存储空间中;
因为顺序存储要求逻辑上相邻的数据元素,在物理存储位置上也是要相邻的,这就使得要增删数据元素则会引起平均约一半的数据元素的移动。
为此,顺序表较适合表示“静态”的线性表,即线性表一旦形成之后,就很少进行插入和删除操作。对于需要频繁执行插入和删除操作的“动态”线性表,通常采用链式存储结构。
K:线性表的实现—顺序表的更多相关文章
- PHP数据结构之二 线性表中的顺序表的PHP实现
线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...
- 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】
本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...
- c++实现线性表中的顺序表(数据结构课程作业)
一.题目简介 实现顺序表的创建.初始化.赋值.插入.删除.按数据查找元素位置.按元素位置查找数据.清空.删除 的操作,以上操作用可用菜单选项完成 二.源程序代码 #include<iostrea ...
- 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表
一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...
- 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表
在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...
- 数据结构:队列 链表,顺序表和循环顺序表实现(python版)
链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...
- 线性表之顺序表(C语言实现)
线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一 ...
- 【数据结构】线性表&&顺序表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 预备知识 1.0 什么是线性表? 线性表(List)是零个或者多个数据元素的有限序列. 首先它是一个序列.里面的元素是有顺 ...
- 线性表——顺序表的实现与讲解(C++描述)
线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...
随机推荐
- AngularJS源码解析2:注入器的详解
上一课,没有讲createInjector方法,只是讲了它的主要作用,这一课,详细来讲一下这个方法.此方法,最终返回的注册器实例对象有以下几个方法: invoke, instantiate, get, ...
- angular核心原理解析2:注入器的创建和使用
上一课没有讲到创建注入器的方法createInjector. 此方法,会创建两种不同的注入器:第一种叫做providerInjector,第二种叫做instanceInjector.providerI ...
- iOS中文本属性Attributes
NSFontAttributeName //设置字体大小 NSParagraphStyleAttributeName //设置段落格式 NSForegroundColorAttributeName / ...
- 【2】JMicro微服务-Hello World
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. 首先完成 JMicro微服务-RPC体验 的1到5步. 按默认方式启动ZK及Redis: JDK需要Java8及以上. ...
- 关于Hibernate的一个简单小程序
本人根据视频学习了一下三大框架中比较简单的一个Hibernate,并简单完成了一个运用Hibernate的小程序 Hibernate是一个简化web程序Dao层的一个框架,应用他,可以完全脱离sql语 ...
- C#-WinForm-TextBox中只能输入数字的几种常用方法(C#)
方法一: private void tBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 0x20) e.KeyCh ...
- (C/C++) FILE 讀寫檔案操作
在C/C++ 讀寫檔案操作比較常見應該是利用 FILE.ifstream.ofstream 在這篇筆記裡頭記錄 FILE.fstream 使用方法及操作 #include <iostream&g ...
- Codeforces Global Round 2 部分题解
F.Niyaz and Small Degrees 挺sb的一题,为什么比赛时只过了4个呢 考虑当\(x\)固定的时候怎么做.显然可以树形DP:设\(f_{u,i=0/1}\)表示只考虑\(u\)子树 ...
- Android各版本及API对应关系,持续更新!
以下是Android的各个版本与API的对应关系图标,便于查阅,会持续更新 API等级 Android版本号 Android版本名称 对应支持包 API等级1: Android 1.0 API ...
- [Xamarin.Android] 儲存資料於Windows Azure (转帖)
在準備討論Xamarin.Android 如何整合GCM與Windows Azure來實作Push Notification之前, 先來了解如何將Xamarin.Android 與Windows Az ...