首页 > 其他分享 >第八节 小组学习

第八节 小组学习

时间:2023-07-18 19:46:09浏览次数:36  
标签:a1 left1 int 小组 第八节 学习 a2 m1 m2

错题整理

  1. 某算法计算时间表示为递推关系式:T(N)=N+T(N/2),则该算法时间复杂度为( )
    A. \(O(n^2)\)
    B. \(O(N log N)\)
    C. \(O(N)\)
    D. \(O(1)\)

题解

根据递推关系式 \(T(N) = N + T(N/2)\),每次的运算规模减少一半 \((N/2)\),并且每次的运算时间是线性的 \((N)\)。这是一种典型的分治算法的时间复杂度形式。

通过递归展开可以观察到:

\(T(N) = N + T(N/2)\)
\(= N + (N/2 + T(N/4))\)
\(= N + N/2 + (N/4 + T(N/8))\)
\(= N + N/2 + N/4 + (N/8 + T(N/16))\)
...

可以看到,递归展开后,每一项都是 \(N\) 的一部分,并且会一直减少至最后变为 \(T(1)\)。

因此,总的时间复杂度为 \(N + N/2 + N/4 + N/8 + ... + T(1)\),即 \(O(N)\)。

所以,该算法的时间复杂度为 \(O(N)\)

  1. 斐波那契数列的定义如下:\(F_1 = 1, F_2 = 1, F_n = F_{n - 1} + F_{n - 2}\) \((n>=3)\) 如果用下面的函数计算斐波那契数列的第 n 项,则其时间复杂度为( )
int F(int n) { 
	if (n <= 2) 
		return 1; 
	else 
		return F(n - 1) + F(n - 2); 
}

A. \(O(1)\)
B. \(O(n)\)
C. \(O(n^2)\)
D. \(O(F_n)\)

题解

时间复杂度为 \(O(F_n)\),其中 \(F_n\) 是斐波那契数列的第 \(n\) 项。

在这个递归函数中,每次递归调用都会生成两个新的递归调用,直到递归到基本情况\((n <= 2)\)为止。在每一次递归调用中,需要计算 \(F_{n-1}\) 和 \(F_{n-2}\) 的值,这两个值又会依次生成更多的递归调用。

递归树的形状与斐波那契数列的定义相对应,每个节点的值都需要计算一次。因此,递归调用的次数与斐波那契数列的第 \(n\) 项的大小成正比。

所以,时间复杂度可以表示为 \(O(F_n)\),其中 \(F_n\) 是斐波那契数列的第 n 项

  1. 二分搜索算法是利用( )实现的算法。
    A. 分治策略
    B. 动态规划
    C. 贪心法
    D. 回溯法
  1. 设一组初始记录关键字序列为 \((50,40,95,20,15,70,60,45)\),则以增量 \(d=4\) 的一趟希尔排序结束后前4条记录关键字为( )
    A. \(40,50,20,95\)
    B. \(15,40,60,20\)
    C. \(15,20,40,45\)
    D. \(45,40,15,20\)

题解

将序列分成 \(4\) 组,分别是 \((50, 15)\),\((40, 70)\),\((95, 60)\),\((20, 45)\)
对每一组进行插入排序:
对组 \((50, 15)\) 进行插入排序,结果为 \((15, 50)\)
对组 \((40, 70)\) 进行插入排序,结果为 \((40, 70)\)
对组 \((95, 60)\) 进行插入排序,结果为 \((60, 95)\)
对组 \((20, 45)\) 进行插入排序,结果为 \((20, 45)\)
得到一趟排序后的序列为 \((15, 40, 60, 20, 50, 70, 95, 45)\)
因此,一趟希尔排序结束后前 \(4\) 条记录关键字为 \((15, 40, 60, 20)\)

  1. 下列算法中,没有用到贪心思想的算法为( )
    A. 计算无向图最小生成树的 \(Kruskal\) 算法。
    B. 计算无向图点中每对节点之间最短路的 \(Floyd\) 算法。
    C. 计算无向图单源最短路路径的 \(Dijkstra\) 算法。
    D. 以上算法均使用了贪心的思想。

题解

选项 \(B\) 是没有用到贪心思想的算法。\(Floyd\) 算法是一种动态规划算法,通过对所有节点对进行遍历和更新,计算出每对节点之间的最短路径。它不涉及贪心选择,而是通过迭代计算和比较来确定最短路径,因此不属于贪心算法

组合题

已知两个长度均为 \(n\) 的有序数组 \(a1\) 和 \(a2\) (均为递增序,但不保证严
格单调递增),并且给定正整数 \(k\)(\(1 \le k \le 2n\)),求数组 \(a1\) 和 \(a2\) 归并排序后的数组里第k小的数值。试补全程序。

#include <bits/stdc++.h>
using namespace std;

int solve(int *al, int *a2, int n, int k){
	int left1 = 0, right1 = n - 1;
	int left2 = 0, right2 = n - 1;
	while (left1 <= right1 && left2 <= right2){
		int m1 = (left1 + right1) >> 1;
		int m2 = (left2 + right2) >> 1;
		int cnt = ①;
		if (②){
			if (cnt < k)
				left1 = m1+1;
			else
				right2 = m2 - 1;
		}
		else{
			if (cnt < k)
				left2 = m2 + 1;
			else
				right1 = m1 - 1;
		}
	}
	if (③){
		if (left1 == 0){
			return a2[k - 1];
		}
		else{
			int x = a1[left1 - 1],④;
			return std::max(x, y);
		}
	}
	else{
		if (left2 == 0){
			return a1[k - 1];
		}
		else{
			x = a2[left2 - 1],⑤;
			return std::max(x, y);
		}
	}
}
  1. ①处应填( )
    A. (m1+m2)*2
    B. (m1-1) +(m2 - 1)
    C. m1+m2
    D. (m1+1)+(m2+1)

你的答案 D
正确答案 C
题解
在第10处填入选项C. m1 + m2 是正确的选择。

这是因为我们需要计算归并排序后的数组中,前m1 + m2个元素的个数,以确定我们当前的划分是否包含了第k小的数值。因为a1和a2都是递增的有序数组,我们可以通过比较m1和m2所对应的元素来确定划分的位置。

第10处的代码应该是 int cnt = m1 + m2;

  1. ②处应填( )
    A. a1[m1]== a2[m2]
    B. al[m1]<= a2[m2]
    C. al[m1] >= a2[m2]
    D. al[m1] != a2[m2]

你的答案 B
正确答案 B
题解
填入选项B. al[m1] <= a2[m2] 是正确的选择。

我们需要比较a1[m1]和a2[m2]的大小来判断当前的划分情况。如果a1[m1]小于等于a2[m2],则意味着a1[m1]及其左侧的元素都不会是第k小的数值,我们需要将划分向右移动,即将left1更新为m1+1。否则,我们将划分向上移动,即将right2更新为m2-1。因此,选项B是正确的选择

  1. ③处应填( )
    A. left1 == right1
    B. left1< right1
    C. left1 > right1
    D. left1 I= right1

你的答案 C
正确答案 C
题解
当left1 > right1时,意味着数组a1的区间已经全部被排除,剩下的第k小的数值必然在数组a2中。因此,我们需要在a2中找到第k小的数值。选项C是正确的选择

  1. ④处应填( )
    A. y=al[k-left2-1]
    B. y = al[k - left2]
    C. y = a2[k - left1 - 1]
    D. y=a2[k - left1]

你的答案 C
正确答案 C
题解
选项C. y = a2[k - left1 - 1] 是正确的选择。

如果left1 == 0,意味着数组a1的所有元素都被排除了,剩下的第k小的数值必然在数组a2中。由于a2是递增序列,第k小的数值就是a2中的第k个元素,即a2[k - left1 - 1]

  1. ⑤处应填( )
    A. y=a1[k - left2 - 1]
    B. y = a1[k - left2]
    C. y = a2[k - left1 - 1]
    D. y = a2[k - left1]

你的答案 A
正确答案 A
题解
填入选项A. y = a1[k - left2 - 1] 是正确的选择。

如果left2 == 0,意味着数组a2的所有元素都被排除了,剩下的第k小的数值必然在数组a1中。由于a1是递增序列,第k小的数值就是a1中的第k个元素,即a1[k - left2 - 1]。选项A是正确的选择

给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1<=n<=1000000),接下来以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4)。

1.#include <stdlib.h>  
2.#include <stdio.h>  
3.  
4.int a[1000001],n,ans = -1;  
5.  
6.void swap(int *a,int *b) {  
7.    int c;  
8.    c = *a;  
9.    *a = *b;  
10.    *b = c;  
11.}  
12.int FindKth(int left, int right, int n) {  
13.    int tmp,value,i,j;  
14.    if (left == right) return left;  
15.    tmp = rand()% (right - left) + left;  
16.    swap( &a[tmp], &a[left] );  
17.    value = ① ; 
18.    i = left;  
19.    j = right;  
20.    while (i < j) {  
21.  
22.        while (i < j && ② ) j --;  
23.        if (i < j) {  
24.            a[i] = a[j];  
25.            i ++;  
26.        } else break;  
27.        while (i < j &&  ③ ) i ++;  
28.        if (i < j) {  
29.            a[j] = a[i];  
30.            j - -;  
31.        } else break;  
32.    }  
33.    a[i] = value;  
34.    if (i < n) return  FindKth(  ④  );  
35.    if (i > n) return FindKth(  ⑤  );  
36.    return i;  
37.}  
38.  
39.int main() {  
40.    int i;  
41.    int m = 1000000;  
42.    for (i = 1; i <= m; i ++) scanf("%d", &a[i]);  
43.    scanf("%d", &n);  
44.    ans = FindKth(1,m,n);  
45.    printf("%d\n", a[ans]);  
46.    return 0;  
47.}  
  1. ①处应填( )
    A. a[tmp]
    B. a[left]
    C. a[right]
    D. a[1]

你的答案 A
正确答案 B

  1. ②处应填( )
    A. a[j]<value
    B. a[j]>value
    C. a[i]<a[j]
    D. a[i]>a[j]

你的答案 B
正确答案 A

  1. ③处应填( )
    A. a[i]<value
    B. a[i]>value
    C. a[i]<a[j]
    D. a[i]>a[j]

你的答案 A
正确答案 B

  1. ④处应填( )
    A. left,i,n
    B. left,i-1,n
    C. i+1,right,n
    D. i,right,n

你的答案 C
正确答案 C

  1. ⑤处应填( )
    A. left,i,n
    B. left,i-1,n
    C. i+1,right,n
    D. i,right,n

你的答案 B
正确答案 B

标签:a1,left1,int,小组,第八节,学习,a2,m1,m2
From: https://www.cnblogs.com/So-noSlack/p/17563948.html

相关文章

  • 网络流学习笔记
    网络流1.关于网络的一些定义:(1)网络:网络(又称流网络\(Flow\Network\))是指一个有向图\(\G=(V,E)\)。每条边\((u,v)\inE\)都有个权值\(c(u,v)\),称之为容量\((Capacity)\),\(\forall(u,v)\notinE,c(u,v)=0\).其中有两个特殊点:分别是源点\((Source)s\inV\)和汇点\((Sink......
  • Reactjs学习-组件之间传值
    本篇是关于React的基础-父子组件之间传值子组件想使用父组件的某个属性父组件就需要把这个属性传递给子组件,子组件就可以用this.props.属性名来接收子组件调用父组件的方法父组件就需要把这个方法以属性的方式传递给子组件,子组件就可以用this.属性名来调用,要注意this指向......
  • linux bluez编程学习「1」
    之前搭建好了环境并且实现了一个简单的demo,这次多学习几个hci层函数并进行运用hci层函数可以见usr/includde/bluetooth/hci_lib.h中1.开启与关闭设备inthci_open_dev(intdev_id);inthci_close_dev(intdd);hci_open_dev会使用socket()创建一个AF_BLUETOOTH域的套接字描......
  • Reactjs学习-JSX语法
    本篇是关于React的基础-JSX语法什么是JSX在js文件中写html,这样的语法就是JSX 如何书写跟html写法一致,注意,首字母大写的标签是组件,首字母小写的,例如div是html元素 有哪些注意事项1.在类组件中写注释,用花括号包起来2.style中的某个属性需要用state中的值, 用模......
  • 【组合数学】康托展开 学习笔记
    康托展开将\(1...n\)的所有排列按照字典序进行排序,某个排列的排名可以通过康托展开的方法求出。原理观察排列\(2,3,1,4\)和\(2,3,4,1\),发现第一个不同的位置是第三位,而且第一个排列的第三位比第二个小,根据字典序的性质,第一个排列的排名在第二个之前。从这里我们也可以发......
  • 软件测试-基础阶段学习
    阶段目标  能独立针对web项目实施功能测试 一、测试介绍什么是软件测试使用技术手段验证软件是否满足需求测试主流技能功能测试自动化测试接口测试性能测试主流方向建议:功能测试+接口测试自动化测试+接口功能+性能二、测试常用分类2.1阶段划分单元测试......
  • Reactjs学习-State
    本篇是关于React的基础-State在哪儿定义react在Constructor函数中定义state,如下 如何绑定使用JSX语法中,想使用刚才定义的state,需要用花括号包起来例如 如何修改state需要绑定事件,React提供setState函数来做这个操作this.setState({state名:值})注意:......
  • jfinal 框架学习笔记-第四天 view的相应学习
    一.view页面的一次指令运用  页面上的一些语法:   二。另一种view显示<hr><hr><hr>#set(x=123)#(x)<hr><hr><hr>效果如下: 整体代码: 三。引用页面 ......
  • 零基础入门——从零开始学习PHP反序列化笔记(二)
    魔术方法魔术方法介绍__construct()触发时机:实例化对象之前构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法;<?phpclassUser{public$username;publicfunction__construct($username){$this->username=$username;echo"......
  • Eplan是什么软件?学习Eplan软件的几个关键要点
    EPLAN是一款电气计算机辅助设计软件。我是一名Eplan软件的学习者,最近在学习这个专业的电气设计软件时,总结了一些关键要点,希望能与大家分享。  1.熟悉软件界面和功能:首先,我们需要熟悉Eplan软件的界面和各种功能。了解软件的布局、菜单和工具栏,掌握基本的操作方法。可以通过......