目录
什么是数据结构?什么是算法?
数据对象在计算机中的组织方式,数据对象与一系列加在其上的操作相关联,完成这些操作所用的方法就是算法
什么是时间复杂度
时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。
一、循环和递归
public class Test1 {
public static void main(String[] args) {
// 顺序打印从1到N的正整数
System.out.println("请输入N:");
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
Long start = System.currentTimeMillis();
printN1(N);
Long end = System.currentTimeMillis();
System.out.println("总共耗时:"+(end-start)+"ms");
}
public static void printN(int N){
for (int i = 1; i <= N; i++) {
System.out.println(i);
}
}
public static void printN1(int N){
if (N>0){
System.out.println(N--);
printN1(N);
}
}
}
当N=100000,调用 printN 方法正常输出,当调用递归方法 printN1时会发生异常
88580
88579
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:691)
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)
异常解析:StackOverflowError 是一个java中常出现的错误:在jvm运行时的数据区域中有一个java虚拟机栈,当执行java方法时会进行压栈弹栈的操作。在栈中会保存局部变量,操作数栈,方法出口等等。jvm规定了栈的最大深度,当执行时栈的深度大于了规定的深度,就会抛出StackOverflowError错误。
二、什么是线性表
由同类型的数据元素构成有序序列的线性结构
1、表中元素个数称为线性表的长度
2、线性表没有元素时称为空表
3、表起始位置称为表头,表结束位置称表尾
三、线性表的抽象数据类型描述
类型名称:线性表
数据对象集:n 个元素构成的有序序列
操作集:线性表的基本操作
四、线性表查找
长度为 n 的线性表,从下标 0 到 n-1 顺序查找,最好的结果是1次,最差的结果是 n 次,平均次数 (n+1)/ 2 次,平均时间性能 O(n)
五、线性表插入
在第 i 个位置插入元素 x ,将 下标 i 及其以后的元素往后移动,移动顺序则是从下标 n-1 到 i,不能从前向后移动
执行过程:1、检查表空间是否已满 2、插入位置是否合理 3、倒序移动 4、新元素插入 5、指针指向最后的元素
整个算法的时间复杂度都在for循环倒序移动里面,平均移动次数 n/2,平均时间复杂度 O(n)
六、线性表删除
删除第i个元素,判断删除位置的合法性,依照下标 i 到 n-1的顺序向前移动,平均移动次数 (n-1)/ 2 ,时间复杂度O(n)
七、线性表的链式存储实现
通过“链”建立起数据元素之间的逻辑关系,逻辑上相邻的两个元素不要求物理上也相邻,数组要求逻辑和物理上都相邻
对于插入和删除,不需要移动数据元素,只需要修改“链”
1、求表长
时间复杂度为 O(n)
2、查找
根据序号查找;根据值查找 时间复杂度为 O(n)
3、插入
在第 i-1 个节点后面插入一个值为 X 的新结点
(1)先构造一个新节点,用s 指向
(2)再找到第 i-1 个节点用 p 指向
(3)修改指针,插入节点,s.next=p.next,然后 p.next=s,顺序不能颠倒
4、删除
删除第 i 个位置的结点
(1)先找到第 i-1 个位置的结点,用 p 指向
(2)找到第 i 个位置的结点,用 s 指向,s=p.next
(3)修改指针,删除结点,p.next=s.next,释放结点内存
八、广义表
1、广义表是线性表的推广
2、对于线性表而言,n个元素都是基本的单元素
3、广义表中,这些元素不仅可以是单元素,也可以是其它广义表
九、多重链表
链表中的结点可能同时隶属于多个链
1、多重链表中的结点,其指针域会有多个
2、包含2个指针域的链表不一定是多重链表,比如双向链表就不是多重链表
多重链表可以实现复杂的数据结构,如树、图等
矩阵可以用二维数组表示,有两个缺点
1、数组大小需要提前确定
2、稀疏数组造成大量的存储空间浪费