目录
【1】数据结构基础知识
1》什么是数据结构
2》数据
3》逻辑结构
1>线性关系
2>层次关系
3>网状关系
4》存储结构
1>顺序存储
2>链式存储
3>索引存储结构
4>散列存储
5》操作
【2】算法基础知识
1> 什么是算法
2> 算法设计
3> 算法的特性
4> 评价算法的好坏
5> 计算大 O 的方法
【1】数据结构基础知识
1》什么是数据结构
数据结构就是数据的逻辑结构、存储结构以及操作(类似数据的运算)
数据结构的最终目的就是:如何更高效的存储数据
2》数据
数据:所有能被输入到计算机并被处理的符号的集合
数据元素:数据的基本单位,由若干个数据项组成(又叫节点)
数据项:构成数据的不可分割的最小单位
数据对象:相同性质的数据元素的集合,是数据的子集
数据类型:一个值的集合和定义在这个集合上的一组操作的总称
例:
计算机处理的对象不再是单纯的数值
而是如下表的类似集合的数据:
在这个表中
数据:图书
数据元素:每一本书
数据项:编号、书名、作者、出版社.....
3》逻辑结构
数据元素不是孤立存在的,它们之间存在着某种逻辑关系
1>线性关系
线性结构:结构中的数据元素之间只存在一对一的关系
线性表:顺序表、链表、栈、队列
2>层次关系
树形结构:结构中的数据元素之间存在一对多的关系
树:一般树、二叉树
3>网状关系
图状结构(网状结构):结构中的数据元素之间存在多对多的关系
图:有向图、无向图
4》存储结构
数据结构在计算机中的表示,也称物理结构
1>顺序存储
把逻辑上相邻的元素存储在物理位置上相邻的存储单元里,通过存储单元的邻接关系来表示元素之间的逻辑关系
内存连续
优点:实现随机存储,每个元素占用空间小
缺点:只能使用相邻的一整块存储单元,会产生较多外部碎片
实现:数组
2>链式存储
不要求逻辑上相邻的元素在物理位置上也相邻,通过指针表示元素之间的逻辑关系
内存不连续
优点:不会出现碎片现象,充分利用所有存储单元
缺点:每个元素要占用存储指针,需要多占用存储空间,而且只能顺序存取
实现:结构体
代码实现:
#include <stdio.h> struct Node//定义结构体 { int data;//数据域 struct Node *next;//指针域 }; int main(int argc, char const *argv[]) { struct Node A = {1,NULL};//定义结构体变量并赋值 struct Node B = {2,NULL}; struct Node C = {3,NULL}; //把3个节点连接起来 A.next = &B;//将B节点的地址放到A节点的指针域中,即把A和B连接起来 B.next = &C; printf("%d",A.data);//打印 printf("%d",(A.next)->data); printf("%d",(A.next)->next->data); return 0; }
3>索引存储结构
存储信息的同时,建立覅接的索引表,索引表中每一项成为索引项,索引项的一般形式(关键字,地址)
优点:检索速度快
缺点:增加索引表,占用较多存储空间,增删数据是也要修改索引表,花费更多时间
例:
4>散列存储
根据元素的关键字直接计算出该元素的存储位置,也称Hash存储
按关系存,按关系取
优点:检索,增删节点操作都很快
缺点:散列函数不好可能会出现元素存储单元的冲突,解决冲突会增加时间 ,空间的开销。
5》操作
增删查改
【2】算法基础知识
1> 什么是算法
算法对特定问题求解步骤的一种描述,它是指令的有限序列,期中每一条指令都表示一个或多个操作。
数据结构 + 算法 = 程序
2> 算法设计
算法的设计:取决于数据的逻辑结构
算法的实现:依赖于数据的存储结构
3> 算法的特性
有穷性:步骤是有限的
确定性:每一个步骤都有明确的含义,无二义性
可行性:在规定时间内都可以完成
输入
输出
4> 评价算法的好坏
正确性
易读性
健壮性:容错处理
高效性:执行效率,通过重复执行语句的次数来判断,也就是时间复杂度(时间处理函数)来判断。
时间复杂度语句频度:用时间规模函数表达
时间规模函数:T(n) = O(f(n))
T(n) :时间规模的时间函数
O : 时间数量级
n :问题规模
f(n) :算法可重复语句的次数
称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度渐进时间复杂度用大写 O 来表示,所以也被称为大 O 表示法。时间复杂度就是把时间规模函数T(n) 简化为一个数量级 ,如n ,n^2 ,n^3.
例:
求1+2+3+4+...+n的和
算法1:
int sum=0;
for(int i=1;i<=n;i++)
{
sum += i; //重复执行n次
}
f(n) = n ==> T(n) = O(n)
算法2:
利用等差数列前n项和公式:Sn=n*a1+n(n-1)d/2 或 Sn=n(a1+an)/2 (d是公差)
int sum = (1+n)*n/2; //重复执行1次
f(n) = 1 ==> T(n) = O(1)
很显然,第二种算法的时间复杂度要低一些,效率更高。
5> 计算大 O 的方法
1.根据问题规模n写出表达式f(n)
2.如果有常数项,将其置为1 //当f(n)的表达式中只有常数项,例如f(n) = 8 ==> O(1)
3.只保留最高项,其他项舍去。
4.如果最高项系数不为1,则除以最高项系数。