144
社区成员
发帖
与我相关
我的任务
分享一·知识点与总结
知识点:
1·算法与程序:
(1)算法:若干指令组成的有穷序列。
四大性质:零个或多个输入、
至少一个输出、
确定性以及可行性(无歧义,可执行)、
有限性(执行次数有限,执行时间有限)。
(2)程序:算法在某种具体程序语言下的具体表现,可以不满足算法的有限性性质(无限循环执行)。
总结:算法是程序的内在,程序是算法在结合程序设计语言下的问题解决的方案,程序在有限性上有别于算法。
2·算法的复杂性:
(1)算法复杂性的高低体现在运行该算法所需要的计算机资源上,所需资源量越多,该算法的复杂性越高;反之该算法的复杂性越低。
(2)时间复杂性
,空间复杂性
(其中N表示问题规模,I表示算法输入)。


(3)关于符号O的运算规则:

符号O用来评估算法的复杂性时,得到的是问题规模充分大时的一个上界,这个上界的阶位越低,则评估越准确。
(4)关于符号Ω:Ω评估算法复杂性时,得到的是问题规模充分大时的一个下界,这个下界的阶位越高,则评估越准确。
(5)关于符号
:用来表示同阶。
(6)关于符号o:当有
时,称f(N)的阶位比g(N)低。
3·NP完全性理论
(1)来源:如何区分一个问题的难易。
(2)区分:将多项式时间可以求解的问题称为易问题,超多项式时间求解的问题称为难问题。
(3)定义:1·确定性算法:设A是求解问题Ⅱ的一个算法,如果在算法的整个执行过程中,每一步只有一个确定选择,则称算法A是确定性 算法。
2·p类问题:对于某个判定问题Ⅱ,存在一个非负整数k,对于输入规模为n的实例,能够以
的时间运行一个确定性算法, 得到肯定或否定答案,则该判定问题Ⅱ是一个p类问题。
3·非确定性算法:非确定性算法将问题分为猜测和验证两个阶段。算法的猜测阶段是非确定性的,给出问题解的一个猜测。算 法的验证阶段是确定性的,验证猜测阶段给出的解的正确性。
4·NP类问题:对于某个判定问题Ⅱ,存在一个非负整数k,对于输入规模为n的实例,能够以
的时间运行一个非确定性算 法,得到一个是yes或者no的答案,则判定问题Ⅱ是一个NP类问题。( TIPS:验证阶段存在一个确定性算法,能 够以多项式时间来检查和验证猜测阶段所产生的答案。)
(4)p问题与NP问题的差别:p类问题可以用多项式时间的确定性算法来判定求解。NP类问题用多项式时间的非确定性算法判定求解
(5)p问题与NP问题的关系:![]()
![]()
![]()
(6)常见的NP类问题:合取范式的可满足性问题CNF-SAT、三元合取范式的可满足性问题3-SAT、团问题CLIQUE、顶点覆盖问题 VERTEX-COVER、子集和问题SUBSET-SUM、哈密顿回路问题HAM-CYCLE、旅行售货问题TSP。
总结:(1)区分程序与算法的概念,明白算法的四大性质,了解程序有别于算法的一点:程序可以不满足有限性。
(2)掌握算法在最坏情况下,最好情况和平均情况下的计算复杂性概念。时间与空间资源不可能兼顾,常常要面对牺牲空间换取时间,或者相反的情况。
(3)算法复杂性与渐进性态的数学表述。当问题规模n到达一定的复杂程度,那么在时间T->∞时用复杂性O()来表述不同算法在阶位上的差别,此时以不 同的阶位量级来区分不同算法的时间复杂度。
(4)了解NP问题的基本概念:p是一个判定问题类,这些问题可以用一个确定性算法在多项式时间内判定或解出。NP类问题并不要求给出一个算法来求 解问题本身,只要求给出一个确定性算法在多项式时间内验证它的解。
二·习题(1-1~1-5)
1-1:思路:将函数化为最简形式,取其中的最高阶,即为其渐进表达式。
1-2:思路:由知识点2可知O()用来区分算法的不同阶位的复杂度。故O(1)与O(2)相差常数因子,二者在时间复杂度上阶位相同。
1-3:思路:按照渐进阶位排序即可
1-4:(1)设新机器用同一算法在t秒内能解决输入规模为n1的问题。则
解得n1=n+6(由此可知运行速度的成倍提高反应在相同算法上 解决同一问题时,问题的规模并非也是同倍提高。)
(2)n1=8n(由此可知,相比于硬件的提高,算法的改进或许能带来更大的提升。)
(3)T(n)=常数,故可以解决任意规模的问题(本体意在表明:算法的极致提高可以带来问题解决能力的极致增长)
1-5:
(计算复杂性越高,单纯的硬件处理速度提升所带来的问题规模解决能力的收益越 小)
三·算法实现
1一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。数字计数问题要求对给定书的总页码n(<=200000),计算出书的全部页码中分别用到多少次数字0,1,2,…,9
#include<stdio.h>
#include<stdlib.h>
int main(){
int N;
int array[10]={0};
scanf("%d",&N);
for(int i=0;i<=N;i++){
int x=i;
while(x){
array[x%10]++;
x=x/10;
}
}
for(int i=0;i<10;i++){
printf("数字%d出现了%d次\n",i,array[i]);
}
时间复杂度,外侧for循环(0~n)内嵌while循环(0~n),则时间复杂度为O(n^2).
四·图灵停机问题
判断任意一个程序是否能在有限的时间之内结束运行的问题。该问题等价于如下的判定问题:是否存在一个程序P,对于任意输入的程序w,能够判断w会在有限时间内结束或者死循环。艾伦·图灵在1936年用对角论证法证明了,不存在解决停机问题的通用算法。
五·N鸡问题
N鸡问题:用N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元钱必须刚好买N只鸡,鸡必须整只买,有几种买法呢?
#include<stdlib.h>
#include<stdio.h>
int main()
{
int n;
int m=0;
scanf("%d",&n);
int i,j,k;
for(k=0;k<=n;k+=3)
{
i=(4*k)/3-n;
j=2*n-(7*k)/3;
if(5*i+3*j+k/3==n&&i>=0&&j>=0){
printf("公鸡%d母鸡%d小鸡%d\n",i,j,k);
m++;
}
}
printf("%d",m);
}
