传智播客C和C与数据结构基础讲义.docx
- 文档编号:23244339
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:15
- 大小:41.83KB
传智播客C和C与数据结构基础讲义.docx
《传智播客C和C与数据结构基础讲义.docx》由会员分享,可在线阅读,更多相关《传智播客C和C与数据结构基础讲义.docx(15页珍藏版)》请在冰豆网上搜索。
传智播客C和C与数据结构基础讲义
文档编制序号:
[KKIDT-LLE0828-LLETD298-POI08]
传智播客C和C与数据结构基础讲义
传智播客C和C++与数据结构基础讲义
传智扫地僧
1、数据结构概念
数据结构相关概念
疑惑
1、我学完了C语言,可是现在感觉还是写不出代码。
2、为什么会有各种各样的程序存在
3、程序的本质是什么
程序是为了具体问题而存在的
程序需要围绕问题的解决进行设计
同一个问题可以有多种解决方案
如何追求程序的“性价比”
是否有可量化的方法判别程序的好坏
数据结构起源
计算机从解决数值计算问题到解决生活中的问题
现实生活中的问题涉及不同个体间的复杂联系
需要在计算机程序中描述生活中个体间的联系
数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系
不是研究复杂的算法
数据结构中的基本概念
数据–程序的操作对象,用于描述客观事物(inta,intb,)
数据的特点:
可以输入到计算机
可以被计算机程序处理
数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型。
如:
int,float,char等等
数据元素:
组成数据的基本单位
数据项:
一个数据元素由若干数据项组成
数据对象–性质相同的数据元素的集合(比如:
数组,链表)
级中同学的友谊关系N:
N
B.公司中的上下级关系1:
N
C.冬天图书馆排队占座关系
D.花名册上名字之间的关系1:
:
1
线性表的操作
创建线性表
销毁线性表
清空线性表
将元素插入线性表
将元素从线性表中删除
获取线性表中某个位置的元素
获取线性表的长度
线性表在程序中表现为一种特殊的数据类型
线性表的操作在程序中的表现为一组函数
C语言描述=====》线性表的设计与实现
ADT抽象层《[数据结构(C语言版)].严蔚敏_吴伟民.扫描版.pdf》p44页
人生财富库积累
#ifndef_WBM_LIST_H_
#define_WBM_LIST_H_
typedefvoidList;
typedefvoidListNode;
蔚敏_吴伟民.扫描版.pdfp124
数据结构数据:
[数据结构(C语言版)].严蔚敏_吴伟民.扫描版.pdfp127
性质4:
具有n个结点的完全二叉树的深度必为log2n+1
性质5:
对完全二叉树,若从上至下、从左至右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1时为根,除外)
二叉树的存储结构
一、顺序存储结构
按二叉树的结点“自上而下、从左至右”编号,用一组连续的存储单元存储。
答:
一律转为完全二叉树!
讨论:
不是完全二叉树怎么办
方法很简单,将各层空缺处统统补上“虚结点”,其内容为空
二、链式存储结构
二叉树的表示
二叉树表示法
P127页
/*
typedefstructBiTNode
{
intdata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
*/
structBiTNode
{
intdata;
structBiTNode*lchild,*rchild;
};
typedefstructBiTNodeBiTNode;
typedefstructBiTNode*BiTree;
树的三叉链表表示
定n个数值{v1,v2,…,vn}
2.根据这n个数值构造二叉树集合F
F={T1,T2,…,Tn}
Ti的数据域为vi,左右子树为空
3.在F中选取两棵根结点的值最小的树作为左右子树构造一棵新的二叉树,这棵二叉树的根结点中的值为左右子树根结点中的值之和
4.在F中删除这两棵子树,并将构造的新二叉树加入F中
5.重复3和4,直到F中只剩下一个树为止。
这棵树即霍夫曼树
假设经过统计ABCDEF在需要传输的报文中出现的概率如下
霍夫曼树是一种特殊的二叉树
霍夫曼树应用于信息编码和数据压缩领域
霍夫曼树是现代压缩算法的基础
5、排序
排序基本概念
现实生活中排序很重要
算法已写好代码复用&和我们需要学习前辈们的经验不矛盾,也不代表我们不需要不学习。
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的数据元素调整为“有序”的数据元素。
排序数学定义:
假设含n个数据元素的序列为{R1,R2,…,Rn}
其相应的关键字序列为{K1,K2,…,Kn}这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系:
Kp1≤Kp2≤…≤Kpn
按此固有关系将上式记录序列重新排列为{Rp1,Rp2,…,Rpn}的操作称作排序
排序的稳定性
如果在序列中有两个数据元素r[i]和r[j],它们的关键字k[i]==k[j],且在排序之前,对象
r[i]排在r[j]前面。
如果在排序之后,对象r[i]仍在r[j]前面,则称这个排序方法是稳定的;
否则称这个排序方法是不稳定的。
多关键字排序
排序时需要比较的关键字多余一个
排序结果首先按关键字1进行排序
当关键字1相同时按关键字2进行排序
当关键字n-1相同时按关键字n进行排序
对于多关键字排序,只需要在比较操作时同时考虑多个关键字即可!
排序中的关键操作
比较
任意两个数据元素通过比较操作确定先后次序
交换
数据元素之间需要交换才能得到预期结果
内排序和外排序
内排序
整个排序过程不需要访问外存便能完成
外排序
待排序的数据元素数量很大,整个序列的排序过程不可能在内存中完成
排序的审判
时间性能
关键性能差异体现在比较和交换的数量
辅助存储空间
为完成排序操作需要的额外的存储空间
必要时可以“空间换时间”
算法的实现复杂性
过于复杂的排序法会影响代码的可读性和可维护性,也可能影响排序的性能
总结
排序是数据元素从无序到有序的过程
排序具有稳定性,是选择排序算法的因素之一
比较和交换是排序的基本操作
多关键字排序与单关键字排序无本质区别
排序的时间性能是区分排序算法好坏的主要因素
选择法
基本思想
每一趟(例如第i趟,i=0,1,…,n-2)在后面n-i个待排的数据元素中选出关键字
最小的元素,作为有序元素序列的第i个元素。
排序过程
首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换
再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换
重复上述操作,共进行n-1趟排序后,排序结束
插入排序
基本思想:
元素1个元素,
排序过程:
整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序
实质:
对线性表执行n-1次插入操作,只是先要找到插入位置
V[0],V[1],…,V[i-1]已经排好序。
这时已经排好序。
这时,用V[i]的关键字与V[i-1],V[i-2],…的关键字进行比较,找到插入位置即将V[i]]插入,原来位置上的对象向后顺移。
插入排序关键点:
1、拿出一个元素,留出位置、2符合条件的元素后移
冒泡排序
希尔排序
排序过程:
先取一个正整数d1 O Q(nlogn) 希尔排序是不稳定的。 快速排序 思想: 快速排序是对冒泡排序的一种改进。 它的基本思想是: 通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,基准数据排在这两个子序列的中间; 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。 排序总结 6C++模板类与数据结构基础 前言 C++模板是容器的概念。 理论提高: 所有容器提供的都是值(value)语意,而非引用(reference)语意。 容器执行插入元素的操作时,内部实施拷贝动作。 所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。 加入到容器中的元素,应该可以被加入才行。 模板类设计与实现 链表类_链式存储设计与实现 栈类_链式存储设计与实现 队列类_链式存储设计与实现 链表类_顺序存储设计与实现 栈类_顺序存储设计与实现 队列类_顺序存储设计与实现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 传智播客 数据结构 基础 讲义
