赞
踩
知道什么是顺序查找,什么是二分查找,知道判定树,知道二分查找的最大比较次数是
2-1已知一个长度为16的顺序表L,其元素按关键字有序排列。若采用二分查找法查找一个L中不存在的元素,则关键字的比较次数最多是: (2分)
解析:根据上面的公式我们知道第二个是对的。
2-2用二分查找从100个有序整数中查找某数,最坏情况下需要比较的次数是:(2分)
解析:同上面的公式。
2-3在有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 查找失败;
本算法与二分查找(折半查找)算法相比,有可能具有更少比较次数的情形是:(2分)
解析:类似于顺序查找,显然第二个是对的。
2-4下列二叉树中,可能成为折半查找判定树(不含外部结点)的是: (4分)
解析:答案是第一个。下面我们来分析为什么。
首先我们可以知道
因此我们知道2,3不对,其次叶子节点一定是连续的,不会出现第四个的情况。
7-1 两个有序序列的中位数 (25 分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
在一行中输出两个输入序列的并集序列的中位数。
- 5
- 1 3 5 7 9
- 2 3 4 5 6
4
- 6
- -100 -10 1 1 1 1
- -50 0 2 3 4 5
1
- #include <bits/stdc++.h>
- using namespace std;
-
- const int maxn = 100000 + 5;
- int n;
- int a[maxn], b;
-
- int main()
- {
- scanf("%d", &n);
- for(int i = 0; i < n; i++)
- scanf("%d", a + i);
-
- int pos = 0, cnt = 0, ans;
- for(int i = 0; i < n; i++)
- {
- scanf("%d", &b);
- while(pos < n && a[pos] < b)
- {
- cnt++;
- if(cnt == (2 * n + 1) / 2)
- ans = a[pos];
- pos++;
- }
- cnt++;
- if(cnt == (2 * n + 1) / 2)
- ans = b;
- }
- printf("%d\n", ans);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。