数据结构(2.1)-线性表的顺序表示
来源:互联网 发布:android网络电话源码 编辑:程序博客网 时间:2024/06/05 22:31
顺序表使用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。线性表中元素的位序是从1开始的。
特点:
1. 具有随机访问的特性,即通过首地址和元素序号可以在O(1)时间内找到指定元素。
2. 元素存储密度高,每个节点只存储数据元素。
3. 逻辑上相邻的元素物理上也相邻,因此,插入和删除操作需要移动大量元素。
时间复杂度:
- 插入操作:
最好情况–在表尾插入O(1)
最坏情况–在表头插入O(n)
平均情况–O(n) - 删除操作:
最好情况–在表尾删除O(1)
最坏情况–删除表头元素O(n)
平均情况–O(n) - 查找操作:
索引查找–O(1)
按值查找–最好情况,查找元素就在表头O(1)
最坏情况,查找元素在表尾O(n)
平均情况O(n)
顺序表的Java实现:
接口部分:
/** * @author zfr * */public interface ISeqList<T> { /** * 判断线性表是否为空 * @return */ boolean isEmpty(); /** * 返回线性表的长度 * @return */ int length(); /** * 返回第i(i>=0)个元素 * @param i * @return */ T get(int i); /** * 设置第i个元素的值 * @param i * @param x */ void set(int i,T x); /** * 插入x作为第i个元素 * @param i * @param x */ void insert(int i,T x); /** * 在线性表尾部添加元素x * @param x */ void append(T x); /** * 删除第i个元素,并返回该元素的值 * @param i * @return */ T remove(int i); /** * 删除所有元素 */ void removeAll(); /** * 查找并返回首次出现元素key的位置 * @param key * @return */ int search(T key); /** * 打印线性表 */ void print();}
实现部分:
package 线性表;public class SeqList<T> implements ISeqList<T> { /** * 成员变量 表示表的长度 */ protected int length; /** * 成员变量,对象数组 */ protected Object[] data; /** * 默认构造函数,创建默认容量的空表 */ public SeqList() { // TODO Auto-generated constructor stub this(20); } /** * 构造方法,创建容量为size的表 * @param size */ public SeqList(int size) { // TODO Auto-generated constructor stub this.data=new Object[size];//创建长度为size的数组 this.length = 0;//初始长度为0 } /** * 判断是否为空表 */ @Override public boolean isEmpty() { // TODO Auto-generated method stub return this.length==0; } /** * 返回表的长度 */ @Override public int length() { // TODO Auto-generated method stub return length; } /** * 返回表中第i个元素的值 */ @SuppressWarnings("unchecked") @Override public T get(int i) { // TODO Auto-generated method stub if(i>=0 && i<length) return (T) data[i]; return null; } /** * 设置第i个元素的值为x */ @Override public void set(int i, T x) { // TODO Auto-generated method stub if(x==null) return ; if(i>=0 && i<length) data[i] = x; else throw new IndexOutOfBoundsException(i+"");//抛出越界异常 } /** * 在第i个位置插入元素x */ @Override public void insert(int i, T x) { // TODO Auto-generated method stub if(x==null) return; //数组已满 需要扩容 if(data.length==length){ Object[] temp = this.data; this.data=new Object[length*20]; for(int j=0;j<length;j++){ this.data[j]=temp[j]; } } //下标容错 if(i<0) i=0; if(i>this.length) i=this.length; //元素后移 for(int j=this.length;j>i;j--){ this.data[j]=this.data[j-1]; } //为第i个位置赋值 this.data[i]=x; length++; } /** * 在末尾加入元素x */ @Override public void append(T x) { // TODO Auto-generated method stub insert(this.length,x); } /** * 删除第i个位置的元素 */ @Override public T remove(int i) { // TODO Auto-generated method stub if(this.length==0||i<0||i>=this.length) return null; //记录该位置为元素 T old = (T) this.data[i]; for(int j=i;j<length-1;j++){ this.data[j]=this.data[j+1]; } this.length--; return old; } /** * 删除所有元素 */ @Override public void removeAll() { // TODO Auto-generated method stub this.length=0; } /** * 查找元素key第一次出现的位置 */ @Override public int search(T key) { // TODO Auto-generated method stub for(int i=0;i<length;i++) { if(this.data[i].equals(key)) return i; } return -1; } /** * 打印顺序表 */ @Override public void print() { // TODO Auto-generated method stub for(int i=0;i<length;i++){ System.out.print(this.data[i]+" "); } System.out.println(); } /** * 比较两个顺序表是否相等 */ @Override public boolean equals(Object obj) { // TODO Auto-generated method stub return super.equals(obj); } /** * 将顺序表转换为字符串 */ @Override public String toString() { // TODO Auto-generated method stub String str=""; if(this.length>0) str+=this.data[0].toString(); for(int i=1;i<this.length;i++) str+=","+this.data[i].toString(); return str; }}
阅读全文
0 0
- 数据结构(2.1)-线性表的顺序表示
- 数据结构--线性表的顺序表示(顺序表)
- 数据结构应用题线性表的顺序表示
- 数据结构复习-线性表的顺序表示
- 《数据结构》进行曲(之一)---线性表的顺序表示
- 数据结构--线性表的顺序表示(1~5)
- 数据结构--线性表的顺序表示(6~10)
- 数据结构(线性表):线性表的顺序表示
- 数据结构之:线性表的顺序表示和实现
- C语言 数据结构 线性表的顺序表示
- 线性表的顺序表示和实现 - 数据结构
- 数据结构与算法(二)线性表的顺序表示
- 重温数据结构-线性表的顺序表示与实现
- 数据结构1:线性表的顺序表示和实现
- 数据结构之线性表的顺序表示和实现
- 【数据结构】-线性表的顺序表示和实现
- 线性表的顺序表示和实现(数据结构)
- 数据结构(1):线性表的顺序表示和实现
- SSL P2722 提高组第一式 A
- Linux IO模型及POSIX aio介绍
- jvm加载类的过程
- 判断页面打开的设备与操作系统
- A33上AP6210 ap和sta无法自由切换的问题
- 数据结构(2.1)-线性表的顺序表示
- Cannot use identity columnkey generation
- 聊聊JVM的年轻代
- Kryo:快速、高效的序列化框架
- Springboot配置https访问
- dpdk学习之ip_pipeline源代码分析
- hadoop streaming参数整理
- SpringSecurity4最小化配置
- Linux(CentOS)下安装JDK