【数据结构与算法006】基本概念和枚举算法

一、基本概念

算法:为解决某一特定问题的一系列、有穷的运算过程。

数据结构:数据的存储和组织方式。

程序:算法用某种程序设计语言的具体实现。

算法可以分为数值算法(数学问题,如:方程求根,方程组,矩阵,微分方程等)和非数值算法(现实问题,如:加密解密,游戏,网络路由等),非数值算法也包括分类算法(机器学习),并行算法,小波算法,经典搜索算法,启发式算法。算法复杂性分析包括时间复杂性,空间复杂性,优度(图像识别,NP问题)。

算法复杂性包括时间复杂性和空间复杂性,由于存储设备的价格已经相当便宜,目前主要关心算法的时间复杂性。算法执行时间绝大部分花在循环和递归上,对于非递归算法:

(1)for/while循环:循环体内计算时间*循环次数

(2)嵌套循环:循环体内计算时间*所有循环次数

(3)顺序语句:各语句计算时间相加

(4)if-else语句:if语句计算时间和else语句计算时间的较大者

循环语句的h时间代价一般用以下三条原则分析:

对于一个循环,循环次数乘以每次执行简单语句的数目即为其时间代价。

对于多个并列循环,可先计算每个循环的时间代价,然后按大O表示法的加法规则计算总代价。

对于多层嵌套循环,一般可按大O表示法的乘法规则计算。

对于递归算法,一般可把时间代价表示为一个递归方程。

二、枚举算法

枚举算法就是将所有可能的结果进行逐个枚举尝试,进而找到适合条件的数据。说白一点就是利用多重 for 循环将所有的可能进行遍历,最后利用 if 判断语句将我们需要的结果筛选出来。

案例一:寻找"水仙花数"
水仙花数是满足下面条件的一组三位的正整数,它们满足条件:每一位上数字的立方之和恰好等于它自己。153就是一个水仙花数,13+53+33=153,请找出所有的水仙花数。

#include <stdio.h>
#include <stdlib.h>

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<stdio.h>
#include <stdlib.h>

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 <iostream>
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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余莫星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值