目录
- 算法概述
- 算法数据结构
- 算法设计思想和典例
- 算法复杂度计算
1.算法概述
1、算法概念
算法是问题求解步骤的描述。
2、算法常用的设计策略
- 迭代策略:是数值计算近似求解的算法。通过判断某个指标是否在误差范围内进行迭代计算得到结果。
- 穷举策略:当问题的解有很多种情况时,逐一枚举进行求解。如密码箱求解。
- 递推策略:当某种问题规模较小时容易得解,规模大不容易得解,但是具有明显得地推性质时使用的递推求解策略。如斐波那契数列求解问题。
- 递归策略:当问题规模很大时,可以对问题进行分解成多个小问题,再进行归纳对大问题进行求解。
- 回溯策略:在问题规模较小时进行求解,再逐步扩大问题规模。
- 贪心策略:急于求成的策略,特别是时间。不求最优解,求出满意的解就可以了。如装箱子问题。
- 分治策略、动态规划策略:感觉和递归策略类似,把问题进行分解,最后归纳求出大问题的解。
3.典例实现
1、递推经典算法斐波那契数列
头文件my_function.h:
//递推2经典算法:斐波那契数列求解问题
int fibonacci(int n);
函数实现文件my_febo.cpp:
#include <iostream>
#include "my_function.h"
int fibonacci(int n) {
int num1 = 0;//数列第一个值
int num2 = 1;//数列第二个值
int num=0;//数列第N个值
if (n == 0) {
return num1;
}
if (n == 1) {
return num2;
}
//递推求解斐波那契数列第N个值
for (int i = 2; i <= n; i++) {
num = num1 + num2;
num1 = num2;
num2 = num;
}
return num;
}
主程序:
#include <iostream>
#include<Windows.h>
#include "my_function.h"
#define NUM 5;
using namespace std;
int main()
{
//递推经典算法:斐波那契数列求解问题
cout << fibonacci(3) <<endl;
system("pause");
return 0;
}
2、分治汉诺塔
#include<stdio.h>
#pragma warning(disable:4996)
//汉诺塔函数
void hanoi(int n, char one, char two, char three)//将n块圆块借助第二根柱子转移到第三根
{
void move(char x, char y);
if (n == 1)
move(one, three);
else
{
hanoi(n - 1, one, three, two);
move(one, three);
hanoi(n - 1, two, one, three);
}
}
void move(char x, char y)
{
printf("\t%c->%c\n", x, y);
}
int main()
{
int m;
printf("Input the number of diskes:");
scanf("%d", &m);
printf("The step to move %d diskes:\n", m);
hanoi(m, 'A', 'B', 'C');
printf("press any key exit:");
scanf("%d", &m);
return 0;
}