上一篇:JAVA类和对象
顺序表和列表的学习 数据结构+算法
算法效率: 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被 称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额 外空间,
时间复杂度: 大概的时间 ,代码当中基本语句的执行次数 ,用大O渐进法表示法 空间复杂度: 空间复杂度是对一个算法在运行过程中临时占用额外的存储空间大小的量度也使用大O渐进表示法
大O渐近法: N:问题的规模 1、保留最高阶项 2、去掉最高项系数 3、用常数1取代运行时间中的所有加法常数。即100 为1
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见 的线性表:顺序表、链表、栈、队列、字符串
那么如何学好数据结构??? 多写代码+画图!!!逻辑思路很重要!
顺序表是依靠数组所实现的一种数据结构
如何知道顺序表里的元素个数呢? 每个顺序表都有一个usedsize来记录顺序表里的有效个数,即你放一个元素进去,usedsize++一下。
注意: 1、静态的方法能不能访问实例成员变量? 答:不能,静态的不依赖于对象 2、 1). 顺序表中间/头部的插入删除,时间复杂度为O(N) 2). 增容需要申请新空间,一般是呈2倍的增长 3).顺序表:物理上连续逻辑上也连续的空间
Class 顺序表 { 成员属性 成员方法 }
接口实现: 实现一个动态顺序表. 以下是需要支持的接口
import java.util.Arrays; //顺序表 public class MyArrayList { //属性 public int [] elem; public int usedSize; private final int CAPACITY = 5; public MyArrayList() { this.elem = new int[CAPACITY]; this.usedSize = 0; } //方法 // 打印顺序表 public void display() { for(int i = 0;i < this.usedSize;i++) { System.out.println(this.elem[i] + " "); } } private boolean isFull() { /* if(this.usedSize == the.elem.length) { return ture; } return false;*/ return this.usedSize == this.elem.length ; } // 在 pos 位置新增元素 public void add(int pos, int data) { if(isFull()) { //二倍扩容 this.elem = Arrays.copyOf( this.elem,this.elem.length*2); } if(pos < 0 || pos > this.usedSize) { System.out.println("该位置不合法"); return; } //挪数据 for(int i = this.usedSize - 1;i >= pos;i--) { this.elem[i+1] = this.elem[i]; } this.elem[pos] = data; this.usedSize++; } // 判定是否包含某个元素 public boolean contains(int toFind) { for(int i = 0;i < this.usedSize;i++) { if (this.elem[i] == toFind) { return true; } } return false; } // 查找某个元素对应的位置 public int search(int toFind) { for(int i = 0;i < this.usedSize;i++) { if (this.elem[i] == toFind) { return i; } } return -1; } // 获取 pos 位置的元素 public int getPos(int pos) { if(pos < 0 || pos >= this.usedSize) { System.out.println("pos位置不合法"); return -1; //代表没有pos位置 } return this.elem[pos]; } // 给 pos 位置的元素设为 value public void setPos(int pos, int value) { } //删除第一次出现的关键字key public void remove(int toRemove) { int index = search(toRemove); if(index == -1) { System.out.println("找不到要删除的数字"); return; } for(int i = index;i < this.usedSize-1;i++) { this.elem[i] = this.elem[i+1]; } this.usedSize--; } // 获取顺序表长度 public int size() { return this.usedSize; } // 清空顺序表 public void clear() { this.usedSize = 0; } }最后演示如下:
运行结果为:
下一篇:不带头结点的单链表的实现