前言
一
但凡有数据“扎堆”的地方,就有数据结构结构的影子
但凡有数据结构的地方,脱离不了算法的折磨
二 学习数据结构的作用
1 程序 = 数据结构 + 算法
2 锻炼编程功底,提高编程思想
3 扩展思路,提高解决实际应用问题的能力
4 为将来的人工智能、大数据、云计算等领域奠定基础
三数据结构的主要作用
1 数据们之间的关系,将离散的数据规整划一
2 如何将这个关系具体实现并存储到计算机中
3 基于关系之上对数据的具体操作,增删查改等
4 数据结构的具体使用场景
第一章 数据结构概论
1 逻辑结构
是指数据元素之间的相互关系,是我们想象出来的,并没有实质性的将其存储在计算机中
1.1线性结构:线性结构中的数据元素之间一对一的关系

1.2树形结构:树形结构中的数据元素之间存在一种一对多的层次关系

1.3图形结构:图形结构的数据元素是多对多的关系

2 物理结构
2.1顺序存储结构:开辟一组连续的空间存储数据通常用数组来实现,数组中空间本身是连续的,保证了数据之间的关系

2.2链式存储结构:开辟一组随机的空间存储数据通常用节点来实现,节点不仅要存储数据还要存储下一个节点的位置以保证数据之间的关系

3 算法概论
3.1算法是解决特定问题求解步骤的描述,分析问题,一步一步求解,并得到结构,这一系列的步骤就称为算法
3.2时间复杂度:
对于一个算法来说一般来说时间复杂度能够决定算法的好坏,时间复杂度越低,对于同一个问题的解决时间越少,反之依然。
3.2.1常见的时间复杂度
(1)常数阶O(1):就是那些无循环、不递归、与问题输入规模N无关、逐行执行的代码
(2)线性阶O(n):与问题输入规模有关的,主要是一层循环的代码,多个一层循环可以并列但不能包含。
(3)线性阶O(n+m):和线性阶O(n)一样,只不过我们有两种数据的输入规模
(4)平方阶O(n^2): 与问题输入规模有关的,相互要是二层镶嵌循环代码
(5)平方阶:O(nm):**和平方阶O(n^2)一样,只不过有两种数据输入规模
(6)对数阶:O(log n): 与问题输入规模有关的,只要是一次循环迭代或递归的代码
4 动态数组
4.1java内置数组的特点:
数组的长度一旦确定则不可更改
数组只能存储同一类型的数据
数组中每个存储空间地址是连续且相等的
数组提供角标的方式访问元素
4.2Java内置数组的缺点:
长度不可变,容量不够用怎么办
地址连续且提供角标访问很快,但增删元素怎么办
数组只有length这个属性,没有其他的方法
4.3 java内置数组缺点的解决
4.3.1容量不够----> 扩容
创建一个新的数组,长度为需要的长度(比如:原来数组长度的两倍),将原数组的值赋给新创建的数组。之后再将新数组指向原来的数组。

从有效元素的最后 一个元素开始依次往后移,直到要插入的角标。最后插入元素。

4.4动态数组是顺序存储结构具体实现的核心思想
5 线性表
5.1线性结构有顺序存储结构和链式存储结构实现,将两者的共同操作进行抽取,定义出线性结构的接口,ArrayLIst 是线性结构顺序存储方式的具体实现,称为线性表.

5.2线性表定义: 零个或多个元素的有限序列(当元素为0时称为空表)
6 栈
6.1定义:
我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
不含任何数据元素的栈称为空栈
栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构
栈本身是一个线性表,其数据元素具有线性关系,只不过它是一种特殊的线性表而已
栈的插入操作,叫作进栈,也称压栈、入栈
栈的删除操作,叫作出栈,也称弹栈
6.2Stack栈接口的定义
同样栈可以顺序存储实现也可以链表存储实现
所以将共性抽取定义出Stack接口
public interface Stack<E> extends Iterable<E>{
public int size();
public boolean isEmpty();
public void push(E element);
public E pop();
public E peek();
public void clear();}
该类为栈的顺序存储具体实现因为栈本身就是一种特殊的线性表,所有我们借用之前的ArrayList来实现ArrayStack
1746

被折叠的 条评论
为什么被折叠?



