一.算法
算法的基本概念(笼统):
解答某一类问题的任意一种特殊的方法。
一组又穷的规则,它规定了解决某一特定类型的问题的一系列运算。简而言之,就是解决问题的方法的步骤,是解题方案准确为完整的描述。
根据算法编写出相应的计算机语言的程序,让计算机去执行完成它,就可以提高工作效率。
算法是程序设计的核心
重要特性:
1.确定性
确定性指的是算法的每一个运算步骤必须有确切的定义,必须是清楚的,无二义性的(没有歧义的)。
2.可行性
可行性指的是算法中将要执行的运算都是基本运算,每一种运算至少在原理上能由人用纸和笔在有限时间内完成。
3.输入
一个算法有0个或者多个输入,这些输入是在算法开始之前给出的。
4.输出
一个算法产生一个或多个输出,这些输出是同输入有某种特定关系的量
5.
一个算法总是在执行了有穷步的运算之后,终止。在有限时间内完成。
算法的表示
设计出来的算法,我们可以用采用的自然语言、计算机程序设计语言、流程图、NS图、伪代码等来描述它,是就是算法的表示。
程序
用计算机语言将算法描述出来,称为程序。它可以存放在计算机储存器上,需要的时候可以去执行它。
伪代码语言
伪代码语言指的是一种用高级程序语言和自然语言组成的面型读者的语言,是为了方便阅读或者交流算法而使用的一种工具,在描述数据结构中的算法时经常采用伪代码语言或者流程图的形式。
流程图
流程图与实现算法的语言无关,直观、清晰地表示算法流程,易于掌握。
常用符号有:
起止框、判断框、处理框、输入输出框、流程线、注释框、连接点
可以直观的反映算法的逻辑执行顺序。
NS图
NS图又称为盒图,是一种不允许破坏结构化原则的图形算法描述工具,在NS图中去掉了流程图中容易隐去麻烦的流程线,全部算法写在一个框内,每一种基本结构作为一个框。
NS图的特点:
评价一个算法优劣的主要标准:
算法的执行效率和储存需求
算法的时间复杂度:
是指执行这个算法所需要的计算工作量
算法的空间复杂度:
是指一个算法在计算机储存器上所占用的储存空间,包括储存算法本身所占用的存储空间,算法中的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三部分
评价一个算法的各种指标往往是相互矛盾、相互影响的:
当追求较短的运行时间,可能带来较多的存储空间和编写出较繁琐的算法;当追求算法的简单性时,可能需要占用较长的运行时间和较多的存储空间等。
所以,
在设计个算法时,要从多个方面综合考虑。还要考虑到算法的使用频率以及所使用机器的软硬件环境等诸多因素,这样才能设计出好的算法。
用计算机解决问题:
两个待解决的任务:
二.程序设计基础
一个好的算法最终要用计算程序设计语言来实现
“指令集”:操作码+操作数
程序设计语言分类:
机器指令:‘0’ 和 ‘1’ 组成的二进制编码表示命令(直接执行,执行速度快,无需翻译)
机器语言:
由机器指令组成的语言称为及其语言。
(难以记忆,难以书写,更加难懂)
汇编语言:
为了使语言更容易被程序员或者计算机使用者理解,人们用助记符代替二进制的操作码,用符号地址代替二进制的操作数,称之为汇编语言。
(安排存储、规定寄存器、运算器的次序,难度较高)
高级语言:
高级语言是一种接近于人们习惯用的语言的计算机程序设计语言,它允许用英文词汇书写解题的程序,程序中所使用的运算符号和运算式都和我们日常中所用的数学表达式差不多。
程序设计方法:
结构化程序设计 -- 模块化:
(顺序结构 选择结构 循环结构)
面向对象程序设计:
对象:
是由描述该对象的属性的数据以及可以对这些数据施加的所有操作封装在一起的一个统一体。
具有以下特点:
具有以下优点:
数据结构基础
计算机应用领域:
加工处理的对象: “数值” ==> “字符” “表格” “图像”
数据结构:
相关术语:
常见结构:
或
数据元素之间的关系表示:顺序映像 和 非顺序映像
顺序映像:
借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,也就是说,逻辑关系中相邻的两个元素,在存储器中也是相邻的。
非顺序映像:
结束指示元素存储地址的指针表示数据元素之间的逻辑关系,也就是说,存储器中相邻存放的两个数据元素,其逻辑关系未必是相邻的。
数据的运算:
对数据结构中的数据元素进行的操作处理。
(查找 排序 插入 删除 修改)
前件结点指向后件结点,没有前间结点称为根节点,没有后间结点称为叶子结点
线性表的基本概念
若一个非空的数据结构满足一下条件:
则称该数据结构为线性结构,线性结构又称为线性表。
线性表的存储结构:
顺序存储结构
链式存储结构
具有顺序存储结构的线性表称为顺序表。
具有链式存储结构的线性表称为线性链表。
线性表的顺序存储结构
顺序存储结构把逻辑上相邻的数据元素存储在物理上相邻的存储单元里,顺序存储结构只能存储结点的值,不存储结点间的关系,结点间的关系由存储单元的邻接关系来体现。
顺序表的插入操作是指在顺序表的第 i -1 个数据元素和第 i 个数据元素之间插入一个新的数据元素。
顺序表中的删除第 i 个元素需将第 i + 1 至第 n 个元素依次向前移动一个位置。
线性表的链式存储结构
线性表的链式存储结构称为线性链表。
链式存储结构不要求逻辑上相邻的数据元素物理位置也相邻,而且各数据元素的存储顺序也是任意的。各数据元素的先后关系是由各节点的指针域指示。
链式存储结构的每一个存储结点不仅存储结点的值,而且存储结点之间的关系:
[数据域] [指针域]
栈是仅能在表尾进行插入或删除操作线性表
按照“先进后出”或“后进先出"的原则组织数据的线性表
物理存储结构可以采用顺序结构也可以采用链表结构。
顺序栈
按照其物理上相邻的存储单元,宇哥栈的所有元素储存在一片连续的存储空间,栈的数据结构有一个非常重要的标记:栈顶指针
栈的运算:
入栈(插入运算)
出栈(删除运算)
读栈顶元素
队列:
一种特殊的线性表。特点为所有的插入都在表的一端进行,所有的删除运算所在表的另一端进行。
按照“先进先出的”或“后进后出”的原则组织数据的线性表。
可以采用顺序存储结构,也可以采用链式存储结构
队列中的两个指针:
指向队首
指向队尾
用来确定队列的两端的位置
顺序队列
按照逻辑顺序存储在物理上相邻的存储单元,一个队列中的所有元素存储在一片连续的存储空间里
入队运算:
在队伍指针向的位置插入一个新的元素,队尾指针后移一位。插入操作前要先判断队伍是否已满,如果已满,就不能进行入队运算。
出队运算:
删除对头元素,将队首指针向后移一位。删除操作之前,要先判断队伍是否为空,若为空,则不能进行删除运算。
循环队列:
把队列分配到的存储空间,在逻辑上看做一个环,当队尾指针指向存储空间的末端后,如果再发生插入操作,就把它重新至于队列存储空间的始端。
树
二叉树
度为2的有序数.特点为树中每一个结点最对有两棵子树,并且子树有左右之分,次序不能颠倒
对于每一个节点,首先存它的值然后增加两个指针域,分别存放在其左子树和右子树根结点的地址,也就是分别指向其左子树和右子树
二叉树的性质:
二叉树的遍历:
先序遍历:根节点 => 左结点 => 右节点
中序遍历:左节点 => 根节点 => 右节点
后序遍历:左节点 => 右节点 => 根节点