前言:
本系列是笔者暑假自学数据结构的笔记整理而来,共126页,3w+字。现在正式开学上课,补充老师所讲内容,并且仔细勘误,根据老师的教学进度分章节发布在CSDN上。
教材使用的是王红梅等所著的数据结构——从概念到C++实现(第三版)。
暑假自学时期主要参考的网课:
青岛大学-王卓
武汉大学-李春葆
概述
大纲
定义与概念
数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。
程序=算法+数据结构
多个数据项构成数据元素,数据元素与数据元素之间的关系即是数据结构,多个数据元素组成数据对象,而多个数据对象组成数据。
存储结构是逻辑关系的映像与元素本身的映像,逻辑结构是数据结构的抽象,存储结构是数据结构的实现。两者综合起来建立了数据元素之间的结构关系。
数据类型:一组性质相同的值的集合+定义与这个值集合上的一组操作的总称。
抽象数据类型ADT—abstract data type,指一个数学模型+定义在此数学模型上的一组操作。
抽象数据类型的形式定义:(D,S,P)三元组表示, D是数据对象,S是D上的关系集,P是对D的基本操作集。
//一个抽象数据类型的定义格式
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
//基本操作的定义格式
基本操作名(参数表) //参数表:赋值参数,只为操作提供输入值;引用参数,&开头,除可提供输入值外,还将返回操作结果。
初始条件:<初始条件描述> //描述操作执行之前的数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。若初始条件为空,则省略之。
操作结果:<操作结果描述> //说明操作正常完成之后,数据结构的变化状况和应返回的结果
算法必须具有以下五个重要特征:有穷性、确定性、可行性、有输入、有输出
算法设计的四大要求:正确性correctness,可读性readability,健壮性robustness,高效性efficiency
算法的效率
算法的效率主要由以下方面来考虑
1.时间效率
2.空间效率:指的是算法执行过程中所耗费的存储空间(包括输入、输出数据占用的空间,算法本身占用的空间,执行算法的辅助空间)
算法运行时间 = 一个简单操作所需要的时间 * 简单操作次数 =
每条语句的执行次数抽象为基本语句的执行次数。对于循环来说也就是最内层循环体。
执行次数也称语句频度
语句执行一次所需的时间一般是随机器而异,由软硬件决定,与算法无关。所以我们假设执行每条语句所需要的时间均为单位时间。因此判断算法好坏,直接比较语句频度即可。
例如,两个n*n矩阵相乘算法:
绿色注释表示的是这句话的执行次数。
T(n)指的是规模为n的问题解决所需要的时间。
常用的时间复杂度比较如下:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) <…< O(2^n) < O(n!)
分析算法时间复杂度的基本方法
找到语句频度最大的那条语句作为基本语句->计算基本语句的频度得到问题规模n的某个函数f(n)->取其数量级用O表示。
Eg.1-逐步解出时间复杂度
Eg.2-先设执行次数,倒着解出时间复杂度
最坏时间复杂度、最好时间复杂度
平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用O加法法则和乘法法则,计算算法的时间复杂度。
1,加法法则,选择较大的
2,乘法法则,相乘
以上均为对非递归算法的时间复杂度分析,而分析递归算法的时间复杂度,参看
递归算法的时间复杂度分析
或其他博客。
一些习题
9.设 n 是描述问题规模的非负整数,下面程序片段的时间复杂度是___A__。
x=2;
while(x<n/2)
x=2*x;
A.O(log2n) B.O(n) C.O(nlog2n) D.O(n2)
10.下列程序段的时间复杂度是 (C)
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
A.O(log2n) B.O(n) C.O(nlog2n) D.O(n2)
以及教材P24-26的习题1
答案,自己写的解题过程:
以上 如果此篇博客对您有帮助欢迎点赞与转发 有疑问请留言或私信 2020/9/13