分治法题集

1.选择题

在这里插入图片描述

n^1/2的复杂度大于logn,用反函数来看哈
选感觉ABC
在这里插入图片描述

2.简答

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.分治设计题

在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 100010;
int n,x;
int a[N];

int main() {
	cin >> n;
	for(int i=0;i<n;i++)
	{
		cin >> a[i];
	}
	cin >> x;
	int l = 0, r = n - 1;
	int mid1 = 0;
	int mid2 = 0;
	while (l<=r)
	{
		mid1 =l + (r-l)/3;
		mid2 = l + (r-l)*2/3;
		if (a[mid2] < x) {
			l = mid2+1;
		}
		else if(a[mid1]<x&&x<a[mid2]){
			l = mid1+1;
			r = mid2-1;
		}
		else if(a[mid1]>x){
			r = mid1-1;
		}
		else {
			cout << "Find" << endl;
			return 0;
		}
		
	}
	cout << "No Find" << endl;
}

在这里插入图片描述

4.时间复杂度证明

在这里插入图片描述

5.分治设计题

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
const int M = 1010;
int n,m;
int a[N][M];
int x[M];
bool cmd(int x[],int y[]) {
	for (int i = 0; i < M; i++) {
		if (x[i] < y[i]) return true;
		else if (x[i] > y[i]) {
			return false;
		}
	}
	return true;
}

int cmd1(int x[], int y[]) {
	for (int i = 0; i < M; i++) {
		if (x[i] < y[i]) return 1;
		else if (x[i] > y[i]) {
			return 0;
		}
	}
	return 3;
}

void sortA(int x[][M],int l,int r) {
	if (l >= r) return;
	int a = l - 1, b = r + 1;
	int mid = l + r >> 1;
	while (a<b)
	{
		do a++; while (cmd1(x[a], x[mid]) == 1);
		do b--; while (cmd1(x[b], x[mid]) == 0);
		if (a < b) {
			swap(x[a], x[b]);
		}
	}
	sortA(x, l, mid);
	sortA(x, mid + 1, r);
}

int main() {
	cout << "输入元组个数和维度" << endl;
	cin >> n>>m;
	cout << "输入每个元组的值" << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}
	int l = 0, r = n - 1;
	
	cout << "输入查找元组" << endl;
	for(int i=0;i<m;i++) cin >> x[i];
	sortA(a,0,n-1);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << a[i][j];
		}
		puts("");
	}
	cout << "--------------" << endl;
	while (l<r)
	{
		int mid = l + r >> 1;
		if (cmd1(a[mid], x) == 1) {
			l = mid + 1;
		}
		else if (cmd1(a[mid], x)==0) {	
			r = mid-1;
		}
		else {
			cout << "Find" << endl;
			return 0;
		}
	}
	if (cmd1(a[l], x) == 3) cout << "Find" << endl;
}

6.简答题

在这里插入图片描述

7.证明题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.算法基础

算法包含哪些特性,主要包括哪俩内容?
算法:一组有穷的规则,规定了解决某一特定问题的一系列运算。
必须满足的五个特性是
1.有穷性
2.确定性
3.可行性
4.输入
5.输出
算法分析主要包括两方面
1.事前分析:求出该算法的一个时间界限函数
2.事后测试搜集此算法的执行时间和实际占用空间的统计资料

9.时间复杂度简答

以比较为基础的分类算法时间复杂度下界是什么?理由
在这里插入图片描述

Ω(nlogn)简要理由不会说
之前有n个内结点对应与x中的n种情况,
最坏的查找也不大于由根到叶子结点的最长路径
而假设最外层内结点在k层,则共有2的k次方剪一的内结点树,而高度2的k次方剪一就大于等于n,k大于等于logn加1取天蓬

10.时间复杂度证明

在这里插入图片描述
设 F(N)=O(f) 。根据符号 O 的定义,存在正常数 C1 和自然数 N1 ,使得对所有的 N≥N1 ,有 F(N)≤C1f(N) 。
类似地,设 G(N)=O(g) ,则存在正的常数 C2 和自然数 N2 ,使得所有的 N≥N2 ,有 G(N)≤C2g(N) 。
令 C3=max{C1,C2},N3=max{N1,N2},则对所有的 N≥N3 ,有
F(N)≤C1f(N)≤C3f(N)
G(N)≤C2g(N)≤C3g(N)
故有:
O(f)+O(g)=F(N)+G(N)≤C3f(N)+C3g(N)=C3(f(N)+g(N))=O(f+g)

11.分治设计题

求x的n次幂,尽可能少的乘法次数噢!!!

#include<iostream>
using namespace std;
int n, k;

int qM(int n, int k) {
	int res=1;
	while (k)//k为0表示乘1,退出循环
	{
		if (k & 1) res *=n;//看幂的二进制表示的个位是1还是0,1就要乘上那么多个n
		k >>= 1;//处理下一位幂的位数
		n *= n;//每一位相应的权重依此增大,从个位开始的嘛
	}
	return res;
}

int main() {
	int m;
	cin >> m;
	while (m--)
	{
		cout << "输入原始数字和幂" << endl;
		cin >> n >> k;
		cout << qM(n, k) << endl;
	}
}

12.选择题

在这里插入图片描述
第二题是A吧???

13.分治的适用条件

(1)该问题的规模缩小到一定的程度就可以容易地解决
(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
(3) 利用该问题分解出的子问题的解可以合并为该问题的解;
(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

14.分治设计题

在这里插入图片描述

int Isomorphic(Tree R1, Tree R2)
{
    //两树都为空 
    if(R1 == Null && R2 == Null)
        return 1;
    //空树和非空树    
    if((R1 == Null && R2 != Null) || (R1 != Null && R2 == Null))
        return 0;
    //两树的根节点不一样 
    if(T1[R1].Element != T2[R2].Element)
        return 0;
    //若过两树的左子树都空,判断右子树是否一样  
    if(T1[R1].Left == Null && T2[R2].Left == Null)
        return Isomorphic(T1[R1].Right, T2[R2].Right);
    //若两树的左子树不空,并且左子树的结点元素都一样,判断左右子树是否一样    
    if((T1[R1].Left != Null && T2[R2].Left != Null) && (T1[T1[R1].Left].Element == T2[T2[R2].Left].Element))
        return Isomorphic(T1[R1].Left, T2[R2].Left) && Isomorphic(T1[R1].Right, T2[R2].Right);
    else
    //否则 判断两树是否同构 
        return Isomorphic(T1[R1].Left, T2[R2].Right) && Isomorphic(T1[R1].Right, T2[R2].Left);              
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值