一、数据结构
数据结构大致包含以下几种存储结构:
- 线性表,还可细分为顺序表、链表、栈和队列;
- 树结构,包括普通树,二叉树,线索二叉树等;
- 图存储结构;
(一)线性表
有序,线性表并不是一种具体的存储结构,它包含顺序存储结构和链式存储结构,是顺序表和链表的统称。
1、顺序表
类似数组,但数组不属于数据结构范畴
2、链表
位置随机
使用链表存储数据时,是随用随申请,因此数据的存储位置是相互分离的,换句话说,数据的存储位置是随机的。
3、栈和队列
栈中的元素只能从线性表的一端进出(另一端封死),且要遵循“先入后出”的原则,即先进栈的元素后出栈。
队列中的元素只能从线性表的一端进,从另一端出,且要遵循“先入先出”的特点,即先进队列的元素也要先出队列。
(二)树存储结构
树存储结构适合存储具有“一对多”关系的数据。
(三)图存储结构
图存储结构适合存储具有“多对多”关系的数据。
二、算法
1、什么是算法
准确性,健壮性,效率性
效率:算法的运行时间【时间复杂度】、运行算法所需内存空间大小【空间复杂度】
在学习C语言的时候讲过,程序由三种结构构成:顺序结构、分支结构和循环结构。顺序结构和分支结构中的每段代码只运行一次;循环结构中的代码的运行时间要看循环的次数。
由于是估算算法的时间复杂度,相比而言,循环结构对算法的执行时间影响更大。所以,算法的时间复杂度,主要看算法中使用到的循环结构中代码循环的次数(称为“频度”)。次数越少,算法的时间复杂度越低。
例如:
a) ++x; s=0;
b) for (int i=1; i<=n; i++) { ++x; s+=x; }
c) for (int i=1; i<=n; i++) { for (int j=1; i<=n; j++) { ++x; s+=x; } }
上边这个例子中,a 代码的运行了 1 次,b 代码的运行了 n 次,c 代码运行了 n*n 次。
2、时间复杂度表示
O(频度)
单独时间复杂度
a、b、c总共的时间复杂度
3、常用时间复杂度的排序
常数 对数 线性 平方 立方 指数