数据结构学习笔记 Day 7

来源:互联网 发布:外交官拉杆箱 知乎 编辑:程序博客网 时间:2024/05/16 02:46

大话数据结构
数据结构介绍 算法推导大O阶的方法 顺序结构与链式结构差异 栈与队列的应用 串的朴素模式匹配 KMP模式匹配算法;
二叉树前中后序遍历 赫夫曼树及应用 图的深度 广度遍历 最小生成树两种算法 最短路径两种算法 拓扑排序与关键路径算法 折半查找 插值查找 斐波那契查找等静态查找 稠密索引 分块索引 倒排索引等索引技术 二叉排序树 平衡二叉树等动态查找:B树 B+树技术 散列表技术 冒泡选择插入等简单排序 希尔 堆 归并 快速等改进排序……

1、人们无法理解他没有经历过的事情–尼采
2、A picture is worth a thousand words.用上千个描述不明白的东西,很可能一张图就能解释清楚。
3、阅读可以是一件主动的事,阅读越主动,效果越好。拿同样的书给背景相近的两个人阅读,一个人却比另外一个从书中得到了更多年。
4、如何收获。摘抄文字 眉批心得 稿纸演算 代码输入电脑 在编程工作中的运用

建议本书的研读方法:
* 复习C语言的基础知识。
*阅读第一遍时,建议从头至尾进行。
*阅读时,摘抄时非常好的习惯。最淡的墨水也胜于最强的记忆。
*阅读完每一章时,一定要在理解基础上记忆一些关键东西。最佳的效果就是你可以不看书也做到一点不错的默写出相关算法。
*阅读完每一章时,一定要适当练习。
*学习不可能一蹴而就。

第一章 数据结构绪论

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

If you give some a program,you will frustrate them a day;if you teach them how to program,you will frustrate them for a lifetime.
考研玩的不是智商,其实就是一个人投入的时间而已。

虽然不是百分百纯粹的为了感受编程之美,但至少是百分之九十。

开发一个客服电话系统 完成排队模块的代码工作;觉得很容易,用数据库设计了一张客户排队表,并且用一个自动递增的整形数字作为客户的编号。只要来一个客户,就给这张表的末尾插入一条数据。等客服系统一有空闲,就从这张表中取出最小编号的客户提交,并且删除这条记录。……

数据结构起源
数据结构是研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系等相关问题的学科。认为程序设计的实质时对确定的问题选择一种好的结构,加上设计一种好的算法。
程序设计=数据结构+算法。

基本概念和术语
数据:是描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整形、实型等数据类型,还包括字符及声音、图像、视频等非数值类型。

我们这里说的数据,其实也就是符号,而且这些符号必须具备两个前提:可以输入到计算机中;能被计算机程序处理。

数据元素:组成数据的、有一定意义的基本单位。
数据项:一个数据元素可以由若干个数据项组成。
数据对象:是性质相同的数据元素的集合,是数据的子集。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

逻辑结构与物理结构
逻辑结构:是指数据对象中数据元素之间的相互关系。
分为以下四种:集合结构 线性结构、树形结构、图形结构
物理结构(存储结构)
物理结构:是指数据的逻辑结构在计算机中的存储形式;
存储结构分为顺序存储和链式存储。
顺序存储结构:是把数据存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的
链式存储结构:把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系并不能反映其逻辑结构,因此需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。
逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本目标就是将数据及其逻辑内存存储到计算机的内存中。

抽象数据类型
数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称;
抽象是指抽取出事物具有的普遍性的本质。
在科学研究中,科学抽象的具体程序是千差万别的,决没有千篇一律的模式,但是一切科学抽象过程都具有以下的环节。我们把它概括为:分离—提纯—简略。

抽象数据类型(Abstracr Data Type):是指一个数学模型及定义在该模型上的一组操作。
抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性。
描述抽象数据类型的标准格式:
ADT 抽象数据类型名
Data
数据元素之间逻辑关系的定义
Operation
操作1
初始条件
操作结构描述
操作2

.
.
.
endADT

第二章 算法

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每一条指令表示一个或多个操作。

算法定义
算法是描述解决问题的方法,算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每一条指令表示一个或多个操作。算法中提到的指令,指令能被人或机器等计算装置执行。它可以是计算机指令,也可以是我们平时的语言文学。

算法特性
输入输出、有穷性、确定性和可行性
输入输出 算法具有零个或多个输入 算法至少有一个或多个输出,算法是一定需要输出的。输出的形式可以是打印输出 也可以是返回一个或多个值等。
有穷性:指算法在执行有限步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
确定性:算法的每一步都有确定的含义,不会出现二义性
可行性:每一步都能够通过执行有限次数完成。

算法设计的要求
正确性:算法的正确性是指算法至少应具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
可读性:算法设计的另一个目的是为了便于阅读、理解和交流
健壮性:当输入的数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
时间效率高和存储量低
综上,好的算法应该具有正确性、可读性、健壮性、高效率和低存储的特征。

算法效率的度量方法
事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器及用算法编制的程序的运行时间进行比较,从而确定算法效率的高低。不予采纳
事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。
一个高级程序语言编写的程序在计算机上运行所消耗的时间取决于下列因素:
算法采用的策略、方法;——算法的好坏
编译产生的代码质量;——–软件支持
问题的输入规模————–输入量的多少
机器执行指令的速度———-硬件性能
我们在分析一个算法的运行时间时,重要的是把基本操作的数量与输入规模关联起来,即基本操作的数量必须表示成输入规模的函数。

函数的渐进增长
函数的渐进增长:给定两个函数非f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐进快于g(n)
判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数。
通过算法时间复杂度来估算算法时间效率。

算法时间复杂度
算法时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度,其中,f(n)是问题规模n的某个函数
这样用大写O()来体现算法时间复杂度的记法,我们称之为大O记法,一般情况下随着n的增大,T(n)增长最慢的算法为最优算法;

推导大O阶方法
1、用常数1取代运行时间中的所有加法常数;2、在修改后的运行次数函数中,只保留最高阶项;3、如果最高阶项存在且不是1,则去除与这个项相乘的常数;得到的结果就是大O阶;
常数阶 单纯的分支结构 时间复杂度为O(1)
线性阶 我们要分析算法的复杂度,关键就是要分析循环结构的运行情况
对数阶 while(count

define MAXSIZE 20

typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;

数据长度与线性表长度
数组长度:是存放线性表的存储空间的长度,存储分配后这个量一般是不变的;
线性表的长度:线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的
在任意时刻,线性表的长度应该小于等于数组的长度

地址计算方法
存储器中的每个存储单元都有自己的编号,这个编号称为地址。存取时间性能为O(1) 我们通常把具有这一特点的存储结构称为随机存取结构

顺序存储 结构的插入和删除
获得元素操作:如果第i个元素<1或i>线性表长度或线性表长度=0 则返回错误 否则则*e=L.data[i-1];
插入操作:插入的位置不合理 异常;线性表长度大于等于数组长度 异常或增加容量 从最后一个元素开始向前遍历到第i个位置 分别加将它们都向后移动一个位置 将要插入元素填入位置i处;表长加1
删除操作:如果删除位置不合理 异常;取出删除元素;从删除元素位置开始遍历到最后一个元素位置 分别将它们都向前移动一个位置 表长减一

线性表的链式存储结构
是用一组任意的存储单元存储线性表的数据元素。这组存储元素可以是连续的,也可以是不连续的。
以前的顺序结构中,每个数据元素只需要存在数据元素信息就可以了。现在链式结构中,除了要存数据元素信息外,还要存储后继元素的存储地址
我们把存储数据元素信息的域称为数据域;把存储直接后继位置的域称为指针域 指针域中存储的信息称为指针或链 这两部分信息组成数据元素ai的存储映像 称为结点(Node) n个结点链结成一个链表 即为线性表的链式存储结构 因为此链表的每一个结点中只包含一个指针域 所以叫做单链表
头指针和头结点
单链表的读取
单链表的插入与删除

第四章 栈与队列
栈(stack)—是限定仅在表尾进行插入和删除操作的线性表
我们把允许插入和删除的一端称为栈顶 另一端称为栈底 不含任何数据元素的栈称为空栈 栈称为后进先出(Last In First Out)的线性表,简称LIFO结构。栈的插入操作 叫作进栈 栈的删除操作 叫作出栈
栈的抽象数据类型
栈的顺序存储结构及实现
栈的链式存储结构及实现
栈的应用—-递归
斐波那契数列

每个递归定义必须有一个条件 满足时递归不再进行,即不再引用自身而是返回值退出。
后缀表达式 :从左到右遍历表达式的每个数字和符号,遇到 数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果;
中缀表达式:标准四则运算表达式 从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或是优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式

队列的定义
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。

队列的抽象数据类型

队列的顺序存储结构

下午 21:50 2017/2/24 星期五

第五章 串
串(string)是由零个或多个字符组成的有限序列,又叫字符串。
串的抽象数据类型
串的存储结构
顺序存储结构 在计算机中存在一个自由存储区,叫做堆。这个堆可由C语言的动态分配函数malloc()和free()来管理
串的链式存储结构
字串的定位操作通常称作串的模式匹配
KMP算法

第六章 树
树(Tree)是n个结点的有限集。在任意一颗非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m个互不相交的有限集T1 T2……其中每一个集合本身又是一棵树,并且称为根的子树。

第七章 图
图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E)

0 0
原创粉丝点击