这里列了五个方面的内容,应该不算是对算法的概述,只能说是学习算法你一定要知道的东西。
一. 算法的概念
算法是指解决问题的一种方法或一个过程。算法是由若干条指令组成的有穷序列。
算法具有以下四个性质:
(1)输入;
(2)输出;
(3)确定性;
(4)有限性。
二. 算法正确性证明
常用方法:
1.反证法(或间接证明)。
2.归纳法。
三. 算法的效率分析
1.时间、空间复杂度
(1)上界Big-O(Ο)
(2)下界Big-Omega(Ω)
(3)同阶Big-Theta(θ)
(4)Small-O(o)
2.平均、最坏情况
四. 算法的描述
C、C++、Java、……(我的算法问题的解答都是用C++)
五. 算法分析
1. 时间、空间复杂度
2. (1)for/while loop
(2)嵌套循环
(3)if-else statement(选择复杂度最大的)
(4)顺序执行的语句
3. 递归
问题:字典序问题
问题描述:在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写英文字母组成,即A={a,b,c,...,z}。该字母表产生的升序字符串是指字符串字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc,xyz等字符串都是升序字符串。
现在对字母表A产生的所有长度不超过6的升序字符串按照字典序排列并编码如下:
12 ... 26 27 28 51
ab ... z ab acaz
对任意长度不超过6的升序字符串,迅速计算出它在上述字典中的编码。
算法设计:对任意长度不超过6的升序字符串,计算出它在上述字典中的编码。
分析:
解决问题源码:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
//f(i,k)是以i开头k长字符串的数目
int f(int i, int k){
if (k == 1)
return 1;
else{
int sum = 0;
for (int j = i + 1; j <= 26; j++)
sum += f(j, k - 1);
return sum;
}
}
//g(k)是k长字符串的数目
int g(int k){
int sum = 0;
for (int i = 1; i <= 26; i++)
sum += f(i, k);
return sum;
}
int changeToInt(char ch){
return ch - 'a' + 1;
}
int main(){
//初始化文件
ofstream createFile("input.txt");
createFile << "3" << endl;
createFile << "a" << endl;
createFile << "bc" << endl;
createFile << "ab" << endl;
createFile.close();
ifstream ReadFile("input.txt");
ofstream WriteFile("output.txt");
char num;
ReadFile.get(num);
int nums = (int)num-48;
char str0[6];
ReadFile.getline(str0, 6);
while (nums-- > 0){
char str[6];
ReadFile.getline(str, 6);
int length = strlen(str);
int order=1;
for (int i = 1; i < length; i++)
order += g(i);
for (int j = changeToInt(str[0])-1; j > 0; j--)
order += f(j, length);
for (int i = length; i > 1; i--){
for (int j = changeToInt(str[length - i + 1])-1; j > changeToInt(str[length - i]); j--)
order += f(j, i);
}
WriteFile << order << endl;
}
system("pause");
return 0;
}