Round17—顺序查找、二分查找

知识点:

知道什么是顺序查找,什么是二分查找,知道判定树,知道二分查找的最大比较次数是\left \lfloor log(N) \right \rfloor+1

单选题:

2-1已知一个长度为16的顺序表L,其元素按关键字有序排列。若采用二分查找法查找一个L中不存在的元素,则关键字的比较次数最多是: (2分)

  • 4
  • 5
  • 6
  • 7

解析:根据上面的公式我们知道第二个是对的。

2-2用二分查找从100个有序整数中查找某数,最坏情况下需要比较的次数是:(2分)

  • 7
  • 10
  • 50
  • 99

解析:同上面的公式。

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分)

  • 当x不在数组中
  • 当x接近数组开头处
  • 当x接近数组结尾处
  • 当x位于数组中间位置

解析:类似于顺序查找,显然第二个是对的。

2-4下列二叉树中,可能成为折半查找判定树(不含外部结点)的是: (4分)

解析:答案是第一个。下面我们来分析为什么。

首先我们可以知道\left \lfloor \frac{(l+r)}{2} \right \rfloor对应的判定树的叶子节点是向右偏移,\left \lceil \frac{(l+r)}{2} \right \rceil向左偏移。

因此我们知道2,3不对,其次叶子节点一定是连续的,不会出现第四个的情况。

编程题:

7-1 两个有序序列的中位数 (25 分)

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A​0​​,A​1​​,⋯,A​N−1​​的中位数指A​(N−1)/2​​的值,即第⌊(N+1)/2⌋个数(A​0​​为第1个数)。

输入格式:

输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的并集序列的中位数。

输入样例1:

5
1 3 5 7 9
2 3 4 5 6

输出样例1:

4

输入样例2:

6
-100 -10 1 1 1 1
-50 0 2 3 4 5

输出样例2:

1

AC代码:

#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;
}
发布了76 篇原创文章 · 获赞 18 · 访问量 2770

猜你喜欢

转载自blog.csdn.net/qq_43446165/article/details/102988706