数据结构之绪论
(本文为个人学习数据结构课程和三年磨一剑的<<大话数据结构>> 后的笔记,如有侵权,请直接联系我,立即删除)
数据结构: 是相互之间存在一种或多种特定关系的数据元素的集合.
一. 按照视点的不同,我们把数据结构分为逻辑结构和物理结构
1.逻辑结构:是指数据对象中数据元素之间的相互关系.
(1)集合结构:集合结构中数据元素除了同属于一个集合外,它们之间没有其他关系.
(2)线性结构:线性结构中数据元素之间是一对一的关系.
(3)树形结构:树形结构中的数据元素之间存在一对多的层次关系.
(4)图形结构:图形结构的数据元素是多对多关系.
2.物理结构:是指数据的逻辑结构在计算机中的存储形式.
(1)顺序存储结构:把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系一致.
(2)链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以使连续的,也可以不是连续的.
二.算法的特性
1.算法的特性
(1).输入输出
(2).有穷性
(3).确定性
(4).可行性
(注: 设计算法应该尽量满足时间效率高和存储量第的需求.)
2算法研究的重要问题类型
(1)排序
(2)查找
(3)字符串处理
(4)图问题
(5)组合优化问题
(6)几何问题
(7)数值问题
3.算法的时间复杂度
(1)定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况确定T(n)的数量级,
算法的时间复杂度,也就是算法的时间度量,记作:T(n) = O(f(n)).它表示随着问题规模n的增大,算法的执行时间的增长率
和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度.其中f(n)是问题规模n的某个函数.
(2)推导大O阶方法
推导大O阶:
1). 用常数1取代运行时间中的所有加法常数.
2).在修改后的运行次数函数中,只保留最高阶项.
3).如果最高阶存在且不为1,则除去与这个项相乘的常数.
得到的结果就是大O阶.
(3)常数阶
例子:
int sum =0, n = 100; /*执行一次*/
sum = (1+2)*n/2; /*执行一次*/
printf("%d", sum); /*执行一次*/
f(n)=3 => O(1)
(4)线性阶
例子:
int i;
for(i=0; i < n; i++) /*执行n次*/
{
/*时间复杂度为O(1)的程序步骤序列*/
}
f(n)=n*(O(1)) =>O(n)
(5)对数阶
例子:
int count = 1; //①
while (count < n) /*执行n/2次*/
{
count *= 2; //②
/*时间复杂度为O(1)的程序步骤序列*/
}
语句1的频度是1,
设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n
取最大值f(n)= log2n,
T(n)=O(log2n )
2x = n => x=log2n => O(log2n)
例题:求以下程序段的时间复杂度
int total, i;
total=0; i=1;
while(i<=n)
{
total=total+i;
i=i+2;
}
(6)平方阶
例子:
int i, j;
for(i=0; i < n; i++) /*执行n次*/
for(j=0; j < m; j++) /*执行m次*/
{
/*时间复杂度为O(1)的程序步骤序列*/
}
f(n)=n*m(O(1)) =>O(n*m)
例题:求以下程序段的时间复杂度
int i, j;
for(i=0; i < n; i++) /*执行n次*/
for(j=i; j < n; j++) /*执行n-i次*/
{
/*时间复杂度为O(1)的程序步骤序列*/
}
f(n) = (n-0)+(n-1)+(n-2)+...+1=(n2+n)/2 => O(n2)
3.常见算法时间复杂度:
O(1): 表示算法的运行时间为常量
O(n): 表示该算法是线性算法
O(log2 n): 二分查找算法
O(n2 ): 对数组进行排序的各种简单算法,例如直接插入排序的算法。
O(n3 ): 做两个n阶矩阵的乘法运算
O(2n ): 求具有n个元素集合的所有子集的算法
O(n!): 求具有N个元素的全排列的算法
优<---------------------------<劣
O(1)<O(㏒2 n)<O(n)<O(n㏒2 n)<O(n2 )<O(2n )<O(n! )<O(nn )
时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2 n)、线性阶O(n)、线性对数阶O(nlog2 n)、平方阶O(n2 )、立方阶O(n3 )、……k次方阶O(nk )、指数阶O(2n )。
4.空间复杂度
与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作:
S(n)=O(f(n))
我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。
最后让我看看基本排序算法的时间复杂度和空间复杂度的比较
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
简单选择排序 | O() | O() | O() | O() | 稳定 |
稳定 | |||||
稳定 | |||||
稳定 | |||||
稳定 | |||||
稳定 | |||||
稳定 | |||||
稳定 |