(一)概述
1.理解数据的逻辑结构与存储结构的基本概念。
(一)数据的逻辑结构
1,集合:数据元素之间无其他的关系,仅仅属于同一集合而已
2,线性结构:数据元素之间存在一一对应的关系,其开始节点和终端节点具有唯一性,除了开始开始节点和终端节点,其他的元素有且仅有一个前驱节点和后继节点,线性表就是一个典型。
3,树形结构:数据元素之间存在着一一对应的关系,每一个数据与水元素只有一个前驱节点,但是却又很多后继节点 终端节点可以有多个。二叉树就是一个典型。
4,图形结构:即又称为非线性结构,数据元素之间存在着多对多的关系,其前驱节点和后继节点的个数可以是任意多个,
四种逻辑结构存在着关系:树形结构是图形结构的特殊形式,而线性结构又是树形结构的特殊形式。
(二)数据的存储结构
1,顺序存储结构:把逻辑上相邻的数据存储在物理位置上相邻的存储单位里,用物理位置上的相邻来体现逻辑上的相邻,此种存储结构的又在于节省了存储空间,因为分配给数据的存储单元完全用于了数据的存储,数据之间的逻辑关系没有占用存储空间,可以实现对数据的随机存取,每个节点对应一个序号,由这个序号可以计算出数据的存储地址,缺点在于不变于数据的修改,对数据的插入和删除可能要移动一系列的数据。
2,链式存储结构:逻辑上相邻的两个数据元素不一定在物理位置上也要相邻,数据元素之间的相邻是用添加的指针来标识的,优点在于由于不要求在物理上的相邻,所以在进行插入,删除等时,只需要改变相邻节点的指针域,不必移动数据的位置,相对于顺序结构,链式的缺点在于存储空间利用率太低,因为存储数据的一部分单元用于了存储数据之间的逻辑关系,由于相邻的节点在物理位置上不一定相邻,所以不能进行随机存在。
3,索引存储结构:该结构在存储数据元素的同时,还建立了一个附加的索引表,索引表中的每一项称为索引项(关键字,地址),关键字唯一标识一个数据元素 ,地址是指向数据元素的指针,采用了索引的存储结构可以所及存取数据元素,在进行插入,删除等时,只需要移动相应索引表中的地址,不必移动数据,故而大大提高了数据的查找速度,缺点在于添加了索引表,降低了存储空间的利用率
4,散列(哈希)存储结构:就是根据数据元素的关键字通过哈希函数计算出一个数值用做数据元素的存储地址,优点在于查找速度快,只需要给出关键字可立即计算出该数据元素的地址 特点是指存储数据元素不存储数据之间的逻辑关系,只适合进行快速查找和插入的场合
2.理解算法定义、基本性质以及算法分析,包括时间复杂度和空间复杂度的计算。
算法的定义:对解决方案准确而完整的描述,是解决问题的操作步骤。
算法是指解题方案的准确而完整的描述,算法不等于程序,也不等于计算方法
设计算法时不仅要考虑对数据对象的运算和操作,还要考虑算法的控制结构。
基本特征:1可行性、2确定性、3有 穷性、5足够情报【拥有足够的输入信息和初始化信息】
1、时间复杂度
时间复杂度:执行算法所需要的计算 工作量。计算工作量用算法所执行的基本运算次数衡量=f(n),n 为问题规模
平均形态;最坏情况复杂度、
算法时间复杂度与算法程序执行的具体时间是不一致的
2、空间复杂度
空间复杂度:执行此算法所需要内存空间。
输入数据所占内存,程序本身所占内存;算法执行过程所需要额外空间
算法 时间复杂度和空间复杂度与算法所处理数据 的存储结构有直接关系;
由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此数据的逻辑结构和存储结构不是一一对应的
(二)线性表
1.理解线性关系、线性表的定义和线性表的基本操作。
线性关系:里面的每一个元素都是平等的,每个节点至多有一个前驱和一个后继。头部没有前驱,尾部没有后继。其结构类似于一维数组的结构。
线性表的定义:是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。
线性表的基本操作
1)MakeEmpty(L) 这是一个将L变为空表的方法
2)Length(L) 返回表L的长度,即表中元素个数
3)Get(L,i) 这是一个函数,函数值为L中位置i处的元素(1≤i≤n)
4)Prior(L,i) 取i的前驱元素
5)Next(L,i) 取i的后继元素
6)Locate(L,x) 这是一个函数,函数值为元素x在L中的位置
7)Insert(L,i,x)在表L的位置i处插入元素x,将原占据位置i的元素及后面的元素都向后推一个位置
8)Delete(L,p) 从表L中删除位置p处的元素
9)IsEmpty(L) 如果表L为空表(长度为0)则返回true,否则返回false
10)Clear(L)清除所有元素
11)Init(L)同第一个,初始化线性表为空
12)Traverse(L)遍历输出所有元素
13)Find(L,x)查找并返回元素
14)Update(L,x)修改元素
15)Sort(L)对所有元素重新按给定的条件排序
16) strstr(string1,string2)用于字符数组的求string1中出现string2的首地址
2.掌握线性表的顺序存储结构与链式存储结构(包括单链表、循环链表和双向链表)的构造原理。
① 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。
优点:存储密度大(=1),存储空间利用率高。缺点:插入或删除元素时不方便。
②链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
优点:插入或删除元素时很方便,使用灵活。缺点:存储密度小(<1),存储空间利用率低。 顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。
若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;
若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
单链表
(一)概述 1.理解数据的逻辑结构与存储结构的基本概念。 (一)数据的逻辑结构 1,集合:数据元素之间无其他的关系,仅仅属于同一集合而已 2,线性结构:数据元素之间存在一一对应的关系,其开始节点和终端节点具有唯一性,除了开始开始节点和终端节点,其他的元素有且仅有一个前驱节点和后继节点,线性表就是一个典型。 3,树形结构:数据元素之间存在着一一对应的关系,每一个数据与水元素只有一个前驱节点,但是却又很多后继节点 终端节点可以有多个。二叉树就是一个典型。 4,图形结构:即又称为非线性结构,数据元素之间存在着多对多的关系,其前驱节点和后继节点的个数可以是任意多个, 四种逻辑结构存在着关系:树形结构是图形结构的特殊形式,而线性结构又是树形结构的特殊形式。 (二)数据的存储结构 1,顺序存储结构:把逻辑上相邻的数据存储在物理位置上相邻的存储单位里,用物理位置上的相邻来体现逻辑上的相邻,此种存储结构的又在于节省了存储空间,因为分配给数据的存储单元完全用于了数据的存储,数据之间的逻辑关系没有占用存储空间,可以实现对数据的随机存取,每个节点对应一个序号,由这个序号可以计算出数据的存储地址,缺点在于不变于数据的修改,对数据的插入和删除可能要移动一系列的数据。 2,链式存储结构:逻辑上相邻的两个数据元素不一定在物理位置上也要相邻,数据元素之间的相邻是用添加的指针来标识的,优点在于由于不要求在物理上的相邻,所以在进行插入,删除等时,只需要改变相邻节点的指针域,不必移动数据的位置,相对于顺序结构,链式的缺点在于存储空间利用率太低,因为存储数据的一部分单元用于了存储数据之间的逻辑关系,由于相邻的节点在物理位置上不一定相邻,所以不能进行随机存在。 3,索引存储结构:该结构在存储数据元素的同时,还建立了一个附加的索引表,索引表中的每一项称为索引项(关键字,地址),关键字唯一标识一个数据元素 ,地址是指向数据元素的指针,采用了索引的存储结构可以所及存取数据元素,在进行插入,删除等时,只需要移动相应索引表中的地址,不必移动数据,故而大大提高了数据的查找速度,缺点在于添加了索引表,降低了存储空间的利用率 4,散列(哈希)存储结构:就是根据数据元素的关键字通过哈希函数计算出一个数值用做数据元素的存储地址,优点在于查找速度快,只需要给出关键字可立即计算出该数据元素的地址 特点是指存储数据元素不存储数据之间的逻辑关系,只适合进行快速查找和插入的场合 2.理解算法定义、基本性质以及算法分析,包括时间复杂度和空间复杂度的计算。 算法的定义:对解决方案准确而完整的描述,是解决问题的操作步骤。 算法是指解题方案的准确而完整的描述,算法不等于程序,也不等于计算方法 设计算法时不仅要考虑对数据对象的运算和操作,还要考虑算法的控制结构。 基本特征:1可行性、2确定性、3有 穷性、5足够情报【拥有足够的输入信息和初始化信息】 1、时间复杂度 时间复杂度:执行算法所需要的计算 工作量。计算工作量用算法所执行的基本运算次数衡量=f(n),n 为问题规模 平均形态;最坏情况复杂度、 算法时间复杂度与算法程序执行的具体时间是不一致的 2、空间复杂度 空间复杂度:执行此算法所需要内存空间。 输入数据所占内存,程序本身所占内存;算法执行过程所需要额外空间 算法 时间复杂度和空间复杂度与算法所处理数据 的存储结构有直接关系; 由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此数据的逻辑结构和存储结构不是一一对应的 (二)线性表 1.理解线性关系、线性表的定义和线性表的基本操作。 线性关系:里面的每一个元素都是平等的,每个节点至多有一个前驱和一个后继。头部没有前驱,尾部没有后继。其结构类似于一维数组的结构。 线性表的定义:是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。 线性表的基本操作 1)MakeEmpty(L) 这是一个将L变为空表的方法 2)Length(L) 返回表L的长度,即表中元素个数 3)Get(L,i) 这是一个函数,函数值为L中位置i处的元素(1≤i≤n) 4)Prior(L,i) 取i的前驱元素 5)Next(L,i) 取i的后继元素 6)Locate(L,x) 这是一个函数,函数值为元素x在L中的位置 7)Insert(L,i,x)在表L的位置i处插入元素x,将原占据位置i的元素及后面的元素都向后推一个位置 8)Delete(L,p) 从表L中删除位置p处的元素 9)IsEmpty(L) 如果表L为空表(长度为0)则返回true,否则返回false 10)Clear(L)清除所有元素 11)Init(L)同第一个,初始化线性表为空 12)Traverse(L)遍历输出所有元素 13)Find(L,x)查找并返回元素 14)Update(L,x)修改元素 15)Sort(L)对所有元素重新按给定的条件排序 16) strstr(string1,string2)用于字符数组的求string1中出现string2的首地址 2.掌握线性表的顺序存储结构与链式存储结构(包括单链表、循环链表和双向链表)的构造原理。 ① 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。 优点:存储密度大(=1),存储空间利用率高。缺点:插入或删除元素时不方便。 ②链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针 优点:插入或删除元素时很方便,使用灵活。缺点:存储密度小(<1),存储空间利用率低。 顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。 若线性表的长度变化不大,且其主要操作是查找,则采用顺序表; 若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。 单链表
循环链表
双向链表
顺序表插入:data[j] = data[j - 1];删除:data[j - 1] = data[j];查找:if (data[i] == x) 链表建立:L=(LinkList)malloc(sizeof(LNode)); L->next=NULL;插入:s->data=e; s->next=p->next; p->next=s;删除:q=p->next; p->next=q->next; e=q->data;查找:p = L->next; while (p!=NULL&&p->data!=e) { p = p->next;return p; } 4.掌握链表的常用应用。 (三)栈和队列 1.理解栈与队列的基本概念与基本操作。 栈:限定只在表的一端(表尾)进行,插入和删除操作的线性表,特点:后进先出(LIFO),允许插入和删除的一端称为栈顶 (top),另一端称 为栈底(bottom)。 栈的基本操作:栈的初始化操作,取栈顶元素,进栈操作,退栈操作 队列是限定在表的一端进行删除,在表的另一端进行插入操作的线性表。允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。特性:FIFO(First In First Out) 队伍基本操作 :初始化,求队列的长度 ,入队,出队,判队空,判队满,取队头元素
栈的顺序存储结构:限定在表尾进行插入和删除操作的顺序表。 栈的链式存储结构:不带头结点的单链表,其插入和删除操作仅限制在表头位置上进行。链表的头指针即栈顶指针 队列的顺序存储结构:顺序队列用一组地址连续的存储单元依次存放从队列头到队列尾的元素 队列的链式存储结构:实质是带头结点的线性链表
栈实施插入:void StackPush(Stack* s,int v) { s->array[s->size++] = v; }删除:void StackPop(Stack* s,int v) { s->size--; } 队列实施插入:if (q->head == NULL) { q->head = node; q->last = node; } else { q->last->next = node; q->last = node; } 删除: Node* second = q->head->next; free(q->head);q->head = second; 4.掌握栈和队列在解决实际问题中应用。例如:递归过程、表达式求值、数制转换、迷宫求解、排队问题等。 (四)串、数组和广义表 1.理解串的基本概念及其顺序和链式存储结构。 串的定义:由零个或多个字符组成的有限序列。 串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。一般是用定长数组来定义。 对于串的链式存储结构,与线性表是相似的。但是由于串结构的特殊性(结构中的每个元素数据是一个字符),如果也简单的应用链表存储串值,即一个结点对应一个字符,就会造成很大的空间浪费。
BF算法的思想:主串S的第一个字符与模式串T的第一个字符进行匹配。若相等,则继续比较主串S的第二个字符和模式串T的第二个字符;若不相等,则比较主串S的第二个字符和模式串T的第一个字符,依次比较下去,直到得出最后的匹配结果。 串的模式匹配KMP思想 :设有主串s和子串t,子串t的定位就是要在主串s中找到一个与子串t相等的子串。通常把主串s 称为目标串,把子串t称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串t;不成功则指目标串s中不存在模式串t。
数组的顺序存储结构:一维数组在内存中的存放很简单,只要顺序存放在连续的内存单元即可
压缩存储:把矩阵中值相同的在物理上只存储一次,0不存储 5.理解广义表的基本概念、存储结构。 广义表定义: 广义表:由零个原子,或若干个原子或若干个广义表组成的有穷序列。广义表也称为列表,是线性表的一种扩展,也是数据元素的有限序列。记作:LS= (d0 , d1 , d2 , . . . . . .dn-1)。其中di既可以是单个元素,也可以是广义表。 (五)树与二叉树 1.理解树与二叉树的基本概念,名词术语。 树:1、一个结点x组成的集{x}是一株树(Tree),这个结点x也是这株树的根。假设x是一个结点,T1,T2,…,Tk是 k 株互不相交的树,我们可以构造一株新树:令x为根,并有k条边由x指向树T1,T2,…,Tk。这些边也叫做分支,T1,T2,…,Tk称作根x的树之子树。 二叉树:有限个结点的集合,这个集合或者是空集,或者是由一个根结点和两株互不相交的二叉树组成,其中一株叫根的做左子树,另一棵叫做根的右子树。 满二叉树:深度为k且有2k -1个结点的二叉树称为满二叉树。 完全二叉树:深度为 k 的,有n个结点的二叉树,当且仅当其每个结点都与深度为 k 的满二叉树中编号从 1 至 n 的结点一一对应,称之为完全二叉树。 线索二叉树:若结点p有左孩子,则p->lchild指向其左孩子结点,否则令其指向其(中序)前驱。若结点p有右孩子,则p->rchild指向其右孩子结点,否则令其指向其(中序)后继。
性质1 若二叉树的层次从1开始, 则在二叉树的第 i 层最多有 2i-1个结点。(i ³ 1) [证明用数学归纳法] 性质2 深度为k的二叉树最多有 2k-1个结点。(k ³ 1) [证明用求等比级数前k项和的公式] 性质3 对任何一棵二叉树, 如果其叶结点个数为 n0 , 度为2的非叶结点个数为 n2 , 则有 n0=n2+1 性质3:对任意一棵二叉树,如果叶子结点个数为n0,度为2的结点个数为n2,则有n0=n2+1。 性质4 具有n个结点的完全二叉树的深度为ëlog2nû +1 性质5 如果将一棵有n个结点的完全二叉树的结点按层序(自顶向下,同一层自左向右)连续编 号1, 2, …, n,然后按此结点编号将树中各结点顺序地存放于一个一维数组中, 并简称编号为 i的结点为结点i (1 £ i £ n)。则有以下关系: n 若i == 1, 则 i 是二叉树的根,无双亲 若i > 1, 则 i 的双亲为ëi /2û n 若2*i ≤ n, 则 i 的左孩子为2*i,否则无左孩子 若2*i+1 ≤ n, 则 i 的右孩子为2*i+1,否则无右孩子 n 若 i 为偶数, 且i != n, 则其右兄弟为i+1 若 i 为奇数, 且i != 1, 则其左兄弟为i-1 n i 所在层次为 ëlog2 iû +1
左孩子右兄弟 树到二叉树的转换及还原关键点:树结点的第一个孩子作为二叉树结点的左孩子结点;树结点的第一个兄弟结点,作为二叉树结点的右孩子结点。
递归遍历:由二叉树的递归定义可知,遍历一棵二叉树便要决定对根节点N,左子树L和右子树R的访问顺序,所以按照先遍历左子树后遍历右子树的原则,常见的遍历次序有先序(NLR),中序(LNR)和后序(LRN)三种遍历算法; 非递归遍历:递归方法是相对简单的,这是由二叉树的结构决定的;但非递归的思路也是比较简单的只是算法实现相对麻烦很多;那么根据递归变非递归的方法,我们可以借用栈来解决这个问题。 5.掌握以二叉链表形式存储的二叉树遍历算法的应用。 6.掌握哈夫曼树基本概念,哈夫曼树和哈夫曼编码的构造和算法设计。 哈夫曼树:带权路径长度达到最小的二叉树即为哈夫曼(最优二叉树)。在哈夫曼树中,权值大的结点离根最近。 哈夫曼编码:对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各分支的赋值分别构成一个二进制串,该二进制串就为哈夫曼编码。哈夫曼编码是最优的前缀编码 (六)图 1.理解图的基本概念和名词术语。 图:一个图G=(V,E)是一个由非空的有限集 V和一个边集E所组成的。若E中的每条边都是顶点的有序对(v , w),就说该图是有向图(directed graph,digraph)。若E中的每条边是两个不同顶点无序对,就说该图是无向图,其边仍表示成(v, w)。
邻接矩阵:定义一个一维数组V[0..n-1]存放所有顶点信息;定义一个二维数组E[0..n01][0..n-1],存放所有顶点之间的关系,该矩阵就是邻接矩阵E[i][j]:值为1,代表顶点vi,vj之间有边,值为0,代表vi,vj之间无边 对于带权的图,有E[i][j]:wij表示边的权值,无穷大,表示无边 特点:无向图的邻接矩阵一定是对称矩阵 ,因为vi,vj有边,那么vj,vi也有边;不带权的有向图的邻接矩阵一般是稀疏矩阵;无向图的第 i 行或者i列 的非0或者非无穷大的元素个数就是顶点 vi 的度;有向图中第 i 行非0或者非无穷的元素个数代表顶点vi的出度第 i 列非0或者非无穷的元素个数代表顶点vi的入度 邻接表: 构造:每个链表设置一个头结点,用来存放一个顶点的数据信息,称之为顶点结点 其构造为 vertex linkvertex存放顶点数据信息,link指向链表中的第一个结点地址 n个头结点之间是一维数组;第i个链表中的每一个链结点(称之为边结点)表示以第i个顶点为出发点的一条边,其构造为 adjvex weight next 其中,next指向下一条边结点,weight为带权边的权值,不带权的无此数据域,adjvex表示以第i个结点为出发点的边的另一端的结点在数组中的位置 特点:无向图中第i个链表中链结点的个数就是顶点i的度;有向图中第i个链表中链结点的个数就是顶点i的出度;图中有n个顶点,e条边,则 无向图需要n个头结点,2e个边结点有向图需要n个头结点,e个边结点无向图边结点总数一定是偶数,边结点个数为奇数的一定是有向图. 逆邻接表:第i个链表的边界点表示第i个顶点为终止点的边
深度优先搜索遍历算法执行如下: (1) 首先访问顶点i,并将其访问标记置为访问过,即visited[i]=1; (2) 然后搜索与顶点i有边相连的下一个顶点j,若j未被访问过,则访问它,并将j的 访问标记置为访问过,visited[j]=1,然后从j开始重复此过程,若j已访问,再看与i有 边相连的其它顶点; (3) 若与i有边相连的顶点都被访问过,则退回到前一个访问顶点并重复刚才过程,直到图中所有顶点都被访问完止。 广度优先搜索的思想 按上述所说,采用队列是合适的。 ⑴开始时要将其置空。 ⑵在每访问一个顶点时,要将其入队。 ⑶在访问一个顶点的所有后继时,要将其出队。 ⑷若队列为空时,说明每一个访问过的顶点的所有后继均已访问完毕,因而本次遍历可以结束。若此时还有未访问的顶点,需要另选起点进行遍历。
最小生成树:在一般情况下,图中的每条边若给定了权,这时,我们所关心的不是生成树,而是生成树中边上权值之和。若生成树中每条边上权值之和达到最小,称为最小生成树.最小生成树的两种方法:普里姆算法(归并顶点)和克鲁斯卡尔算法(归并边)。 普里姆方法的思想是:在图中任取一个顶点K作为开始点,令U={k},W=V-U,其中V为图中所有顶点集,然后找一个顶点在U中,另一个顶点在W中的边中最短的一条,找到后,将该边作为最小生成树的树边保存起来,并将该边顶点全部加入U集合中,并从W中删去这些顶点,然后重新调整U中顶点到W中顶点的距离, 使之保持最小,再重复此过程,直到W为空集止。 克鲁斯卡尔算法的基本思想是:将图中所有边按权值递增顺序排列,依次选定取权值 较小的边,但要求后面选取的边不能与前面选取的边构成回路,若构成回路,则放弃该条边,再去选后面权值较大的边,n个顶点的图中,选够n-1条边即可。
在这种有向图中,顶点表示活动,有向边表示活动的优先关系,这有向图叫做顶点表示活动的网络简称为AOV网。 下面将介绍怎样实现拓扑排序,实现步骤如下: (1)在AOV网中选一个入度为0的顶点且输出之; (2)从AOV网中删除此顶点及该顶点发出来的所有有向边; (3)重复(1,2)两步,直到AOV网中所有顶点都被输出或网中不存在入度 为0的顶点 (七)查找 1.掌握顺序查找、折半查找和分块查找的查找算法的设计与算法复杂性的分析过程。 顺序查找思想 顺序查找是用待查找记录与查找表中的记录逐个比较,若找到相等记录,则查找成功,否则,查找失败。 折半查找(二分查找) 折半查找的前提条件是:查找表有序(非等概率查收每一个元素)。 折半查找思想折半查找(Binary Search)是用待查找元素的key与查找表的“中间位置”的元素的关键字进行比较,若它们的值相等,则查找成功。若查找元素key大于查找表的“中间位置”的元素的关键字的值,则在查找表的中间位置的后端范围内,继续使用折半查找。否则,则在查找表的中间位置的前端范围内,继续使用折半查找。直到查找成功或者失败为止。 分块查找,又称索引顺序查找,性能介于顺序查找和折半查找之间。
二叉排序树查找:前提是将查找表组织成为一棵二叉排序树。 思想:若二叉排树为空,则查找失败,否则,先拿根结点值与待查值进行比较,若相等,则查找成功,若根结点值大于待查值,则进入左子树重复此步骤,否则,进入右子树重复此步骤,若在查找过程中遇到二叉排序树的叶子结点时,还没有找到待找结点,则查找不成功。
平衡二叉树查找:前提是首先要调整成一棵平衡二叉排序树。 (左大右小) 思想:若平衡二叉树为空,则查找失败,否则,先拿根结点值与待查值进行比较,若相等, 则查找成功,若根结点值大于待查值,则进入左子树重复此步骤,否则,进入右子树重复此步骤,若在查找过程中遇到平衡二叉树的叶子结点时,还没有找到待找结点,则查找不成功。
散列查找(hash查找) 优点:不通过大量无效的比较,就能直接找到待查关键字的位置的查找方法 基本术语: ① Hash方法:在存放记录时,通过相同函数计算存储位置,并按此位置存放,这种方法称为 Hash方法。 ② Hash函数:是指在Hash方法中使用的函数。 ③ Hash表:按Hash方法构造出来的表称为Hash表 ④ Hash地址:通过Hash函数计算记录的存储位置,我们把这个存储位置称为Hash地址。 ⑤ 冲突(Collision):不同记录的关键字经过Hash函数的计算可能得到同一Hash地址,即 key1≠key2时,H(key1)=H(key2)。这种现象叫做“冲突” 处理冲突的方法 :①开放地址法② 链地址法③ 建立公共溢出区 (八)内部排序 1.理解排序的基本概念,各种内排序方法的基本原理和特点,包括排序过程中进行的元素之间的比较次数,排序总趟数、排序稳定性以及时间复杂度与空间复杂度计算。
2.掌握直接插入排序、折半插入排序、选择排序、起泡排序、希尔排序、快速排序、堆排序、二路归并排序、基数排序的排序思想; 直接插入排序基本思想:当插入第i个数据对象时,前面的数据对象V1,V2,…,Vi-1已经排好序,此时用vi的关键码与V1,V2,…,Vi-1的关键码顺序进行比较,找到插入位置j,即将Vi插入,位置j以后的对象向后顺移。 折半插入排序本思想:当插入第i个数据对象时,前面的数据对象V1,V2,…,Vi-1已经排好序,此时用vi的关键码与V1,V2,…,Vi-1的关键码按折半方法进行比较,找到插入位置j,即将Vi插入,位置j以后的对象向后顺移。 简单选择排序基本思想:在每一趟带排序的记录中选出关键字最小的记录,按照顺序排放在已经排好序的记录序列的最后,直到序列全部有序。 冒泡排序基本思想:通过两两比较相邻的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般向上漂浮,或者使关键字大的记录像石头一样逐渐向下坠落。 Shell 排序该方法是由D.L.Shell在1959年提出的,又称缩小增量排序,基本思想:设待排序的数据对象有n个,首先取一个整数d < n作为间隔,将全部对象分为d个子序列,所有距离为d的对象放在同一个序列中,在每一个子序列中分别施行直接插入排序,然后缩小间隔d,如取d=d/2,重复上述的子序列划分和排序工作,直到最后取d为1为止。 快速排序基本思想:是取待排序的结点序列中某个结点的值作为控制值,采用某种方法把这个结点放到适当的位置,使得这个位置的左边的所有结点的值都小于等于这个控制值,而这个位置的右边的所有结点的值都大于等于这个控制值。然后分别对这两个子序列重复实施上述方法。 路归并基本思想:假设初始的对象序列有n个数据对象,我们首先把它看成是n个长度为1的有序子序列,先做两两归并,得到n/2个长度为2的归并项(如果n为奇数,则最后一个有序子序列的长度为1);再做两两归并,……,如此重复,最后得到一个长度为n的有序序列。 基数排序(Radix Sort)的基本原理,采用“分配”和“收集”的办法,用对多关键码进行排序的思想实现对单关键码进行排序的方法。 3.了解各种内部排序算法的应用。 1. 若n较小(n<=50), 则可以采用直接插入排序或简单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当记录本身信息量较大时,用简单选择排序较好。 2. 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。 3. 若n较大,则应采用时间复杂度为0(logn)的排序方法:快速排序、堆排序或归并排序。快速排序被 认为是目前基于比较的内部排序法中最好的方法。 4. 当待排序的关键字是随机分布时,快速排序的平均时间最短。堆排序所需的辅助空间少于快速排 序,并且不会出现快速排序可能出现的最坏情况,这两种排序都是不稳定的。 5. 若要求排序稳定且时间复杂度为O(nlog2n),则可选用归并排序。但本章介绍的从单个记录起进行两两归并的排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并。直接插入排序是稳定的,因此改进后的归并排序仍 是稳定的。 | |||||||||