算法:为解决某一特定问题的一系列、有穷的运算过程。
数据结构:数据的存储和组织方式。
程序:算法用某种程序设计语言的具体实现。
算法可以分为数值算法(数学问题,如:方程求根,方程组,矩阵,微分方程等)和非数值算法(现实问题,如:加密解密,游戏,网络路由等),非数值算法也包括分类算法(机器学习),并行算法,小波算法,经典搜索算法,启发式算法。算法复杂性分析包括时间复杂性,空间复杂性,优度(图像识别,NP问题)。
算法复杂性包括时间复杂性和空间复杂性,由于存储设备的价格已经相当便宜,目前主要关心算法的时间复杂性。算法执行时间绝大部分花在循环和递归上,对于非递归算法:
(1)for/while循环:循环体内计算时间*循环次数
(2)嵌套循环:循环体内计算时间*所有循环次数
(3)顺序语句:各语句计算时间相加
(4)if-else语句:if语句计算时间和else语句计算时间的较大者
循环语句的h时间代价一般用以下三条原则分析:
对于一个循环,循环次数乘以每次执行简单语句的数目即为其时间代价。
对于多个并列循环,可先计算每个循环的时间代价,然后按大O表示法的加法规则计算总代价。
对于多层嵌套循环,一般可按大O表示法的乘法规则计算。
对于递归算法,一般可把时间代价表示为一个递归方程。
枚举算法就是将所有可能的结果进行逐个枚举尝试,进而找到适合条件的数据。说白一点就是利用多重 for 循环将所有的可能进行遍历,最后利用 if 判断语句将我们需要的结果筛选出来。
案例一:寻找"水仙花数"
水仙花数是满足下面条件的一组三位的正整数,它们满足条件:每一位上数字的立方之和恰好等于它自己。153就是一个水仙花数,13+53+33=153,请找出所有的水仙花数。
#include
#include
int main(){
// 遍历99-1000之间的数字
for (int i = 99; i < 1000; i++){
//得到百位上的数字
int a = i / 100;
//得到十位上的数字
int b = i / 10 % 10;
//得到个位上的数字
int c = i % 10;
//判断条件,输出数字
if (i == a*a*a + b*b*b + c*c*c) printf("%d\n", i);
}
system("pause");
return 0;
}
案例二:百钱买百鸡
公鸡五钱一只,母鸡三钱一只,小鸡一钱三只,花一百钱恰好买一百只鸡,问公鸡、母鸡、小鸡各多少只?有几种买法?
#include
#include
int main(){
int a, b, c;
for (a = 0; a < 20; a++) //公鸡可能的只数
for (b = 0; b < (100 - 5 * a) / 3; b++) //母鸡可能的只数
{
c = 100 - a - b; //总数为100时,小鸡的只数
if (c % 3 == 0 && a * 5 + b * 3 + c / 3 == 100) //若小鸡只数是3的倍数,且总价为100
printf("a=%d\tb=%d\tc=%d\n", a, b, c);
}
system("pause");
return 0;
}
案例三:一共有六个字母 ABCDEF 分别输出两类字母自由组合 三类字母自由组合 四类字母自由组合(不区分顺序)
#include
using namespace std;
/*
一共有六个字母 ABCDEF 分别输出两类字母自由组合 三类字母自由组合 四类字母自由组合(不区分顺序)
*/
//两类字母自由组合
int twoCombin(char *str){
printf("*************两类字母自由组合***************\n");
for (int i = 0; i < strlen(str);i++)
{
for (int j = i + 1; j < strlen(str);j++)
{
printf("%c %c\n", str[i],str[j]);
}
}
return 0;
}
//三类字母自由组合
int threeCombin(char *str){
printf("*************三类字母自由组合***************\n");
for (int i = 0; i < strlen(str); i++)
{
for (int j = i + 1; j < strlen(str); j++)
{
for (int k = j + 1; k < strlen(str); k++)
{
printf("%c %c %c\n", str[i], str[j],str[k]);
}
}
}
return 0;
}
//四类字母自由组合
int fourCombin(char *str){
printf("*************四类字母自由组合***************\n");
for (int i = 0; i < strlen(str); i++)
{
for (int j = i + 1; j < strlen(str); j++)
{
for (int k = j + 1; k < strlen(str); k++)
{
for (int l = k + 1; l < strlen(str); l++)
{
printf("%c %c %c %c\n", str[i], str[j], str[k], str[l]);
}
}
}
}
return 0;
}
int main(){
char str[] ="ABCDEF";
twoCombin(str);
threeCombin(str);
fourCombin(str);
system("pause");
return 0;
}