利用计算机算法为计算机解题的过程实际上是在实施某种算法
判断一个算法好与坏的标准包括时间复杂度与空间复杂度,时间复杂度越小越好,空间复杂度越小越好
算法的工作量用算法所执行的基本运算次数来计算。而算法所执行的基本运算次数是问题规模的函数,即算法的工作量=f(n),其中n是问题的规模。
数据结构可分为逻辑结构和存储结构。
数据的逻辑结构是对数据元素之间的逻辑关系的描述,与数据存储无关,是面向问题的,是独立于计算机的。它有两个要素:一是数据元素的集合,即数据对象,通常记为D;二是D上的关系,即数据对象之间的关系,它反映了数据元素之间的前后件关系,通常记为R。
数据的存储结构也称数据的物理结构,是数据在计算机中的存放的方式,是面向计算机的,它包含数据元素的存储方式和关系的存储方式。
数据结构和逻辑结构的关系: 一种数据的逻辑结构可以表示成多种存储结构即数据的逻辑结构和存储结构不一定一一对应。
常见的存储结构有:顺序、链接、索引等,采用不同的存储结构其数据处理的效率是不同的。
根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分成两大类型:线性结构与非线性结构。
一、
如果一个非空的数据结构满足下列两个条件,则称该数据结构为线性结构。
线性结构又称线性表。在一个线性结构中插入或删除任何一个结点后还应是线性结构。如果一个数据结构不是线性结构,则称之为非线性结构。
栈、队列、串、双向链表等是线性结构;树、图、数组、广义表等都是非线性结构。
空的数据结构是线性结构还是非线性结构:都有可能,根据具体情况来确定。如果对该数据结构的算法是按线性结构的规则处理的,则属于线性结构;否则属于非线性结构。
二、
线性表的顺序存储结构具有以下两个基本特点:
元素 ai 的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,ADR(a1)为第一个元素的地址,k 代表每个元素占的字节数。
三、
顺序表的运算有查找、插入、删除 3种。
栈的基本概念:
栈是一种特殊的线性表,只允许在表的一端进行插入和删除的线性表;插入,删除的一端为栈顶,另一端为栈底;当表中没有元素时为空栈。
栈是按照“先进后出”或“后进先出”的原则组织数据的。
栈的顺序存储及其运算:
用一维数组S(1:m)作为栈的顺序存储空间,其中m为最大容量。
在栈的顺序存储空间S(1:m)中,S(bottom)为栈底元素,S(top)为栈顶元素。
top=0表示栈空;top=m表示栈满。
栈的基本运算有 3 种:入栈、退栈与读栈顶元素。
① 入栈运算:在栈顶位置插入一个新元素;
② 退栈运算:取出栈顶元素并赋给一个指定的变量;
③ 读栈顶元素:将栈顶元素赋给一个指定的变量。
队列的基本概念:
队列是一种特殊的线性表,只允许在表的一端插入,在另一端删除,允许插入的一端是队尾(rear),允许删除的一端为队头(front),当表中没有元素是空队列。
队列的修改是依照先进先出的原则进行的。
队列的运算
队列的顺序存储结构一般采用队列循环的形式。循环队列 s=0 表示队列空;s=1 且 front=rear 表示队列满。计算循环队列的元素个数:“尾指针减头指针”,若为负数,再加其容量即可。
rear指向的位置是放入元素的位置,front指向的位置是删除元素后的位置
注:判断循环队列元素个数公式(rear-front+容量)%容量,%表示取余数,如果是0说明队列是满的或空的
数据结构中的每一个结点对应于一个存储单元,这种存储单元称为存储结点,简称结点。在链式存储方式中,要求每个结点由两部分组成:
线性链表
线性表的链式存储结构称为线性链表。
在某些应用中,对线性链表中的每个结点设置两个指针,一个称为左指针,用以指向其前件结点;另一个称为右指针,用以指向其后件结点。这样的表称为双向链表。
在线性链表中,各数据元素结点的存储空间可以是不连续的,且各数据元素的存储顺序与逻辑顺序可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。在线性链表中进行插入与删除,不需要移动链表中的元素。
线性单链表中,HEAD 称为头指针,HEAD=NULL(或 0)称为空表。
如果是双向链表的两指针:左指针(Llink)指向前件结点,右指针(Rlink)指向后件结点。
线性链表的基本运算:查找、插入、删除。
带链的栈
栈也是线性表,也可以采用链式存储结构。带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈。
树(tree)是一种简单的非线性结构。在树结构中,每一个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点。
二叉树是一种很有用的非线性结构,具有以下两个特点:
① 非空二叉树只有一个根结点;
② 每一个结点最多有两棵子树,且分别称为该结点的左子树和右子树。
二叉树的性质
满二叉树和完全二叉树
满二叉树:除最后一层外,每一层上的所有结点都有两个子结点。在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第 k 层上有 2k-1 个结点,且深度为 m 的满二叉树有 2m-1 个结点。
完全二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
满二叉树也是完全二叉树,二完全二叉树一般不是满二叉树。
二叉树的遍历
在遍历二叉树的过程中,一般先遍历左子树,再遍历右子树。在先左后右的原则下,根据访问根结点的次序,二叉树的遍历分为三类:前序遍历、中序遍历和后序遍历。
在二叉树遍历中,无论是前序遍历,中序遍历还是后序遍历,二叉树叶子结点的先后顺序都是不变的。
顺序查找
顺序查找是从表的一端开始,依次扫描表中的各个元素,并与所要查找的数进行比较。 在下列两种情况下也只能采用顺序查找。
二分查找
二分法查找,也称拆半查找,是一种高效的查找方法。能使用二分法查找的线性表必须满足用顺序存储结构和线性表是有序表两个条件。
对于长度为 n 的有序线性表,在最坏情况下,二分法查找只需比较 log2n 次,而顺序查找需要比较 n 次。
交换排序
冒泡排序法的平均执行时间是O(n2),而快速排序法的平均执行时间是O(nlog2n)。
插入类排序法
选择类排序
相比以上几种(除希尔排序法外),堆排序法的时间复杂度最小。
快速排序法:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一次排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。
快速排序每一次数据元素的移动会产生新的逆序。