设计构造哈希表的完整算法,求出平均查找长度

合集下载

数据结构应用题

数据结构应用题

一、应用题1. 已知关键字序列为:(74,33,52,41,13,88,66,59)哈希表长为9,哈希函数为:H (k)=k %9,解决冲突用线性补偿探测法 (取Q=5),试构造哈希表,并求出等概率下查找成功的平均查找长度。

【答案】(1)哈希表:0 1 2 3 4 5 6 7 859 74 88 13 4133 52 6621211112(2) ASL=(5*1+3*2)/8=11/82. 已知一个AOV 网如图所示。

(1)试画出它的邻接链表。

(顶点号递减出现在各邻接表中)(2)试写出按照拓扑排序算法得到的拓扑序列。

V 6V 1V 2V 4V 5V 3【答案】(1)1 v 1 06v 6 1 5 v 5 3 3V 3 2 4v 4 0 2v 2 2 ∧ 6 53 ∧5 ∧5 ∧2 ∧32 ∧(2)v 4,v 6,v 1,v 3,v 5,v 23. 已知线性表的存储结构为顺序表,阅读下列算法,并回答问题:(1)设线性表L=(21,-7,-8,19,0,-11,34,30,-10),写出执行f30(&L)后的L 状态;(2)简述算法f30的功能。

void f30 (SeqList *L) { int i,j;for (i=j=0;i<L->length; i++)if(L->data[i]>=0){if(i!=j)L->data[j]=L->data[i]; j++; } L->length=j; }【答案】(1)L=(21,19,0,34,30)(2) 删除顺序表中小于0的数。

4. 已知关键字序列{34,26,47,12,63,41,22,59},利用堆排序的方法对其排序。

(1)写出在构成初始堆后关键字的排列情况。

(2)写出在堆排序的过程中输出前4个记录时,每次调整后关键字的排列情况。

【答案】(1)初始堆:{12,26,22,34,63,41,47,59}(2)输出12后:{22,26,41,34,63,59,47} 输出22后:{26,34,41,47,63,59} 输出26后:{34,47,41,59,63} 输出34后:{41,47,63,59}5. 请用克鲁斯卡尔算法构造下图所示网络的最小生成树。

习题第九章查找答案

习题第九章查找答案

第九章查找一、选择题1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( C )。

【北京航空航天大学 2000 一、8 (2分)】A. (n-1)/2 B. n/2 C. (n+1)/2 D. n2. 对N个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为( A ) 【南京理工大学1998一、7(2分)】A.(N+1)/2 B. N/2 C. N D. [(1+N)*N ]/23. 下面关于二分查找的叙述正确的是 ( D ) 【南京理工大学 1996 一、3 (2分)】A. 表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列B. 表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储4. 对线性表进行二分查找时,要求线性表必须( B )【燕山大学 2001 一、5 (2分)】A.以顺序方式存储B.以顺序方式存储,且数据元素有序C.以链接方式存储D.以链接方式存储,且数据元素有序5.适用于折半查找的表的存储方式及元素排列要求为( D ) 【南京理工大学 1997 一、6 (2分)】A.链接方式存储,元素无序 B.链接方式存储,元素有序C.顺序方式存储,元素无序 D.顺序方式存储,元素有序6.当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度( C ) A.必定快 B.不一定 C. 在大部分情况下要快 D. 取决于表递增还是递减【南京理工大学 1997 一、7 (2分)】7.当采用分快查找时,数据的组织方式为 ( B ) 【南京理工大学 1996 一、7 (2分)】A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同8. 二叉查找树的查找效率与二叉树的( (1)C)有关, 在 ((2)C)时其查找效率最低【武汉交通科技大学1996 一、2(4分)】(1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置(2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。

数据结构复习题

数据结构复习题

一、单项选择题1.评价一个算法时间性能的主要标准是()A.算法易于调试B. 算法易于理解C.算法的稳定性和正确性D.算法的时间复杂度2.可用带表头结点的链表来表示表,也可用不带表头结点的链表来表示表,前者的主要好处是()A.可以加快对表的遍历B.使空表和非空表的处理统一C.提高存取结点的速度D.节省存储空间3.稀疏矩阵一般的压缩存储有两种,即()。

A.一维数组和二维数组B.一维数组和三元组C.二维数组和十字链表D.三元组和十字链表4.链表不具有的特点是()。

A.可随机访问任一元素B.插入删除不需要移动元素C.不必事先估计存储空间D.所需空间与线性表的长度成正比5.非空的循环单链表head的尾结点p满足()。

A.P->next==NULL B.p==NULL C.P->next==head D.P==head 6.对稀疏矩阵进行压缩存储是为了()。

A.便于进行矩阵运算B.便于输入和输出C.节省存储空间D.降低运算的时间复杂度7.数据结构中,与所使用的计算机无关的是数据的()结构。

A.顺序B.物理C.逻辑D.物理和存储8.在长度为n的顺序表中插入一个元素时,等概率情况下的平均移动元素的次数是()。

A.(n-1)/2B.n/2C.n*(n-1)/2D.(n+1)/29.对于一个头指针为H的带头结点的单链表,判定该表为空表的条件是()A. H==NULL B.H!=NULL C.H→next ==H D.H→next==NULL10. 在一个顺序表中,若表的第一个元素的存储地址是210,每一个元素的长度为3,则第5个元素的存储地址是()。

A.219 B.222 C.225 D.22811. 栈S最多能容纳4个元素,现有6个元素按a,b,c,d,e,f的顺序进栈,下面序列()是可能的出栈序列。

A.edcbaf B.bcefad C.cbedaf D.adfebc12.循环队列用数组A[M]存放元素,已知其头尾指针分别为front和rear,则当前队列中的元素个数是()。

哈希表——线性探測法、链地址法、查找成功、查找不成功的平均长度

哈希表——线性探測法、链地址法、查找成功、查找不成功的平均长度

哈希表——线性探測法、链地址法、查找成功、查找不成功的平均长度⼀、哈希表1、概念哈希表(Hash Table)也叫散列表,是依据关键码值(Key Value)⽽直接进⾏訪问的数据结构。

它通过把关键码值映射到哈希表中的⼀个位置来訪问记录,以加快查找的速度。

这个映射函数就做散列函数。

存放记录的数组叫做散列表。

2、散列存储的基本思路以数据中每⼀个元素的keywordK为⾃变量。

通过散列函数H(k)计算出函数值,以该函数值作为⼀块连续存储空间的的单元地址,将该元素存储到函数值相应的单元中。

3、哈希表查找的时间复杂度哈希表存储的是键值对,其查找的时间复杂度与元素数量多少⽆关。

哈希表在查找元素时是通过计算哈希码值来定位元素的位置从⽽直接訪问元素的,因此,哈希表查找的时间复杂度为O(1)。

⼆、经常使⽤的哈希函数1. 直接寻址法取keyword或者keyword的某个线性函数值作为哈希地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b为整数),这样的散列函数也叫做⾃⾝函数.假设H(Key)的哈希地址上已经有值了,那么就往下⼀个位置找,知道找到H(Key)的位置没有值了就把元素放进去.2. 数字分析法分析⼀组数据,⽐⽅⼀组员⼯的出⽣年⽉,这时我们发现出⽣年⽉的前⼏位数字⼀般都同样,因此,出现冲突的概率就会⾮常⼤,可是我们发现年⽉⽇的后⼏位表⽰⽉份和详细⽇期的数字区别⾮常⼤,假设利⽤后⾯的⼏位数字来构造散列地址,则冲突的⼏率则会明显减少.因此数字分析法就是找出数字的规律,尽可能利⽤这些数据来构造冲突⼏率较低的散列地址.3. 平⽅取中法取keyword平⽅后的中间⼏位作为散列地址.⼀个数的平⽅值的中间⼏位和数的每⼀位都有关。

因此,有平⽅取中法得到的哈希地址同keyword的每⼀位都有关。

是的哈希地址具有较好的分散性。

该⽅法适⽤于keyword中的每⼀位取值都不够分散或者较分散的位数⼩于哈希地址所须要的位数的情况。

数据结构(c语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版

第1章绪论5.选择题:CCBDCA6.试分析下面各程序段的时间复杂度。

(1)O(1)(2)O(m*n)(3)O(n2)(4)O(log3n)(5)因为x++共执行了n-1+n-2+……+1= n(n-1)/2,所以执行时间为O(n2)(6)O(n)第2章线性表1.选择题babadbcabdcddac2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

ElemType Max (LinkList L ){if(L->next==NULL) return NULL;pmax=L->next; //假定第一个结点中数据具有最大值p=L->next->next;while(p != NULL ){//如果下一个结点存在if(p->data > pmax->data) pmax=p;p=p->next;}return pmax->data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。

void inverse(LinkList &L) {// 逆置带头结点的单链表 Lp=L->next; L->next=NULL;while ( p) {q=p->next; // q指向*p的后继p->next=L->next;L->next=p; // *p插入在头结点之后p = q;}}(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。

[题目分析] 在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。

本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。

因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。

2010《数据结构》期末试卷_B卷及答案

2010《数据结构》期末试卷_B卷及答案

一、(本题10分)(1)线性表和广义表的主要区别点是什么?已知广义表: C=(a,(b, (a,b)), ((a,b), (a,b))), 则tail(head(tail(C))) =?(2)满足什么条件可以实施二分查找?二分查找的时间复杂度是多少?答:(1)线性表和广义表都是元素a1,a2,…,an 组成的序列,其主要区别点在于:在线性表中,ai 是单个元素(原子);在广义表中,ai 可以是单个元素(原子),也可以是广义表。

tail(head(tail(C))) = ((a,b))(2)序列a1,a2,…,an 必须在数组(顺序表)中,且有序;时间复杂度为O(log n)。

二、(本题10分)证明:一棵二叉树的先序序列和中序序列可惟一确定这棵二叉树。

证明:设一棵二叉树的先序序列和中序序列分别存放在一维数组A[1..n]和B[1..n]中。

因为先序序列的第一个结点A[1]为二叉树的根结点,在中序序列中找到与A[1]相同的结点,不妨假设B[i]=A[1];又因为二叉树的任何一棵子树的结点是紧挨在一起的,故所构造的二叉树的左子树由先序序列A[2..i]和中序序列B[1..i-1]确定的二叉树组成,而所构造的二叉树的右子树由先序序列A[i+1..n]和中序序列B[i+1..n]确定的二叉树组成。

这是一个递归过程,当先序序列和中序序列分别含有3个以下的结点时,可惟一确定对应的二叉树。

因此,由一棵二叉树的先序序列和中序序列可以惟一确定这棵树。

三、(本题15分)某带权有向图如下:(1)写出深度优先搜索结点访问序列,并画出深度优先生成树;(当有多种选择时,编号小的结点优先。

)始点 51 11 32 23 3 1AC D E FBG 厦门大学《_数据结构_》课程期末试卷信息科学与技术学院计算机科学系2008年级___专业主考教师:陈怡疆 庄朝晖 试卷类型:(B 卷)终点(2)写出该图的拓扑序列(当有多种选择时,编号小的结点优先。

平均查找长度详解

平均查找长度详解

平均查找长度详解1.顺序查找:从表的一端开始,顺序扫描线性表,依次将扫描到的节点关键字和给定值k相比较。

等概率条件下...平均查找长度:ASL = (n+....+2+1)/n= (n+1)/2。

2.二分法查找:前提是线性表是有序表。

假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。

在等概率条件下...平均查找长度:ASL =(1/n)* ( j * 2^(j-1) )(j 是从1到h),ASL = log2(n+1)-1。

原因:用二叉树来描述,树的高度d与节点树的关系为:n=(1+2+4+...... 2^(d-1))=2^d - 1;所以d = log2(n+1),每一层只需要比较一次,所以最多需要比较log2(n+1)次。

3.分块查找:又称索引顺序查找,由分块有序(每一块中的关键字不一定有序,但是前一块中的最大关键字必须小于后一块中的最小关键字,即分块有序。

)的索引表和线性表组成。

例如把r【1....n】分为b 块,则前b-1 块节点数为 s = 【n/b】,最后一块允许小于或等于s。

索引表是一个递增有序表。

平均查找长度分为两部分,索引表的查找+块内的查找。

(索引表能够用二分法和顺序查找,块内无序,所以只能用顺序查找)如果以二分查找来确定块,则 ASL = log2(b+1)-1 + (s+1)/2。

如果以顺序查找来确定块,则 ASL = (b+1)/2 + (s+1)/2。

如果以哈希查找来确定块,则ASL=1 + (s+1)/2。

转载自:/jiary5201314/article/details/51125411。

数据结构_习题集

数据结构_习题集

习 题 3 一、选择题
1在栈顶一端可进行的全部操作是( C)。 A 插入 B 删除 C插入和删除 2 栈的特点是(B )。 A 先进先出 B 后进先出 3 顺序栈是空栈的条件是( A)。 A top==0 B top==1 C top== -1 C后进后出 D进栈 D不进一个栈,top表示栈顶指针,已知栈未满, 则x入栈时所执行的操作是( D)。 A a[--top]=x; B a[top--]=x C a[++top]=x D a[top++]=x 5 一个栈的入栈序列是a,b,c,d,e,则不可能的出栈序列是( B)。 A edcda B dceab C decba D abcde 6 经过下列栈的运算后EmptyStack(s)的值是(C )。 InitStack(s);Push(s,a);Push(s,b);Pop(s,x);Pop(s,x) ?????????? Aa Bb C1 D0
数据结构习题册 基 础 篇
习 题 1 一、选择题
1 计算机算法必须具备输入、输出、( B)等5个特性。 A 可行性、可移植性和可扩展性 B 可行性、确定性和有穷性 C 确定性、有穷性和稳定性 D 易读性、安全性和稳定性 2 在数据结构中,从逻辑上可以把数据结构分为(D) A 动态结构和静态结构 B 紧凑结构和非紧凑结构 C 内容结构和外部结构 D 线性结构和非线性结构 3 下面程序段的时间复杂性的量级为( D) For (i=1;i<=n;i++) For(j=1;j<=I;j++) For(k=1;k<=j;k++) x=x+1; A O(1) B O(n) C O(n2) D O(n3) 4 在数据结构中,与所使用的计算机无关的是数据的(A )结构 A 逻辑 B 存储 C 逻辑和存储 D 物理 5 数据结构在计算机中的表示是指(C ) A 数据的逻辑结构 B 数据结构 C 数据的存储结构 D 数据元素之间 的关系 6 下面(B )的时间复杂性最好,即执行时间最短。 A O(n) B O(logn) C O(nlogn) D O(n2) 7 下面程序段的时间复杂性的量级为(D )。 Int fun(int n){ I=1,s=1;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《程序设计与算法分析》实验报告
一设计的目的与内容
1.设计目的
通过本实验需要掌握构造哈希函数表,需要完成设计构造哈希表的完整算法,并求出平均查找长度。

2 实验内容
使用哈希函数:H(K)=3*K MOD 11
并采用开放地址法解决冲突,试在0到10的散列地址空间对关键字序列( 22, 41, 53, 46, 30,13, 01,67)构造哈希函数表,并设计构造哈希表的完整算法,并求出平均查找长度。

二算法的基本思想
1.数据结构的设计
哈希函数H ( key ) =3* key mod 11,哈希表的地址空间为0 ~10,对关键字序列(22, 41, 53, 46, 30,13, 01,67)按线性探测再散列和二次探测再散列的方法分别构造哈希表。

( 1 )线性探测再散列:
3*22%11 = 0;3*41 %11=2 ;3*53%11 = 5 ;3* 46%11=6;3*30%11=2发生冲突,下一个存储地址(2+ 1 )%11 = 3 ;
3*13%11=6发生冲突,下一个存储地址(6+1 )%11 =7 ;
3*01%11=3发生冲突,下一个存储地址(3+1 )%11 =4 ;
3*67%11=3发生冲突,下一个存储地址是:(3 +1 )%11 =4 发生冲突;下一个存储地址( 4 + 1 )%11=5发生冲突;下一个存储地址( 5 + 1 )%11=6发生冲突;下一个存储地址(6+ 1 )%11=7发生冲突;下一个存储地址(7 + 1 )%11=8未发生冲突。

2.算法的基本思想
开放地址法这个方法的基本思想是:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。

这个过程可用下式描述:
H i ( key ) = ( H ( key )+ d i ) mod m ( i = 1,2,…… ,k ( k ≤ m – 1))
其中:H ( key ) 为关键字key 的直接哈希地址,m 为哈希表的长度,di 为每次再探测时的地址增量。

采用这种方法时,首先计算出元素的直接哈希地址H ( key ) ,如果该存储单元已被其他元素占用,则继续查看地址为H ( key ) + d 2 的存储单元,如此重复直至找到某个存储单元为空时,将关键字为key 的数据元素存放到该单元。

增量 d 可以有不同的取法,并根据其取法有不同的称呼:
( 1 ) d i = 1 , 2 , 3 ,…… 线性探测再散列;
( 2 )d i =1^2 ,-1^2 ,2^2 ,-2^2 ,k^2,-k^2…… 二次探测再散列;
( 3 ) d i =伪随机序列伪随机再散列;
三源程序代码及测试结果
1.源程序代码
#include<iostream.h>
#include<iomanip.h>
#define M 11
#define N 8
struct hterm
{
int key; //关键字值
int si; //散列次数
};
struct hterm hlist[M];
int i,adr,sum,d;
int x[N]={22,41,53,46,30,13,1,67}; //关键字赋值float average;
void chash() //创建哈希表
{
for (i=0;i<M;i++)
{
hlist[i].key=0;
hlist[i].si=0;
}
for (i=0;i<N;i++)
{
sum=0;
adr=(3*x[i])%M;
d=adr;
if (hlist[adr].key==0)
{
hlist[adr].key=x[i];
hlist[adr].si=1;
}
else
{
do //冲突处理
{
d=(d+1)%M;
sum=sum+1;
}
while (hlist[d].key!=0);
hlist[d].key=x[i];
hlist[d].si=sum+1;
}
}
}
void dhash() //输出哈希表
{
cout <<" 哈希表地址:";
for(i=0;i<M;i++)
cout << setw(4) <<i;
cout << endl;
cout<<"哈希表关键字:";
for (i=0;i<M;i++)
cout<< setw(4) << hlist[i].key;
cout << endl;
cout << " 搜索长度:";
for (i=0;i< M;i++)
cout << setw(4) << hlist[i].si;
cout << endl;
average=0;
for (i=0;i<M;i++)
average=average+hlist[i].si;
average=average/N;
cout << "平均搜索长度:ASL("<< N <<")="<< average << endl; }
void main()
{
chash();
dhash();
}
2.测试结果
3.存在的问题及解决
解决方法:struct hterm
{
int key; //关键字值int si; //散列次数}
}
“}”后面少了一个“;”。

四分析与讨论
( 1 )线性探测再散列:
22%11 = 0;41 %11=8 ;53%11 = 9 ;46%11=2;30%11=7;
13%11=2发生冲突,下一个存储地址(2+1 )%11 =3 ;
01%11=1;
67%11=1发生冲突,下一个存储地址是:(1 +1 )%11 =2 发生冲突;下一个存储地址( 2 + 1 )%11=3发生冲突;下一个存储地址( 3 + 1 )%11=4未发生冲突。

五心的体会
在这次数据结构设计中遇到了很多实际性的问题,在实际设计才发现,书本上理论性的东西和在实际运用中的还是有一定的出入,随意有些问题要不断地更正以前的错误思维。

通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己以后的学习和工作做出了最好的榜样。

我觉得学习我们最重要的是要把自己平时学习的东西应用到世界中。

相关文档
最新文档