上海金融学院信息管理系

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
i 0 i 0 i 1
1.7.1 顺序查找法
讨论:假如各结点的相对使用概率各不相 同,且差异较大,那么,要使平均比较次数降
ip
i 1
n
i 1
下来,只有想办法让相对使用概率较大的结点 排列在线性表的始端。 方法一 找到的结点移到线性表的最前面 方法二 找到的结点向始端移动一个位置
1.7.1 顺序查找法
1 若对于一切 i 都有 pi n
AVG(顺序查找法)
1 1 n(n 1) n 1 n i * n n * 2 2 2 = i 1
n

1.7.1 顺序查找法
2. 算法 (1)在顺序存储(数组)下,进行顺序查找 程序seque1 (p.47) 一般思路 程序seque2 (pp. 47-48) 改进的方法
1. 用开式寻址法解决冲突
(2)插入 若要存储键值k,那么计算h(k)若得i,便考察 t[i]。若t[i]为空(t[i]==0),则将k存入t[i],结束; 若t[i]不空(t[i]!=0),则判断t[i]是否等于k,若是, 说明k已存储在Hash表中,结束。 若t[i]不空,k又未存入(t[i]!=K),则依次探 索后面位置t[(i+1)%m], t[(i+2)%m], t[(i+3)%m], …, t[(i+m-1)%m],一旦有空位置, 则将k存入;若到最后仍然没有空位置,则插入失 败。 p. 53 insert1( )
1.7.3 分块查找法
2. 分块查找法的评价 MAX(分块查找法) =max{(i+1)+ni|i=0, 1, …, m-1} AVG(分块查找法) m 1 ni 1 (i 1 j ) n i 0 j 1
1.7.3 分块查找法
2. 分块查找法的评价 如果块的大小相同,即每个块的结点数为 f=n/m 那么, MAX(分块查找法)=m+f
复习递归
一、定义 若一个对象部分地包含它自己,或用它 自己给自己定义,则称这个对象是递归的; 而且若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。
复习递归
二、递归方法 1. 定义是递归的 (1)阶乘 n! 当n=0时,n!=1; 当n>0时,n!=n(n-1)! long factorial ( long n) { if (n==0) return (1); else return n*factorial(n-1); }
1. 用开式寻址法解决冲突
(3)查找 若要查找键值k,那么计算h(k),若得i,则 考察t[i]。若t[i]==k,则查找成功,结束;若 t[i]!=k,则依次考察后面的t[(i+1)%m], t[(i+2)%m], t[(i+3)%m], …, t[(i+m-1)%m]: 若某个位置的键值为k,成功; 若找到一个空位置(t[j]==0),则失败; 若循环一周,最后仍未找到k,则失败。 p. 53 search1( )
1.7.2 二分查找法
2.算法 若需从存储在a[ ]中,按键值递增次序排列 的n个结点的线性表中查找键值为v的结点,则 (1) i=0, j=n-1; (2) 若 i>j,则查找失败,结束;否则,进 入下一步; (3) m=(i+j)/2; (4) 若v==a[m],则查找成功,结束;否 则进入下一步; (5) 若v<a[m],则j=m-1;否则i=m+1。 转到(2)继续执行。
3.
1.7.2 二分查找法
(2)平均比较次数 为了讨论简便,假设各结点的相对 使用概率相同,均为1/n;且结点个数 n = 2t – 1 (t≥0) 那么, AVG(二分查找法) = ?
AVG(二分查找法) 1 (1 2 21 3 2 2 t 2t 1 ) n 1 t i 2i 1 n i 1 1 t [ 2 (t 1) 1] n 1 {2 log2 ( n 1) [log2 ( n 1) 1] 1} n 1 {( n 1)[log2 ( n 1) 1] 1} n n 1 log2 ( n 1) 1 n log2 n
1. 概念
(2)广义表A =(a0, a1, …, an-1)中, a0为广义表A的表头; (a1, …, an-1)为广 义表A的表尾,分别记为 head(A)= a0 tail(A)= (a1, …, an-1) 注意:用大写字母表示广义表 用小写字母表示广义表的原子
1. 概念
(3)广义表的定义是递归的。
概念 设pi为结点 ki的相对使用概率,si为 查找结点ki所需的比较次数,则查找方法A 有 MAX(A)=max{si|i=0,1, …, n-1} n 1 p i si i 0 AVG(A)=
1.7 线性表的查找
1.7.1 1.7.2wenku.baidu.com1.7.3 1.7.4 顺序查找法 二分查找法 分块查找法 HASH查找法
(一)Hash函数
4.
除法(除留余数法) 找一个略小于Hash表容量大小的质数p,对 于键值k,取(k%p)作为这个结点的Hash地 址。
(一)Hash函数
5. 基数转换法 将键值k看成另一数制上的一个数,然后 把它转换成原来数制的数,再取其低位上的若 干位作为这个结点的Hash地址,所取的位数和 Hash表的地址位数相同。
2. 用拉链法解决冲突
拉链法解决Hash表的冲突 pp. 54-55 插入、查找和删除的程序
1.8 广义表
广义表是线性表的一种推广。 1.8.1 广义表的概念和存储结构 1.8.2 广义表递归算法的实现
1.8.1 广义表的概念和存储结构
1. 概念 (1)广义表A: n个元素a0, a1, …, an-1组 成的有序序列,其中元素ai(0≤ai≤n-1)是数据 元素或者是广义表,记为A=(a0, a1, …, an-1)。 n是广义表的长度。 若元素ai是数据元素,则称为A的原子; 若元素ai是广义表,则称为A的子表。
(一)Hash函数
2.
移位法(折叠法) 假若Hash表的地址的位数为t,将键值分成 位数为t的若干段(最后一段可能小于t), 再将各段按位对齐相加,在结果中从最低位 开始,取t位作为Hash地址。
(一)Hash函数
3.
平方取中法 将键值平方,取最中间的若干位(与Hash 表地址的位数相同),作为Hash地址。
1. 概念
(4)广义表定义提供了便利: 一个广义表可被其他广义表共享。
如:B=(A, A, a) C=(b, A) 其中:A是上面定义的广义表。
1. 概念
举例: D=( ) A=(a, (b, c)) B=(A, A, ( )) C=(a, C) D为空表,长度为0;A的长度为2, head(A)=a,tail(A)=((b, c)),head(tail(A))=(b, c),tail(tail(A))=( );B的长度为3,head(B)=A, tail(B)=(A, ( )); C的长度为2,是个递归定义 的无限表(a, (a, (a, (a, (…)))))
(3)
三点认识 对于一个较为复杂的问题,有时可分 解为相对简单且解法相同或类似的子问题。 如5!=5*4! 当分解后的子问题可直接解决,就停 止分解。可直接求解的问题,叫做递归结 束条件。 递归定义的函数可简单用递归过程来 编程求解。
复习递归(二、递归方法)
2. 数据结构是递归的 链表结构定义是递归的 struct node { int data; struct node *link; } *head, *p;
1.7.3 分块查找法
1. 概念 若线性表F=(k0, k1, k2, …, kn-1)已按键值 排好序。现在不改变结点次序,将F截成m段, 分别称为块F0, F1, F2, …, Fm-1,各块长度分别为 n0, n1, n2, …, nm-1。显然,每块的最后一个结点 的键值在这块中最大。 为找键值为v的结点,只需依次将Fj (j=0, 1, …, m-1)的最后一个结点的键值与v比较,找 到最后一个满足v≤key(k)的块;然后在这块中 进行顺序查找。
1.7.1 顺序查找法
1.
概念 顺序查找法 即将线性表中的结点k0, k1, …, kn-1的键值依次同给定的键值v作比 较,若找到所需结点,则成功;反之,则失 败。 MAX(顺序查找法) = n AVG(顺序查找法) n 1 n 1 n = si pi i 1 pi ipi 1
1.7.1 顺序查找法
2. 算法 (2)在链接存储下,进行顺序查找
程序seque3 (p.48)
1.7 线性表的查找
1.7.2 二分查找法 1.说明 只适用于顺序存储下,且结点按键值递增 次序排列的线性表的情况 (1)顺序存储:数组 (2)键值:唯一性,保证严格递增 (3)若递减情况,则教科书上算法要进 行修改,不能照套
1.7.2 二分查找法
2.算法 程序bisect( ) (pp. 48-49)
1.7.2 二分查找法
二分查找法的评价 (1)最大比较次数 为了讨论简便,假设线性表的结点个数 n = 2t – 1 (t≥0) 第一次“二分”以后,没有找到,那么,要 找的结点数还剩 2t-1-1 如此下去,直到最后一次,共需比较t次。 MAX(二分查找法) = t = log2(n+1) ≈log2n 如15个结点,需要4次。
1.7.4 Hash 查找法
(二)解决冲突的方法
1. 用开式寻址法解决冲突 2. 用拉链法解决冲突
1. 用开式寻址法解决冲突
为了问题简单,处理的数据就简化为键值。 (1)工作准备 设数组t[m]为Hash表,h(x)为hash函数, 再假设键值为大于0的整数。 初始化Hash表,即将0送入t[m]的每个元 素。 p. 52 makenull1( )
问题: (1)选择Hash函数 要求计算简便、避免冲突 (2)如何解决冲突 在存储和查找中如何应对冲突
1.7.4 Hash 查找法
(一)Hash函数 1. 数字分析法 将键值中选取某些数字分布比较均匀的位 构成Hash地址,所选取的位数和Hash表的地址 位数相同。 这种做法适用于对键值的总体情况明了的 情况。
1. 定义是递归的
(2)
斐波那契数列 当n=0或1时,fib(n)=n; 当n>1时, fib(n)=fib(n-1)+fib(n-2) long fib (long n) { if(n<=1) return (n); else return fib(n-1)+fib(n-2); }
1. 定义是递归的
线性表6
上海金融学院信息管理系
1.7 线性表的查找
概念 查找:对给定的线性表F=(k0,k1, …,kn-1)和 某一个数值v,从F中找出一个键值为v的结点。 查找方法A的评价:MAX(A)和AVG(A)。 MAX(A)查找所需的最大比较次数。 AVG(A)查找所需的平均比较次数。
1.7 线性表的查找
2. 数据结构是递归的
例 在一个非空链表中搜索值为a的结点,并 打印它的值 void printfunction (p, a) struct node *p; int a; { if(p!=NULL) if(p->data==a) printf(“%d”, p>data); else printfunction (p->link, a); }
m f 2 m f AVG(分块查找法)= 2 2
1.7.4 Hash 查找法
Hash查找对应于Hash存储。 Hash存储是通过Hash函数对结点的键值进 行运算来确定这个结点的存放位置。 Hash查找是将要找结点的键值v,利用 Hash函数进行运算,以确定要找结点的存放地 址。
1.7.4 Hash 查找法
1. 用开式寻址法解决冲突
(4)删除 若要删除键值k,则首先查找键值k,若找 到,将键值改为-1,表示已删除;若查找失败, 则删除也失败。 p. 53 delete1( )
2. 用拉链法解决冲突
设数组t[m]用于存放m个链表的头指针,函 数h(x)为Hash函数,若对于键值k,有h(k)=i, 则将键值k存放在t[i]所指的链表中。 p. 54 图1.7.1
相关文档
最新文档