一、数据结构
1.数据结构主要学习的内容
- 数据们之间的关系,将离散的数据规整划一
- 如何将这个关系具体实现并存储到计算机中
- 基于关系之上对数据的具体操作,增删查改等
- 数据结构的具体使用场景
2.数据之间的关系——称之为逻辑结构
是指数据元素之间的相互关系,是我们想象出来的,并没有实质性的存储在计算机中
- 线性结构:线性结构中的数据元素是一对一的关系
- 树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
- 图形结构:图形结构的数据元素是多对多的关系。
3.关系在计算机上的存储——物理结构
是指数据的逻辑结构在计算机中的具体存储形式
- 顺序存储结构:开辟一组连续的空间存储数据(通常用数组来实现,数组中空间本身是连续的,保证了数组之间的关系)
- 链式存储空间:开辟一组随机的空间存储数据(通常用节点来实现,节点不仅要存储数据还要存储下一个节点的位置以保证数据之间的关系)
二、算法
1.什么是算法
是解决特定问题求解步骤的描述,分析问题,一步一步求解,并得到结果,这一系列步骤称之为算法。
- 自然语言描述
- 流程图描述
- 伪代码描述
- 程序代码描述
2.评价算法的好坏
(1)事后统计法:通过设计好的程序和数据,利用计算机计时器对不同算法程序的运行时间进行比较,从而确定算法效率的高低。
弊端:必须事先编好程序再进行运行,如果程序处理的数据量较大,则会花费大量的使劲和精力;时间的比较依赖于计算机硬件和软件环境;算法的测试数据设计困难,数据量小了,相差微小,数据量大了,浪费时间。
(2)事前分析法:这种方法主要在计算机程序编制前,依据统计方法对算法进行估算。
一个高级程序语言编写的程序在计算机运行所消耗的时间取决于下列因素:
- 算法采用的策略、方法(算法好坏的根本)
- 编译产生的代码质量(取决于具体的编程语言)
- 问题的输入规模
- 机器执行指令的速度(取决于硬件性能)
一个程序的运行时间依赖于算法的好坏和问题的输入规模(数据输入量的多少)。
3.算法时间复杂度
(1)主要探究的是问题输入规模N的数量级,不是算法具体执行的次数
(2)常数阶O(1):就是那些无循环、无递归、与问题输入规模N无关的、逐行执行的代码。
(3)线性阶O(n):与问题输入规模有关的,主要是一层循环的代码,多个一层循环可以并列但不能包含。线性阶O(n+m):和线性阶O(n)一样,只不过有两种数据的输入规模。
(4)平方阶O(n^2):与问题输入规模有关的,主要是二层嵌套循环的代码。平方阶O(nm):与平方阶O(n^2)一样,只不过有两种数据的输入规模。
(5)对数阶O(log^n):与问题输入规模有关,主要是一层循环迭代或递归的代码。
(6)常见阶比较: