C/C++ 算法分析 算法性质

算法分析 C++/C

算法:algorithm,是对特定问题求解方法(步骤)的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
正确的算法有三个要点:
1.有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
2.确定性:算法中每一条指令必须有确切的含义。
3.可行性:一个算法是能行的。

算法评价标准:
1.正确性(Correctness ):(即你的算法符合题目要求,且不存在BUG)
2.可读性 (Readability):即能让其他人也读懂代码。
3.健壮性(Robustness): 算法应具有容错处理。
4.效率与存储量需求: 效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。一般地,这两者与问题的规模有关。

算法效率
算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。而度量一个程序的执行时间通常有两种方法
事后统计的方法 (计算机内部进行执行时间和实际占用空间的统计)
事前分析估算的方法 (求出该算法的一个时间界限函数

————————————————一条不怎么华丽的分界线—————————————————
——————————————————以下干货,扶稳坐好—————————————————

1.时间复杂度

算法中 基 本 操 作 重 复 执 行 的 次 数 是 问 题 规 模 n 的 某 个 函 数 , 其 时 间 量 度 记 作 T(n)=O(f(n)),称作算法的时间复杂度(Asymptotic Time complexity),简称时间复杂
度。

例如:在下列三个程序段中,
① x=x+1; O(1) :常量时间阶
② for(int i=1; i<=n; i++)
x=x+1; O(n):线性时间阶
③ for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
x=x+1; O( n 2 n^2 n2):平方时间阶
表示时间复杂度的阶有:
O(1) :常量时间阶 O (n) :线性时间阶
O(㏒ n) :对数时间阶 O(n ㏒ n) :线性对数时间阶
O (nk) : k≥2 ,k 次方时间阶
例1 两个 n 阶方阵的乘法
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
{ c[i][j]=0 ;
for(k=1; k<=n; ++k)
c[i][j]+=a[i][k]*b[k][j] ; }
由于是一个三重循环,每个循环从 1 到 n,则总次数为: n×n×n=n3 时间复杂度为T(n)=O(n3)

空间复杂度

空间复杂度(Space complexity) :是指算法编写成程序后,在计算机中运行时所需存储空间大小的度量。
记作: S(n)=O(f(n)) 其中: n 为问题的规模(或大小)
该存储空间一般包括三个方面:
存储算法本身所占用的存储空间;
int i=2;
(整型变量 i 所分配的空间不会随着处理数集量变换,空间复杂度为 O(1))。
算法的输入输出数据所占用的存储空间;
scanf(“%d%d”,&n,&m);
(输入两个整型数据 m,n,需要为其分配存储空间)
算法在运行过程中临时占用的存储空间。
(递归函数在递归调用的过程中,需要分配临时空间)
对于递归算法来说,一般都比较简短,算法本身所占用的存储空间较少,但运行时需要一个附加堆栈,其空间复杂度为递归所使用的堆栈空间的大小,它等于一次调用所分配的临时存储空间的大小乘以被调用的次数,从而占用较多的临时工作单元;若写成非递归算法,一般可能比较长,算法本身占用的存储空间较多,但运行时将可能需要较少的存储单元。
一般地,算法的空间复杂度指的是算法在运行过程中临时占用的存储空间。
一维数组 a[n]: 空间复杂度 O(n)
二维数组 a[n][m]: 空间复杂度 O(n*m)

放在函数里面的变量在内存中都储存在栈空间,栈空间的大小一般是 4M。
全局变量和静态变量在内存中都储存在堆空间,堆空间的大小比栈空间大,int 类型一般最多开到 1 0 7 10^7 107 左右。
注:int上限为2147483647

编程复杂度

相对而言,“编程复杂度”的要求要略低一些。但是在竞赛中,如果建立的算法实现起来十分繁琐,自然不利于比赛。所以,在建立模型时(特别是在竞赛中)这点也要纳入考虑之中。思维的复杂度,是指思考所耗费的时间和精力。
如果我们确定了一个模型作为分析的方向(没有考虑思维复杂度),从问题原型到该数学模型的建模过程却十分复杂,导致思维耗费时间长,精力多,那自然是不合算的。
总的来说,对于多种数学模型的选择,我们遵循“边分析,边选择”的原则。

————————————————干货部分完结——————————————————————
做一道题吧(博主露出了邪恶的笑容)
嗨嗨嗨!
回文日期

【题目描述】
在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。 牛牛习惯用8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。
牛牛认为,一个日期是回文的,当且仅当表示这个日期的 8 位数字是回文的。现在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存在的日期是回文的。

【输入描述】
输入包括两行,每行包括一个 8 位数字。
第一行表示牛牛指定的起始日期。第二行表示牛牛指定的终止日期。
保证 date1 和 date2 都是真实存在的日期,且年份部分一定为 4 位数字,且首位数字不为 0。保证 date1 —定不晚于 date2。
【输出描述】
输出一行,包含一个整数,表示在 date1 和 date2 之间,有多少个日期是回文的。
【样例输入】
20000101
20101231
【样例输出】
2
给你们点提示(笑)
一个 8 位数字是回文的,当且仅当对于所有的 i ( 1 <=i<= 8 )从左向右数的第 i 个数字和第 9-i 个数字(即从右向左数的第 i 个数字)是相同的。
例如:
•对于 2016 年 11 月 19 日,用 8 位数字 20161119 表示,它不是回文的。
•对于 2010 年 1 月 2 日,用 8 位数字 20100102 表示,它是回文的。
•对于 2010 年 10 月 2 日,用 8 位数字 20101002 表示,它不是回文的。
已知起始日期 date1 和结束日期 date2,如何枚举?
方法一:枚举 date1~date2 之间的所有数字,判断是否符合日期要求,是否是回文。范围10000101~99991231
方法二:枚举 date1~date2 之间所有的年份,构造出回文日期,判断日期是否是真实的。范围 1000~9999
方法三:枚举一年中的每一天,构造出回文日期,判断日期是否是真实的。范围 1~366
什么是日期真实?
月份在 1~12 之间
日根据不同的月份在 1~31 之间。
-1、3、5、7、8、10、12 月每月 31 天。
-4、6、9、11 每月 30 天。
-闰年 2 月 29 天,平年 2 月 28 天。
一个年份是闰年当且仅当它满足下列两种情况其中的一种:1.这个年份是 4 的整数倍,但不是 100 的整数倍;
2.这个年份是 400 的整数倍。

自己做做看看吧,答案在下期给出。
动动你们发财的小手,点个赞再走呗,求求了,观众老爷们!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值