算法设计与分析学习笔记

概述

## 压缩算法

  1. 数据压缩  
    数据压缩就是采用特殊的编码方式来保存数据,使数据占用的存储空间比较少。
  2. 即时压缩和非即时压缩 
    即时压缩经常用到专门的硬件设备,如压缩卡等。非即时压缩一般不需要专门的设备,直接在电脑中使用相应的压缩程序就可以了。
    3.数据压缩和文件压缩 
      其实数据压缩包含了文件压缩,数据本来是泛指任何数字化的信息,包括电脑中用到的各种文件
  3. 无损压缩与有损压缩
      比如一个图片文件当保存为不同的格式时,其数据量(文件大小)的差别非常大,使用BMP和JPEG格式生成的文件有时会相差十几倍。

## 加密算法
加密方法可分为两大类:钥匙盘方式和加密狗方式。
解密方法主要可分为两种:软解密和硬解密

## 人工智能算法
在人工智能中包括语言处理、自动定理证明、智能数据检索系统、视觉系统、问题求解、人工智能方法和程序语言以及自动程序设计等。

## 并行算法
并行计算是指同时对多个任务或多条指令、或对多个数据项进行处理。完成此项处理的计算机系统称为并行计算机系统。

算法的评价
一是人对算法的维护的方便性。
二是算法在实现运行时占有的机器资源的多少即算法的运行的时间和空间效率。

时间复杂度

空间复杂度

NP完全问题
复杂性理论中最具理论意义的当数NP完全性问题,这类问题在下述意义下具有同等的难度:即要么每个NP完全问题都存在多项式时间的算法(即通常所指的有效算法);要么所有NP完全问题都不存在多项式时间的算法。

递归与循环

求最大公约数–递归

#include<stdio.h> 

int GCD(int a,int b)
{
	int result;
	if(a%b==0)
	{
		result = b;
		return result;
	}
	else
	{
		result = GCD(b,a%b);
	}
}
int main()
{
 printf("gcd is :%d\n",GCD(16,40));
 return 0;
} 

求最大公约数–循环

#include<stdio.h>
 
int gcd_loop(int a,int b)
{
  int result; 
  int temp;
   if (a%b==0)
   {
	  result = b;
  	  return result;
   }
   else 
	while((a%b)!=0)
   {
	  a = b;
	  temp = a%b;
	  b = temp;
   }
}
 
int main(void)
{
   printf("gcd:%d\n",gcd_loop(10,5)); 
   return 0;
}

求斐波那契数–递归

#include<stdio.h>
 
int Fibonacci(int n)
{
   int result;
   if (n==0 || n==1)
   {
	  result = 1;
	  return result;
   }
   else  if(n>0)
   {
	  result = Fibonacci(n-1) + Fibonacci(n-2);
   	  return result;
   
  }
}
 
 int main(void)
 {
	int n;
	for(n=1; n<=15 ; n++)
	printf("%ld\n",Fibonacci(n));
 
	return 0;
 }

求斐波那契数–循环

#include<stdio.h>
 
int Fibonacci_loop(int n)
{
   int temp = 0;
   int a=1;
   int b=1;
   int i=0;
   
//   for(i=0;i<n;i++)
	while(i<n)
   {
	 if(i==0)
	 {
	 temp = 1;
	 i=i+1;
	 }
	 else  
	{
	 temp=a+b;
	 a = b;
	 b = temp;
	 i=i+1;
	}
//	return temp;	//返回值的位置应该在函数中,表示函数结束并返回相应的值,而不能放到分支语句中,不然函数一直无法完成
   }
// i=i+1;
   return temp;
}
 
int main(void)
{
   printf("%d\n",Fibonacci_loop(15));
   return 0;
}

完数

#include <stdio.h>
int isPerfectNum(int n)//判断n是否为完数,如果是,则返回1,否则返回0
{
    int i,s=0;
    for(i=1;i<n;i++)//遍历小于n的整数
        if(n%i==0)//可以整除,为真因子
            s+=i;//累加每个真因子到s上 
    if(s==n)//如果符合完数条件,返回1
        return 1; 
    else //如果不是完数,返回0
        return 0;
}
int main()
{
    int n;
	printf("请输入需要判断的数:");
    scanf("%d",&n);//输入n值
    if(isPerfectNum(n))//判断是否为完数,并输出结果。
        printf("%d 是完数\n",n);
    else
        printf("%d 不是完数\n", n);
    return 0;
}

汉诺塔

实现这个算法可以简单分为三个步骤:
(1) 把n-1个盘子由A 移到 B;
(2) 把第n个盘子由 A移到 C;
(3) 把n-1个盘子由B 移到 C;
(1)中间的一步是把最大的一个盘子由A移到C上去;
(2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,
(3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;

#include<stdio.h>

void Move(int n, char A, char B, char C)
{
	if (n==1)
	{
		printf("%c-->%c\n",A,C);
	}
	else
	{
		Move(n - 1, A, C, B);//把A上n-1个盘子通过借助辅助塔(C塔)移到了B上
		printf("%c-->%c\n", A, C);//把最大的一个盘子由A移到C上去
		Move(n - 1, B, A, C); //把B上n-1个盘子通过借助辅助塔(A塔)移到了C上
	}

}

int main()
{
	int n = 0;

	printf("请输入汉诺塔的盘子数:");
	scanf("%d", &n);

	Move(n, 'A', 'B', 'C');
	return 0;
}

整数分划问题

(1)当n=1时,不论m的值为多少(m>0),只有一种划分即{1};
(2)当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,…,1};
(3)当n=m时,根据划分中是否包含n,可以分为两种情况:
(a)划分中包含n的情况,只有一个即{n};
(b)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。
因此 f(n,n) =1 + f(n,n-1);
(4)当n<m时,由于划分中不可能出现负数,因此就相当于f(n,n);
(5)但n>m时,根据划分中是否包含最大值m,可以分为两种情况:
(a)划分中包含m的情况,即{m, {x1,x2,…xi}}, 其中{x1,x2,… xi} 的和为n-m,因此这情况下为f(n-m,m);
(b)划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1);
因此 f(n, m) = f(n-m, m)+f(n,m-1);
综上所述:

    f(n, m)=   1;               (n=1 or m=1)
    f(n,m)   =    f(n, n);      (n<m)
	1+ f(n, m-1);               (n=m)
	f(n-m,m)+f(n,m-1);       (n>m)
#include<iostream>
 
using namespace std;
 
int Divinteger(int n,int m) {
	if(n == 1||m == 1)
		return 1;
	else if(n < m)
		return Divintege(n,n);
	else if(n == m)
		return 1+Divintege(n,n-1);
	else
		return Divintege(n,m-1) + Divintege(n-m,m);
}
 
 
int main(void) {
	int n;
	while(scanf("%d",&n) != EOF && (n >= 1)) {
		printf("%d\n",Divintege(n,n));
	}
	
	return 0;
}

利用数组存储数据

五人投票问题
在这里插入图片描述
编程统计身高
在这里插入图片描述
及格人数
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值