、目录
平均成功查找次数 = 每个关键词比较次数之和 ÷ 关键词的个数
平均不成功查找次数 = 每个位置不成功时的比较次数之和 ÷ 表长
判断题
1、在散列表中,所谓同义词就是具有相同散列地址的两个元素。T
2、在散列表中,所谓同义词就是被不同散列函数映射到同一地址的两个元素。F
具有相同的函数值的关键字对该散列函数来说称为同义词。
3、若用平方探测法解决冲突,则插入新元素时,若散列表容量为质数,插入就一定可以成功。F
二次探测有可能出现表中有空间但平方探测找不到的情况。
4、将M个元素存入用长度为S的数组表示的散列表,则该表的装填因子为M/S。T
5、在散列中,函数“插入”和“查找”具有同样的时间复杂度。T
6、即使把2个元素散列到有100个单元的表中,仍然有可能发生冲突。T
7、(neuDS)由顺序表和单链表表示的有序表均可使用二分查找法来提高查找速度。F
单链表不能用二分查找
选择题
1、已知一个长度为16的顺序表L,其元素按关键字有序排列。若采用二分查找法查找一个L中不存在的元素,则关键字的比较次数最多是:
A.4
B.5
C.6
D.7
2、用二分查找从100个有序整数中查找某数,最坏情况下需要比较的次数是:
A.7
B.10
C.50
D.99
3、在散列表中,所谓同义词就是:
A.两个意义相近的单词
B.具有相同散列地址的两个元素
C.被映射到不同散列地址的一个元素
D.被不同散列函数映射到同一地址的两个元素
4、在下列查找的方法中,平均查找长度与结点个数无关的查找方法是:
A.顺序查找
B.二分法
C.利用哈希(散列)表
D.利用二叉搜索树
哈希表的平均查找长度ASL = 装填因子 / 表长TableSize
5、散列冲突可以被描述为:
A.两个元素除了有不同键值,其它都相同
B.两个有不同数据的元素具有相同的键值
C.两个有不同键值的元素具有相同的散列地址
D.两个有相同键值的元素具有不同的散列地址
6、将10个元素散列到100000个单元的哈希表中,是否一定产生冲突?
A.一定会
B.可能会
C.一定不会
D.有万分之一的可能会
7、设散列表的地址区间为[0,16],散列函数为H(Key)=Key%17。采用线性探测法处理冲突,并将关键字序列{ 26,25,72,38,8,18,59 }依次存储到散列表中。元素59存放在散列表中的地址是:
A.8
B.9
C.10
D.11
26--9,25--8,72--4,38--5,8--10,18--1,59--11
8、采用线性探测法解决冲突时所产生的一系列后继散列地址:
A.必须大于等于原散列地址
B.必须小于等于原散列地址
C.可以大于或小于但不等于原散列地址
D.对地址在何处没有限制
9、将元素序列{18,23,11,20,2,7,27,33,42,15}按顺序插入一个初始为空的、大小为11的散列表中。散列函数为:H(Key)=Key%11,采用线性探测法处理冲突。问:当第一次发现有冲突时,散列表的装填因子大约是多少?
A.0.27
B.0.45
C.0.64
D.0.73
18--7,23--1,11--0,20--9,2--2,7--7+1,第六个出现冲突,所以5/11
10、给定散列表大小为11,散列函数为H(Key)=Key%11。按照线性探测冲突解决策略连续插入散列值相同的4个元素。问:此时该散列表的平均不成功查找次数是多少?
A.1
B.4/11
C.21/11
D.不确定
以都插入散列值为0的位置为例,0,1,2,3,4的不成功比较次数分别为5,4,3,2,1,剩下的5--10的位置都是1次,总共(5+4+3+2+1+1+1+1+1+1+1)/11=21/11
11、给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(X)=X%10。如果用大小为10的散列表,并且用平方探测解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)
A.1, 3, 3, 9, 4, 9, 9
B.1, 3, 4, 9, 7, 5, -1
C.1, 3, 4, 9, 5, 0, 8
D.1, 3, 4, 9, 5, 0, 2
h[X] = X % 10,平方探测法,冲突之后 (h[X]+d)%10,d是增量序列
4371--1--value=1,
1323--3--value=3,
6173--3冲突--(3+1*1)%10=4--value=4
4199--9--value=9
4344--4冲突--(4+1*1)%10=5--value=5
9679--9冲突--(9+1*1)%10=0--value=0
1989--9冲突--(9+1*1)%10=0冲突--(9-1*1)%10=8--value=8
12、若N个关键词被散列映射到同一个单元,并且用分离链接法解决冲突,则找到这N个关键词所用的比较次数为:
A.N(N+1)/2
B.N(N−1)/2
C.N+1
D.N
13、给定散列表大小为17,散列函数为H(Key)=Key%17。采用平方探测法处理冲突:hi(k)=(H(k)±i2)%17将关键字序列{ 6, 22, 7, 26, 9, 40 }依次插入到散列表中。那么元素40存放在散列表中的位置是:
A.2
B.6
C.8
D.15
40%17=6冲突6,到7,7冲突7,到5,5冲突22,到10,10冲突9,到2
14、给定散列表大小为17,散列函数为H(Key)=Key%17。采用平方探测法处理冲突:hi(k)=(H(k)±i2)%17将关键字序列{ 23, 22, 7, 26, 9, 6 }依次插入到散列表中。那么元素6存放在散列表中的位置是:
A.15
B.10
C.6
D.2
6%17=6冲突23,到7,7冲突7,到5,5冲突22,到10,10冲突9,到2
15、将元素序列{18, 23, 4, 26, 31, 33, 17, 39}按顺序插入一个初始为空的、大小为13的散列表中。散列函数为:H(Key)=Key%13,采用线性探测法处理冲突。问:当第一次发现有冲突时,散列表的装填因子大约是多少?
A.0.54
B.0.63
C.0.31
D.0.62
18--5,23--10,4--4,26--0,31--5冲突,4/13
16、在有n(n>1000)个元素的升序数组A
中查找关键字x。查找算法的伪代码如下所示:
k = 0;
while ( k<n 且 A[k]<x ) k = k+3;
if ( k<n 且 A[k]==x ) 查找成功;
else if ( k-1<n 且 A[k-1]==x ) 查找成功;
else if ( k-2<n 且 A[k-2]==x ) 查找成功;
else 查找失败;
本算法与二分查找(折半查找)算法相比,有可能具有更少比较次数的情形是:
A.当x不在数组中
B.当x接近数组开头处
C.当x接近数组结尾处
D.当x位于数组中间位置
17、下列二叉树中,可能成为折半查找判定树(不含外部结点)的是:
A.
B.
C.
D.
18、一个哈希函数被认为是“好的”,如果它满足条件()。
A.哈希地址分布均匀
B.满足(B)和(C)
C.保证不产生冲突
D.所有哈希地址在表长范围内
19、若在线性表中采用二分查找法查找元素,该线性表应该()。
A.元素按值有序
B.采用顺序存储结构
C.元素按值有序,且采用顺序存储结构
D.元素按值有序,且采用链式存储结构
20、对一个长度为 10 的排好序的表用二分法查找,若查找不成功,至少需要比较的次数是()。
A.4
B.3
C.5
D.6
21、若查找每个元素的概率相等,则在长度为n的顺序表上查找任一元素的平均查找长度为()。
A.n
B.n/2
C.(n+1)/2
D.(n-1)/2
查找地址为1,2,...,n的概率都是1/n,所以平均查找长度为1×1/n+2×1/n+...+n×1/n=(n+1)/2。
22、(neuDS)当采用分块查找时,数据的组织方式为( )。
A.数据必须有序
B.数据不必有序
C.数据分成若干块,每块内数据不必有序,但块间必须有序
D.数据分成若干块,每块内数据必须有序,但块间不必有序
23、(NeuDS_C++)有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当二分查找值82为的结点时,( )次比较后查找成功。
A.1
B.2
C.4
D.8
24、现有长度为 7、初始为空的散列表HT
,散列函数H(k)=k%7,用线性探测再散列法解决冲突。将关键字 22, 43, 15 依次插入到HT
后,查找成功的平均查找长度是:
A.1.5
B.1.6
C.2
D.3
22,43,15都插入HT中的1,冲突,结果分别插入1,2,3,查到22,43,15的比较次数分别是1,2,3,ASL=(1+2+3)/3=2
函数题
6-1 二分查找
本题要求实现二分查找算法。
函数接口定义:
Position BinarySearch( List L, ElementType X );
其中List
结构定义如下:
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
L
是用户传入的一个线性表,其中ElementType
元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch
要查找X
在Data
中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound
。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */
Position BinarySearch( List L, ElementType X );
int main()
{
List L;
ElementType X;
Position P;
L = ReadInput();
scanf("%d", &X);
P = BinarySearch( L, X );
printf("%d\n", P);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
5
12 31 55 89 101
31
输出样例1:
2
输入样例2:
3
26 78 233
31
输出样例2:
0
代码长度限制
16 KB
时间限制
100 ms
内存限制
64 MB
Position BinarySearch( List L, ElementType X )
{
int low=1;
int high = L->Last;
int mid ;
while(low <= high)
{
mid = (low+high)/2;
if(L->Data[mid] == X)
{
return mid;
}
else if(L->Data[mid]<X)
{
low = mid+1;
}
else
{
high = mid-1;
}
}
return NotFound;
}
编程题
7-1 改写二分搜索算法
设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
输入格式:
输入有两行:
第一行是n值和x值;
第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。
输出格式:
输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。
提示:若x小于全部数值,则输出:-1 0
若x大于全部数值,则输出:n-1的值 n的值
输入样例:
在这里给出一组输入。例如:
6 5
2 4 6 8 10 12
输出样例:
在这里给出相应的输出。例如:
1 2
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
int main()
{
int n, x;
cin >> n >> x;
int* num = new int[n];
for (int i = 0; i < n; i++)
{
cin >> num[i];
}
int low = 0;
int high = n-1;
int mid;
while (low <= high)
{
mid = (low + high) / 2;
if (num[mid] == x)
{
cout << mid << ' ' << mid;
return 0;
}
else if (num[mid] > x)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
cout << high << ' ' << low;
return 0;
}