目录
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);
}