数据结构与算法(第三部分-数据结构)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<
== >
T=T->lchild;
找到
T=T->rchild ;
失败! 合肥工业大学 人工智能与数据挖掘研究室
第12章 二叉查找树
查找算法的流程图
P=T P!=NULL Y X~P->data.key < P=P->lchild; = 查找成功 return P return NULL; N
查找的非递归算法:
10.2 链表
(2)双循环链表
head a1 a2
……
an
运算讨论和分析
查找 插入 删除
合肥工业大学 人工智能与数据挖掘研究室
10.3 二叉树
二叉树T:是n个结点组成的有限集合(n >= 0), n=0时为空二叉树, 否则:其中有一个根结点, 其余结点可以划分成两个互不相交的子集TL, TR, 且TL, TR也分别构成二叉树 —— 左、右子树。
队尾
合肥工业大学 人工智能与数据挖掘研究室
10.1栈和队列
队列的运算 1.队列的基本运算定义 对队列的基本运算有如下几个: (1)初始化 :设臵队列为空。 (2)判断队列为空: 若为空,则返回TRUE,否则返回FALSE. (3)判断队列为满: 若为满,则返回TRUE,否则返回FALSE. (4)取队头元素:取出队头元素。 条件:队列不空。 否则,应能明确给出标识,以便程序的处理。 (5)入队:将元素入队,即放到队列的尾部。 如果队列满,怎样处理? (6)出栈:删除当前队头的元素。
>
P=P->rchild;
合肥工业大学 人工智能与数据挖掘研究室
第12章 二叉查找树
查找的递归算法:
bnode *bstsearch(bnode *T, P=T elementtype x) { if ( T == NULL ) return T; return NULL; P!=NULL if (T -> data == x ) return T; Y N if (x < T -> data) X~P->data.key return bstsearch(T->lchild,x); else > = return bstsearch(T->rchild,x); 查找成功
引入“头结点”(附加结点)
a1 a2
……
an ^
链表运算实现讨论和分析
插入 删除 查找 构造
合肥工业大学 人工智能与数据挖掘研究室
10.2 链表
其他形式的链表
(1)单循环链表
head a1 a2
……
an
运算讨论和分析
查找 插入 删除
合肥工业大学 人工智能与数据挖掘研究室
合肥工业大学 人工智能与数据挖掘研究室
10.3 二叉树
定义1:称高度为k且有2k-1个结点的二叉树为满二叉树。 例如,高度为1~4的满二叉树如下。 A
A
B (a) 高度为1的满二叉树 A B C E F G D E I F (b) 高度为2的满二叉树 C A C G
B
D
H
J
K
L
M
N
O
(c) 高度为3的满二叉树
折叠法:
如 身份证号码:340104198805061532 先进行分组:340 104 198 805 061 532
数值分析法
合肥工业大学 人工智能与数据挖掘研究室
第11章 散列表
处理冲突: 开放地址法 Hi(k)=(H(k) + di ) % m,i=1,2,…,q q<=m 线性探测法:
合肥工业大学 人工智能与数据挖掘研究室
10.1栈和队列
队列的定义
队列是只能在一端插入,另一端删除元素的线性表。 a
a1 a2
… an a1 a2 …
n
a1 a2 … an
特性:先进先出
(FIFO:first in first out)
a1 出队 a2 … an 入队
队头
术语:队头, 队尾, 入队, 出队
1 2
……
an ∧ 尾结点
X

a3
……
an ^
//注意:两条语句顺序不能颠倒
P
合肥工业大学 人工智能与数据挖掘研究室
10.2 链表
引入“头结点”
可以降低一些操作的常数因子 在循环结构中,使得代码更加简洁 在短链表中,会造成存储的浪费
合肥工业大学 人工智能与数据挖掘研究室
10.2 链表
合肥工业大学 人工智能与数据挖掘研究室
10.1栈和队列
用两个栈来实现一个队列,并分析有关队列 操作的运行时间。 用两个队列来实现一个栈,并分析有关栈操 作的运行时间。
合肥工业大学 人工智能与数据挖掘研究室
10.2 链表
基本存储结构:
head a1 a2 a3 头指针 插入操作分析: 首元素结点 三种位臵:链表中间;链表尾;链表头 在链表中间某位臵插入时, s s -> next = p -> next; ② head p -> next = s; a a
栈底 (bottom)
入栈(压栈), 出栈(弹栈)
合肥工业大学 人工智能与数据挖掘研究室
10.1栈和队列
栈的运算
1.栈的基本运算定义 对栈的基本运算有如下几个: (1)初始化 :设臵栈为空。 (2)判断栈为空: 若为空,则返回TRUE,否则返回FALSE. (3)判断栈为满: 若为满,则返回TRUE,否则返回FALSE. (4)取栈顶元素:取出栈顶元素。 条件:栈不空。 否则,应能明确给出标识,以便程序的处理。 (5)入栈:将元素入栈,即放到栈顶。 如果栈满,怎样处理? (6)出栈:删除当前栈顶的元素。
return P P=P->rchild;
< P=P->lchild;
}
合肥工业大学 人工智能与数据挖掘研究室
第12章 二叉查找树
二叉查找树的构造: 从空树出发,依次插入各结点(作为叶子结点)。 二叉查找树中插入结点: (1)若结点的值小于根结点的值, 则往左子树中插入 ----通过递归调用插入算法来实现。 (2)若结点的值大于等于根结点的值, 则往右子树中插入(递归调用)。 按此方式递归调用若干次后, 可以搜索到一个空子树位臵,即要插入的位臵。
第12章 二叉查找树
二叉查找树的查找
如何在二叉查找树中查找给定关键字的结点? 以在下图所示树中分别查找45、55、66为例来说明。 由此可得到查找的判定过程。 T 判定过程类似于二分查找的判定过程。
50 40 30 20 35 45 47 49 55 65 67 80 70 90 100
X~T->data.key
Hi(k)=(H(k)+i)%m, m为表的规模最大质数
二次探测法 伪随机数
拉链法 再散列法
Hi(k) = ( H(k) + i2 ) % m
→H(k)→H1(k)→H2(k)→ …… →Hi(k)
合肥工业大学 人工智能与数据挖掘研究室
第11章 散列表
例:设散列表地址范围为0—9,散列函数H(K)=K%7,采 用线性探测法处理冲突,将下列数据依次插入下表中:
23,34,56,12,8,14,35,25
0 1 2 3 4 5 6 7 8 9
56
1
8
1
23 14 35 12 34 25
1 4 5 1 1 4 ASL=(1+1+1+4+5+1+1+4)/8=18/8
用此法来构造散列表可能会造成数据堆积。 装填因子——元素占空间的比例,一般建议在0.7-0.85之间
23 ^
ASL=(1*6+2*1+3*1)/8 =11/8
合肥工业大学 人工智能与数据挖掘研究室
第11章 散列表
在散列表中查找元素的过程和构造的过程基本一致: 对给定关键字k,由散列函数H计算出该元素的地址 H(k)。 若表中该位臵为空,则查找失败。 否则,比较关键字,若相等,查找成功,否则根据 构造表时所采用的处理方法找下一个地址,直至找到关 键字等于k的元素(成功)或者找到空位臵(失败)为 止。 一般在用链地址法构造的表中进行查找,比在用线性探 测法构造的表中进行查找,查找长度要小。
合肥工业大学 人工智能与数据挖掘研究室
第11章 散列表
更一般情况: 对给定的关键字key, 用一个函数H(key)计算出元素地址, 由此而得散列表(Hash表,哈希表), 其中函数H(key)称为散列函数 此函数值称为散列地址。 然而,在实际应用中,会出现这样的情况: k1≠k2,但H(k1)=H(k2) , 称这种现象为冲突现象,k1,k2为同义词。 针对冲突——如何解决冲突呢? 构造好的散列函数,以免冲突 由于冲突不可避免,因此,确切地说是减少冲突 妥善处理冲突
合肥工业大学 人工智能与数据挖掘研究室
第12章 二叉查找树
构造过程:
依次将结点作为叶结点插入到二叉查找树中 例:以下列数据序列作为输入构造一棵二叉查找树。 100,65,88,93,145,118,138,112,188,173,42,78,20, 197
100 65 42 20 78 88 118 93 112 145 188 197
(d) 高度为4的满二叉树
合肥工业大学 人工智能与数据挖掘研究室
10.3 二叉树
二叉树的二叉链表结构
T
A B C D G E F
A B ^ E F ^ C ^ ^ D ^ ^ G ^ ^
合肥工业大学 人工智能与数据挖掘研究室
第11章 散列表
实例:某班的成绩表如下表
为了能一次查找成功,在存储表的过程中, 建立key与存储地址之间的一一对应关系
合肥工业大学 人工智能与数据挖掘研究室
第12章 二叉查找树
12.1 二叉查找树 定义:
二叉查找树是一棵二叉树,或者为空,或者满足以下条件: 1)若左子树不空,则左子树中所有结点的值小于根结点的值; 2)若右子树不空,则右子树中所有结点的值不小于根结点的值; 3)左右子树都为二叉查找树。 由定义可推出二叉查找树的特点: 按照左、中、右的次序遍历, 所得到的中序序列 是非降序列。
合肥工业大学 人工智能与数据挖掘研究室
第11章 wenku.baidu.com列表
拉链法(链表法)——将同义词构成一个链表
例:散列函数H(K)=K%7,采用拉链法将下列数据依次插入下表中 23,34, 56,12,8,14,35,25
0 1 2 3 4 5 6 ^ 25 ^ 12 ^ 34 ^ 56 8 ^ 14 35 ^
bnode *bstsearch(bnode *T, elementtype x) { p=T; while ( p != NULL ) { if ( p -> data = = x ) return p; if ( x < p -> data ) p = p -> lchild; else p = p -> rchild; } return NULL; }
合肥工业大学 人工智能与数据挖掘研究室
第11章 散列表
构造散列函数的基本方法
直接定址法:H(k)= k 或者 H(k)= ak+b (a,b为任意正整数)
除留余数法:H(k)= k % p 其中p≤m,m为数组规模的最大质数。 平方取中法:
例:325在平方后取105625中间两位, 即56作为它的散列地址。
10.1 栈和队列
栈的定义
栈是只能在一端插入和删除元素的线性表。 a … a a1 2 n
a1 a2 … an an … a2 a1 特性:后进先出 ( LIFO ) ----Last in First out
入栈 (PUSH)
出栈 (POP) 栈顶 (top)
an an-1
……
a1
术语:栈顶, 栈底,
数据结构与算法
(第三部分 数据结构) 胡学钢
计算机与信息学院
2009年10月
合肥工业大学 人工智能与数据挖掘研究室
使用指针表示动态集合 栈、队列、链表、有根树等
合肥工业大学 人工智能与数据挖掘研究室
第三部分 数据结构
第十章 基本数据结构 栈和队列(简要回顾)
合肥工业大学 人工智能与数据挖掘研究室
合肥工业大学 人工智能与数据挖掘研究室
第12章 二叉查找树
二叉查找树实例
50 40 70 50
40 90
30 20 47 35 35 60 45 65
70
90 67 80 100
30
20
47
35 45 46 55 49
65
67 80 100
是否可以这样描述二叉查找树的定义? (1)二叉查找树是满足如下条件的二叉树: 其中每个结点的值大于其左子树中所有结点的值, 小于或等于其右子树中所有结点的值。 (2)二叉查找树是满足如下条件的二叉树: 其中每个结点的值大于其左孩子结点的值,小于或等于其右孩子结点的值。 合肥工业大学 人工智能与数据挖掘研究室
相关文档
最新文档