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

来源:互联网 发布:华夏域名注册 编辑:程序博客网 时间:2024/06/05 02:28

一、基本概念

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

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

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

算法可以分为数值算法(数学问题,如:方程求根,方程组,矩阵,微分方程等)和非数值算法(现实问题,如:加密解密,游戏,网络路由等),非数值算法也包括分类算法(机器学习),并行算法,小波算法,经典搜索算法,启发式算法。算法复杂性分析包括时间复杂性,空间复杂性,优度(图像识别,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的倍数,且总价为100printf("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;}


0 0