第一章 算法概述(字典序问题)

      这里列了五个方面的内容,应该不算是对算法的概述,只能说是学习算法你一定要知道的东西。

一. 算法的概念

         算法是指解决问题的一种方法或一个过程。算法是由若干条指令组成的有穷序列。

         算法具有以下四个性质:
        (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;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值