目录
😋前置知识:
- 数据结构类型:
- 集合结构:集合结构中的元素除了属于同一个集合外,它们直接没有任何关系。
- 线性结构
-
- 线性结构中的数据元素是一对一的关系,相互之间只与上一个和下一个连在一起
- 数据结构是所有元素一次靠在一起,中间不能有空位
- 链表结构,要求每隔元素只要再保存下一个元素的位置即可
-
- 线性表经过一些特殊的约束可以形成多种结构
-
-
- 只允许一头插入删除就是栈
- 只允许一头插入一头输出就是队列,队列这种数据结构可以有多种不同的限制条件和形式。在Java编程语言中,有大量工具类用于处理不同类型的队列。这些不同形式和限制条件的队列统称为访问受限的线性结构。
- 特殊结构 Hash,Hash本身是用数组存储,但是访问却不是线性的。
-
- 树形结构
-
- 树形结构中的元素存在单向一对多的层次关系
- 特点:
-
-
- 开始元素唯一,终端元素不唯一
- 除终端元素以外,每个元素有一个或多个后续元素
- 除开始元素外,每个元素有且仅有一个个前驱元素
-
- 树的拓展类型:堆、平衡树、红黑树、哈夫曼树等。算法中常考察二叉树【简洁好些】,实际开发中更多使用N层的结构。jdk等本身提供了大量的工具类来辅助我们工作
- 图形结构:图形结构的数据元素是多对多的关系
时间复杂度和空间复杂度问题
1. 时间复杂度
- 时间复杂度:用语句的只能怪次数,而不是实际的时间
- 系数和参数简化:O()激发
-
- 阶耗费时间的关系:
-
1.1. 几种常见的阶
- 常数阶:一般顺序执行并且只执行一次的代码就是常数阶,例如: sum=(1+n)*n/2
- 线性阶:表示执行的次数随着问题规模是线性变化的,例如:
- 平方阶:主要是双层循环嵌套
- 对数阶:后面要学习的二分查找,二叉树等问题经常会看到O(logn)
- 其本质可以简化成如下模型
上面代码执行次数与n的关系正好是:
2*x = n,也就是x = logn
- 所以说,二分查找不过是每循环一次都是减半,所以todo的执行次数是logn次
- 注意:处理时间复杂度,即为代码体与循环结束条件之间的关系
2. 空间复杂度
- 空间复杂度即需要申请多少额度外的空间来做现在的事情
- 例如:申请一个或者两三个变量,那么空间复杂度就是O(1);如果需要申请一个数组,链表,队列,栈,或者Hash,其空间复杂度都是O(n);如果申请一个二维数组就是O(n*2).其他的极少用