计硕3班-郭思阳-2022222260

kccol 2022-10-24 16:27:18

 

目录

一.算法概述

1.算法的定义

2.算法的特征:

 3.算法的表示:

4.算法的复杂度 

5.NP完全性理论

6.体会心得:

二.算法设计与分析:

 


一.算法概述

1.算法的定义

是一系列解决问题的明确指令,即对符合一定的规范的输入,能够在有限的时间内获得输出,每条指令表示一个或多个操作。

2.算法的特征:

  1. 确切性:算法的每一步骤必须有确切的定义;
  2. 输入:零个或多个外部量作为输入,所谓0个输入指算法本身给定了初始值;
  3. 输出:至少产生一个量作为输出。以反映对输入数据加工后的结果,没有输出的算法毫无意义。
  4. 可行性:算法中采用的运算都是基本运算,能够精确的运行。
  5. 有穷性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。

 3.算法的表示:

  1. 自然语言:用可以理解的文字表示出算法的意思。
  2. 图形符号:流程图。
  3. 程序语言:定义的编程语言,如:python。
  4. 伪代码:介于计算机语言跟自然语言之间的文字跟符号来描述算法。

4.算法的复杂度 

  1. 空间复杂度:需要的计算机空间资源,一般用S(n)表示。
  2. 时间复杂度:需要的计算时间资源,一般用T(n)表示。
  3. 一般常见的时间复杂度:

    O(1):称为常数级,运行时间与问题规模n没有关系

    O(logn):称为对数级;

    O(n):称为线性级,遍历、扫描全部输入

    O(nlogn):许多分治算法和在树上工作的算法;

    O(n^c):称为多项式级;

    O(c^n):称为指数级;

    O(n!):称为阶乘级,最低效的算法,常见于某些排列组合问题中的暴力求解。;

  4.  

    常见复杂度排序:O(1)< O(log2 n) < O(n) < O(nlog2 n) < O(n^2) < O(n^3) < O(2^n) <O(n!) < O(n^n)

  5. 算法的复杂度有:最好情况、最差情况还有平均情况,一般来说最好情况指在理想情况下运行的时间,最坏情况是指在需要的时间的最小值,平均情况是一般情况下需要的时间。

  6. 按照符号O的定义,容易证明它有如下运算规则:

         a、O(f)+O(g)=O(max(f,g))

         b、O(f)+O(g)=O(f+g)

         c、O(f)O(g)=O(fg)

         d、如果g(N)=O(f(N)),则O(f)+O(g)=O(f)

         e、O(Cf(N))=O( f(N)),其中C是一个正的常数

         f、f=O(f)bc

     

     

5.NP完全性理论

  1. P类问题(Polynomial):P类问题是一类能够用(确定性的)算法在多项式时间内求解的判定问题。这种问题类型也称为多项式(Polynomial)类型,确定性算法是求解P类问题的算法,P类问题能用确定性算法求解。能找到多项式时间复杂度都是确定性算法或P类问题,所有在多项式时间内求解的判定问题构成P类问题。
  2. NP类问题(Nondeterministic Polynomial):不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间验证的问题。
  3. NPC类问题(NP-Complete):NP完全问题,不知道该问题是否存在多项式时间复杂度的确定性算法,也不能证明这类问题的任何一个不存在多项时间复杂度的确定性算法,则称该判定问题为NP完全问题,即:如果一个NP问题和其他任何NP问题一样“不易解决”,称这一问题是NPC类问题或者称之为NP完全问题。
  4. NPH类问题:相比NPC问题删掉了它必须是NP问题这一条件,也就是说,NPH问题是只要NP问题可以规约成它就行,可以不用在多项式级时间内验证真伪。
  5. 四类问题的关系与区别:

          ①P问题必定是NP问题,但现目前还无法证明NP问题是否是P问题
          ②NPC问题必定是NP问题,是最难的NP问题
          ③NPC问题也必定是NPH问题
          ④NPH问题不一定是NP问题

P、NP、NPC、NPH问题的联系和区别

6.体会心得:
 

通过第一章的学习,学习到了最基本的算法知识,加深了对算法的理解,对于算法的定义,特征以及对算法的时间空间复杂度有了深一层理解,对于一些基本的算法的时间复杂度也有了一定的了解,如:冒泡排序的平均复杂度为O(n²),堆排序快速排序的时间复杂度为O(nlogn),基数排序的时间复杂度为O(N*M)等。同时明白了在很多问题中,时间和空间是一个对立面:为算法分配更多的空间,可以使算法运行的更快,反之,当空间是一个重要因素时,则需要用算法运行时间去换取空间,所以时间和空间在很多时候不能兼得。同时刚开始对于p类,NP类问题不太理解,通过后续的学习逐渐明白了道理,也对其概念有了自己的理解。

二.算法设计与分析:

1.N鸡问题:用N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元钱必须刚好买N只鸡,鸡必须整只买,有几种买法呢?

a = open('input.txt', 'r')
input = int(a.read())
f = open('output.txt', 'w')
print('总共有{}元\n'.format(input), file=f)
count = 0;
#公鸡:x 母鸡:y 小鸡:z
for x in range(int(input/5)+1):
    for y in range(int(input/5)+1):
        z = input - x - y
        if (5 * x + 3 * y + z / 3) == input:
            f.write('公鸡:%d 母鸡:%d 小鸡:%d\n' % (x, y, z))
            count += 1

print('共有{}种方法 \n'.format(count), file=f)
a.close()
f.close()

输入:200

输出:

 

 

 时间复杂度:时间复杂度为O(n^2)。

2.统计数字问题:一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。数字计数问题要求对给定书的总页码(n<=200000),计算出书的全部页码中分别用到多少次数字0,1,2,…,9。

f = open('input.txt', 'r')
n = int(f.read())
f.close()
l = [0] * 10
for i in range(1, n + 1):
    while i:
        a = (i % 10)
        l[a] += 1
        i = int(i / 10)
f = open('output.txt', 'w')
f.write("页码总数是{}\n \n0出现{}次,\n1出现{}次,\n2出现{}次,\n3出现{}次,\n4出现{}次,\n5出现{}次,\n6出现{}次,\n7出现{}次,\n8出现{}次,\n9出现{}次".format( n, l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8], l[9]))
print("写入完毕")
f.close()

输入:200

输出:

输入:1000

输出:

 

时间复杂度:时间复杂度为O(n)。

 

 

 

...全文
41 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

145

社区成员

发帖
与我相关
我的任务
社区描述
高校教学社区
软件工程 高校
社区管理员
  • dainwnu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧