什么是顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

在使用顺序表存储数据前,会先申请一段连续的内存空间(即数组),然后把数组依次存入内存,中间没有一点空隙。

基本操作

每个数据结构都有集合对数据处理的方法,这能让我们更方便的使用保存在数据结构中的数据。顺序表的基本操作有:增(add),删(remove),改(set),查(find),插(insert)等。

在这里我们只详细讲解remove 和 insert 操作,其他实现可看下面的源码。

顺序表删除元素

从顺序表中删除指定元素,实现起来非常简单,只需找到目标元素,并将其后续所有元素整体前移 1 个位置即可。

后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的。

例如:从顺序表{1,2,3,4,5}中删除元素3的过程如下

时间复杂度分析:从顺序表中删除元素,最好的情况是删除的元素刚好是最后一个元素,这时候不需要移动元素,只需要把顺序表的size-1即可,时间复杂度是O(1)。最坏的情况是删除的元素刚好是第一个元素,这个时候就需要后面的元素全部向前移动一位,同时size-1,时间复杂度是O(N)。我们分析时间复杂度的原则是分析最坏情况,这样才有意义。因此删除操作的时间复杂度为O(N)。

顺序表插入元素

向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况:

  1. 插入到顺序表的表头;
  2. 在表的中间位置插入元素;
  3. 尾随顺序表中已有元素,作为顺序表中的最后一个元素;

虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素要插入的位置,然后做如下两步工作:

  • 将要插入位置元素以及后续的元素整体向后移动一个位置;
  • 将元素放到腾出来的位置上;

例如,在 {1,2,3,4,5} 的第 3 个位置上插入元素 6,实现过程如下:

时间复杂度分析同删除元素一样,均为O(N).

顺序表的优劣和应用情形

优势
  • 因为数据在数组中按顺序存储,可以通过数组下标直接访问,因此顺序表查找定位元素很快
劣势
  • 插入和删除元素需要大量的操作
  • 因为数组在声明时需要确定长度,因此顺序表的长度是确定的。若需要扩大顺序表长度,有需要大量的操作,不够灵活。(将该数组copy到另外一个数组)
  • 由于数据大小的不可测性,有时会浪费掉大量的空间
应用情形
  • 总而言之,顺序表适用于那些不需要对数据进行大量改动的结构

源码实现(java)

public class MyArrayList<AnyType> {
public int AMOUNT=10;//初始长度
public static int index;//表位置
AnyType[] myList;
public MyArrayList(){
initList();
} //初始化顺序表
public void initList(){
myList=(AnyType[])new Object[AMOUNT];
index=0;
} //判断顺序表是否为空
public boolean listEmpty(){
if(index==0){
return true;
}
return true;
} //清空顺序表
public boolean clearList(){
myList=null;
index=0;
return true;
} //返回i位置的元素
public AnyType get(int i){
if(i<0||i>=index){
throw new ArrayIndexOutOfBoundsException();
}
return myList[i];
} //在i位置加入元素,即插入操作,这里我没有用insert命名
public void add(int i,AnyType a){
if(i<0||i>index){
throw new ArrayIndexOutOfBoundsException();
}
if (i==index){
largeList();
}
for(int k=index;k>i;k--){
myList[k]=myList[k-1];
}
myList[i]=a;
index++;
} //在结尾增添元素a
public void add(AnyType a){
add(index,a);
} //为i位置元素重新赋值
public AnyType set(AnyType a,int i){
if(i<0||i>=index){
throw new ArrayIndexOutOfBoundsException();
}
AnyType old=myList[i];
myList[i]=a;
return old;
} //打印遍历顺序表
public void print(){
String s="[";
for(int i=0;i<index;i++){
s=s+myList[i];
s=s+" ,";
}
System.out.println(s);
} //查找a元素是否在表中,返回位置,没有返回0
public int locateElem(AnyType a){
for(int i=0;i<index;i++){
if(a==myList[i]){
return i+1;
}
}
return 0;
} //返回表长
public int length(){
return index;
} //删除i位置元素
public AnyType delete(int i){
if(i<0||i>=index){
throw new ArrayIndexOutOfBoundsException();
}
AnyType old=myList[i];
for(int k=i;k<index;k++){
myList[k]=myList[k+1];
}
index--;
return old;
} //扩大表的最大长度
public void largeList(){
AnyType[] newList=(AnyType[])new Object[2*length()+1];
for(int i=0;i<index;i++){
newList[i]=myList[i];
}
myList=newList;
} }

(java实现)顺序表-ArrayList的更多相关文章

  1. java实现顺序表、链表、栈 (x)->{持续更新}

    1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...

  2. 数据结构之线性顺序表ArrayList(Java实现)

    一.ListMe接口: import java.util.ArrayList; //实现线性表(顺序表和链表)的接口://提供add get isEmpty size 功能public interfa ...

  3. Java数据结构-线性表之顺序表ArrayList

    线性表的顺序存储结构.也称为顺序表.指用一段连续的存储单元依次存储线性表中的数据元素. 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表. package com ...

  4. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  5. Java实现顺序表

    利用顺序存储结构表示的顺序表称为顺序表. 它用一组连续的地址存储单元一次存放线性表中的数据元素. 顺序表的实现是数据结构中最简单的一种. 由于代码中已经有详细注释,代码外不再阐述. 下次再陈上关于顺序 ...

  6. 三 模拟实现顺序表ArrayList

    /** * 顺序表,重点是数组动态扩容,插入 * 底层采用数组,长度可以动态变化,此处采用增长一倍 *  java.util.ArrayList每次增长50% *  int newCapacity = ...

  7. 数据结构——Java实现顺序表

    一.分析 什么是顺序表?顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表.一个标准的顺序表需要实现以下基本操作: 1.初始化顺序表 ...

  8. Java数据结构——顺序表

    一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...

  9. Java算法 -- 顺序表

    顺序表结构定义:就是按照顺序存储方式存储的线性表 1.定义一个顺序表的基本数据: static final int MAXLEN = 100; Class Student{ private Strin ...

随机推荐

  1. ZOJ3435

    题意略. 思路: 将每一个点的坐标 (x,y,z) 与 (1,1,1) 相减,得到向量 (x - 1,y - 1,z - 1) 我们实际上就是要求出 这样互质的三元组有多少对就行了. 我们把这个长方体 ...

  2. Leetcode之二分法专题-441. 排列硬币(Arranging Coins)

    Leetcode之二分法专题-441. 排列硬币(Arranging Coins) 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形 ...

  3. nsq源码分析

    nsq的源码比较简单,值得一读,特别是golang开发人员,下面重点介绍nsqd,看完这篇文章希望你能对消息队列的原理和实现有一定的了解. nsqd是一个守护进程,负责接收,排队,投递消息给客户端,并 ...

  4. HDU 4607 Park Visit 树的最大直径

    题意: 莱克尔和她的朋友到公园玩,公园很大也很漂亮.公园包含n个景点通过n-1条边相连.克莱尔太累了,所以不能去参观所有点景点. 经过深思熟虑,她决定只访问其中的k个景点.她拿出地图发现所有景点的入口 ...

  5. atcoder D - 11(组合数学)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_b 题解:有n+1个数只有一个数字是有重复出现的,要求一共有多少不同的组合显然和这两个数的位置有关 ...

  6. hdu 6435 CSGO

    题意:现在有n个主武器, m个副武器, 你要选择1个主武器,1个副武器, 使得 题目给定的那个式子最大. 题解:这个题目困难的地方就在于有绝对值,| a - b | 我们将绝对值去掉之后 他的值就为 ...

  7. 疯狂的bLue

    疯狂的bLue Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 众所周知神秘的 ACM 实验 ...

  8. c++11特性学习总结

    ubuntu 16.04 自带gcc 5.4 支持c++11 ubuntu 18.04 自带gcc 7.3 支持c++14 查看编译器支持: c++11 c++14 c++17 c++11 featu ...

  9. 一个简单的hibernate自动创建表

    导入关键jar 举炉石传说卡片说明,Card.java   Card.hbm.xml Card.java Card.hbm.xml <?xml version="1.0"?& ...

  10. 技术漫谈 | 远程访问和控制云端K8S服务器的方法

    对于部署在云端的K8S容器编排系统,可以先通过SSH远程登录到K8S所在主机,然后运行kubectl命令工具来控制K8S服务系统.然而,先SSH登录才能远程访问的二阶段方式,对于使用Linux桌面或者 ...