算法的时间复杂度和空间复杂度-总结分析

合集下载

序列比对算法优化思路和结果检验

序列比对算法优化思路和结果检验

序列比对算法优化思路和结果检验序列比对算法是生物信息学中一项重要的技术,用于在不同生物组织中比较和分析DNA、RNA或蛋白质序列的相似性和差异。

在基因组学研究、药物开发和疾病诊断等领域,序列比对算法发挥着重要作用。

本文将探讨序列比对算法的优化思路,并介绍如何检验比对结果的准确性。

一、序列比对算法的优化思路1. 空间和时间复杂度优化在大规模序列比对中,算法的时空复杂度是一个关键指标。

为了优化算法效率,可以通过以下几个方面进行改进:(1)采用合适的数据结构:使用合适的数据结构可以减少算法的时间复杂度。

例如,使用哈希表来存储序列信息可以加快比对的速度。

(2)使用索引技术:将序列预处理并建立索引,可以在比对时快速定位匹配位置,减少比对时间。

(3)并行计算:采用并行计算的方式可以利用多核处理器或分布式系统,加速大规模序列比对。

2. 比对算法优化(1)局部和全局比对:局部比对算法可以快速找到两个序列中的相似区域,而全局比对算法可以比较整个序列。

根据需求选择合适的比对算法,可以提高比对的准确性和效率。

(2)基于质量值的比对筛选:DNA、RNA或蛋白质序列在测序时会伴随质量值信息,可以根据质量值筛选比对结果,排除低质量碱基或氨基酸造成的干扰,提高比对结果的可靠性。

(3)动态规划算法优化:传统的序列比对算法中,动态规划算法是常用的方法。

为了提高算法效率,可以采用类似Smith-Waterman或Needleman-Wunsch的改进算法,例如使用空间换时间的技巧来减少计算量。

二、结果检验方法1. 比对结果的评估指标为了验证序列比对算法的准确性,需要借助一些评估指标:(1)匹配率:比对序列中正确匹配的碱基或氨基酸的比例。

(2)不匹配率:比对序列中错误匹配的碱基或氨基酸的比例。

(3)片段误差率:比对序列中错误插入或删除的碱基或氨基酸的比例。

(4)准确性:比对序列与参考序列的整体一致性。

2. 参考序列验证对比对结果进行参考序列验证是一种重要的方法,可以使用已有且公认正确的参考序列进行验证,对比对结果进行比对。

整数相乘算法

整数相乘算法

整数相乘算法整数相乘算法是计算机科学中的一个重要问题,它涉及到了很多领域,比如高精度计算、密码学、图像处理等。

在本文中,我们将介绍几种常见的整数相乘算法,并对它们的时间复杂度和空间复杂度进行分析。

一、暴力枚举法暴力枚举法是最简单直接的一种整数相乘算法。

它的思路很简单:将两个整数的每一位都相乘,再将结果累加起来。

具体实现时,可以使用两个嵌套循环分别遍历两个整数的每一位,然后将它们相乘并累加到结果中。

这种算法的时间复杂度为O(n^2),其中n为两个整数的位数之和。

二、分治法分治法是一种高效的整数相乘算法。

它的思路是将大问题划分成小问题,并递归地解决小问题。

具体实现时,可以将两个整数分别拆成高位和低位两部分,然后用公式(a1 * 10^n + a2) * (b1 * 10^n + b2)= (a1 * b1) * 10^(2n) + ((a1 + a2) * (b1 + b2) - a1 * b1 - a2 * b2) * 10^n + a2 * b2来计算它们的乘积。

这种算法的时间复杂度为O(n^log3),其中n为两个整数的位数之和。

三、Karatsuba算法Karatsuba算法是一种优化版的分治法。

它的思路是将两个整数分别拆成三部分,然后用公式(a1 * 10^n + a2) * (b1 * 10^n + b2) = (a1 * b1) * 10^(2n) + ((a1 + a2) * (b1 + b2) - a1 * b1 - a2 * b2) *10^n + a2 * b2来计算它们的乘积。

具体实现时,可以将(a1+a2)*(b1+b2)-a1*b1-a2*b2递归地计算出来,然后再用这个结果计算乘积。

这种算法的时间复杂度为O(n^log23),其中n为两个整数的位数之和。

四、FFT算法FFT(快速傅里叶变换)算法是一种高效的整数相乘算法。

它利用了傅里叶变换中的性质,将乘积转化成卷积,然后使用快速傅里叶变换来计算卷积。

计算机科学中的算法

计算机科学中的算法

计算机科学中的算法在计算机科学中,算法是一种解决问题的步骤和规程,用于解决各种计算和操作问题。

算法作为计算机科学的基础概念,是计算机程序设计的核心和基础,也是计算机系统和应用程序开发的重要基础。

在现代社会中,计算机系统已经广泛应用于各种行业和领域,而算法的发展和优化则是保证计算机系统与应用程序性能和效率的重要保证。

算法是计算机程序设计的基础和精髓。

在计算机科学中,算法是指解决一定问题的一系列有限的计算步骤。

计算机算法的归纳和总结是计算机科学的重要组成部分。

因此,研究和发展计算机算法对于提高计算机系统和应用程序的性能和效率具有重要的意义。

一、算法的类型算法是一种具有不同类型的计算步骤和规程,常见的算法类型包括以下几种:1.排序算法:将一组数据按照一定规则进行排序的算法。

常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等。

2.查找算法:在一个数据集合中查找某一个元素的算法。

常见的查找算法有顺序查找、二分查找、哈希查找等。

3.图形算法:在图论中,解决图的构成、图的遍历、最短路径、最小生成树、网络流等问题的算法。

常见的图形算法有Dijkstra算法、Bellman-Ford算法、Prim算法等。

4.字符串算法:解决字符串处理问题的一类算法。

常见的字符串算法有KMP算法、BM算法、正则表达式等。

5.贪心算法:一种利用局部最优解来获得全局最优解的算法。

贪心算法常用于优化问题中,如NP完全问题、最优化问题等。

常见的贪心算法有贪心选择法、贪心递归法等。

6.动态规划算法:一种以直接使用计算机来研究多阶段决策过程最优化的算法。

常见的动态规划算法有背包问题、找零问题、最长公共子序列问题等。

7.递归算法:通过函数自身的调用来完成计算过程。

递归算法常用于树形结构、图形结构及数据结构等问题中。

二、算法的优化算法的优化是指对算法进行改进和修改,以获得更好的性能和效率。

算法的优化可以分为以下几类:1.时间复杂度的优化:通过改变算法的各个部分来改进算法的时间复杂度,以更快地完成任务。

算法分析的基本概念和方法

算法分析的基本概念和方法

i 1
i 1
i 1
❖ 在最好情况下,ti=1, for 1 i <n;
Tmin(n) c1n c2 (n 1) c3(n 1) c4 (n 1) c7 (n 1)
(c1 c2 c3 c4 c7 )n (c2 c3 c4 c7 ) O(n)
❖ 在最坏情况下,ti i+1, for 1 i <n;
1.1.算法及其特性
❖ 一、 算法(algorithm)
算法就是一组有穷的规则,它们规定了解决某 一特定类型问题的一系列运算。
❖ 二、算法的五个特性
① 确定性 ② 能行性 ③ 有穷性 ④ 输入 ⑤ 输出
1.1.算法及其特性
三、衡量算法性能的标准
衡量算法性能一般有下面几个标准: 确定性 易读性 健壮性 算法的时间和空间性能:高效率和低存储空间
n i1
Байду номын сангаас
2
1.4. 复杂度的有关概念
二、举例
[例2] 直接插入排序算法1.5。
以元素的比较作为基本操作。 最好情况下的时间复杂度: (n) 最坏情况下的时间复杂度: (n2) 在等概率前提下,平均情况下的时间复杂度:(n2 )
算法分析的基本法则
❖ 非递归算法:
(1)for / while 循环 循环体内计算时间*循环次数; (2)嵌套循环 循环体内计算时间*所有循环次数; (3)顺序语句 各语句计算时间相加; (4)if-else语句 if语句计算时间和else语句计算时间的较大者。
1.3. 分析复杂度的基本步骤
二、表示出在算法运行期间基本运算执行的总频数
同一个问题对不同的输入,基本运算的次数亦可能不同。 因此,我们引进问题大小(即规模,size)的概念。例如, 在一个姓名表中寻找给定的Z的问题,问题的大小可用表中 姓名的数目表示。对于两个实数矩阵相乘的问题,其大小可 用矩阵的阶来表示。而对于遍历一棵二叉树的问题,其大小 是用树中结点数来表示等等。这样,一个算法的基本运算的 次数就可用问题的大小n的函数f(n)来表示。

全国计算机等级考试二级Access知识总结

全国计算机等级考试二级Access知识总结

【ACCESS】全国计算机等级考试二级Access知识总结1. 算法的复杂度主要包括时间复杂度和空间复杂度。

2. 算法的时间复杂度是指执行算法所需要的计算工作量。

3. 算法的空间复杂度是指执行这个算法所需要的内存空间。

4. 一种数据的逻辑结构根据需要可以表示成多种存储结构。

而采用不同的存储结构,其数据处理的效率是不同。

5. 线性结构又称线性表,线性结构与非线性结构都可以是空的数据结构。

6. 线性表的顺序存储结构具有以下两个基本特点:①线性表中所有元素所占的存储空间是连续的;②线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。

7. 栈是一种特殊的线性表,在这种线性表的结构中,一端是封闭的,不允许进行插入与删除元素;另一端是开口的,允许插入与删除元素。

先进后出或后进先出。

8. 队列(queue)是指允许在一端进行插入、而在另一端进行删除的线性表。

后进后出或先进先出。

9. 队列的顺序存储结构一般采用循环队列的形式。

10. 元素变动频繁的大线性表不宜采用顺序存储结构,而是采用链式存储结构。

11. 在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。

12. 树(tree)是一种简单的非线性结构。

属于层次模型。

13. 二叉树通常采用链式存储结构14. 二叉树的基本性质性质1在二叉树的第k层上,最多有2k-1(k≥1)个结点。

性质2深度为m的二叉树最多有2m-1个结点。

性质3在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。

15. 二叉树的遍历可以分为三种:前序遍历(中前后)、中序遍历(前中后)、后序遍历(前后中)。

16. 对于长度为n的有序线性表,在最坏情况下,二分查找只需要比较log2n次,而顺序查找需要比较n次。

17. 在最坏情况下,冒泡排序需要比较次数为n(n-1)/2。

18. 在最坏情况下,简单插入排序需要n(n-1)/2次比较。

如何计算时间复杂度和空间复杂度

如何计算时间复杂度和空间复杂度

如何计算时间复杂度和空间复杂度计算算法的时间复杂度和空间复杂度是对算法效率的度量和评估。

时间复杂度是衡量算法执行时间的度量,用大O表示;空间复杂度是衡量算法所需内存空间的度量,也用大O表示。

下面将详细介绍如何计算时间复杂度和空间复杂度。

一、计算时间复杂度时间复杂度是在不同规模输入下,算法的执行时间增长速度的度量。

常用的有最坏情况时间复杂度、平均情况时间复杂度和最好情况时间复杂度。

我们以最坏情况时间复杂度为例进行介绍。

1.观察算法中的基本操作在计算时间复杂度时,首先要观察算法中的基本操作是什么,通常是循环、递归、条件判断等。

这些基本操作的执行次数将决定算法的执行时间。

2.确定基本操作的执行次数确定基本操作的执行次数需要根据具体代码进行分析。

通过观察代码中的循环和条件判断,可以确定每个操作的执行次数。

3.建立时间复杂度方程根据基本操作的执行次数,可以建立时间复杂度方程。

通常在时间复杂度方程中,可以使用大O表示法来表示执行次数与输入规模n的关系。

例如,如果一个操作执行次数是3n+2,则可以表示为O(n)。

4.求解时间复杂度的情况:-如果算法中有多个循环,则分别计算每个循环的时间复杂度,并取最大值。

-如果算法中有递归操作,则递归的时间复杂度需要通过递归树的形式进行分析。

-如果算法中有条件判断,则需要分别计算每个条件分支的时间复杂度,并取最大值。

空间复杂度是衡量算法在执行时所需的内存空间大小的度量。

与计算时间复杂度类似,通常也使用大O表示法来表示。

1.观察算法中的空间使用情况在计算空间复杂度时,需要观察算法中的变量、数组、递归栈等的空间使用情况。

这些空间的消耗将决定算法的空间复杂度。

2.确定空间使用的数据结构根据算法中使用的数据结构,可以确定所需的空间复杂度。

例如,如果一个算法中使用了一个数组,其大小与输入规模n成正比,则可以表示为O(n)。

3.建立空间复杂度方程根据算法中使用的数据结构,可以建立空间复杂度方程。

简述衡量算法优劣的2个主要指标

简述衡量算法优劣的2个主要指标

衡量算法优劣的两个主要指标在计算机科学和数据分析领域,衡量算法优劣的指标是非常重要的。

选择正确的算法可以显著提高计算效率和准确性。

本文将介绍两个主要的衡量算法优劣的指标:时间复杂度和空间复杂度。

1. 时间复杂度时间复杂度是衡量算法执行时间随输入规模增长而增长的速率。

它用大O符号来表示,表示最坏情况下执行时间的上界。

常见的时间复杂度有:•常数时间复杂度 O(1):无论输入规模如何变化,执行时间都保持不变。

•对数时间复杂度 O(log n):随着输入规模呈指数级增长,执行时间以对数方式增加。

•线性时间复杂度 O(n):随着输入规模线性增长,执行时间也线性增加。

•线性对数时间复杂度 O(n log n):随着输入规模线性增长,但是增速比线性更快。

•平方级时间复杂度 O(n^2):随着输入规模平方级增长,执行时间也平方级增加。

•指数级时间复杂度 O(2^n):随着输入规模指数级增长,执行时间以指数方式增加。

衡量算法优劣时,我们通常关注最坏情况下的时间复杂度。

较低的时间复杂度意味着算法在处理大规模数据时更高效。

2. 空间复杂度空间复杂度是衡量算法所需内存随输入规模增长而增长的速率。

它也用大O符号来表示,表示最坏情况下所需内存的上界。

常见的空间复杂度有:•常数空间复杂度 O(1):无论输入规模如何变化,所需内存保持不变。

•线性空间复杂度 O(n):随着输入规模线性增长,所需内存也线性增加。

•平方级空间复杂度 O(n^2):随着输入规模平方级增长,所需内存也平方级增加。

与时间复杂度类似,较低的空间复杂度意味着算法在处理大规模数据时更节省内存。

3. 时间复杂度和空间复杂度之间的平衡在选择算法时,我们需要根据具体问题和应用场景综合考虑时间复杂度和空间复杂度之间的平衡。

有些情况下,我们可能更关注执行时间,而有些情况下,我们可能更关注内存消耗。

•当处理大规模数据时,通常更关注时间复杂度。

选择具有较低时间复杂度的算法可以显著提高计算效率。

常见算法优化与性能分析

常见算法优化与性能分析

常见算法优化与性能分析在计算机科学领域中,算法常常是我们在编写代码时需要处理的重要部分。

好的算法可以有效提高程序的运行效率,而不好的算法则可能会造成程序运行缓慢、消耗大量的资源,甚至会导致程序崩溃。

因此,在编写程序时,我们需要关注优化算法和性能分析。

本篇文章将针对常见算法进行优化和性能分析的问题进行探讨,为读者提供一些有关这方面的基础知识。

一、算法性能分析在编写程序之前,我们需要对程序的算法进行性能分析。

性能分析可以帮助我们确定程序的算法是否适合所面对的问题,并且可以帮助我们找到程序中可能的性能瓶颈。

1. 时间复杂度时间复杂度是衡量程序运行速度的一种度量方式,它表示程序执行所需的时间随输入数据量的增长而增长的速度。

常见的时间复杂度比较如下:- O(1): 常数时间复杂度,表示程序的执行时间与输入规模无关,始终保持相同,如查找散列表中的元素。

- O(log n): 对数时间复杂度,表示程序的执行时间与输入规模呈对数关系。

如在排好序的数组中二分查找元素。

- O(n): 线性时间复杂度,表示程序的执行时间与输入规模成正比,如在数组中查找某个元素。

- O(nlog n): n 对数线性时间复杂度,表示程序的执行时间与输入规模成 log n 倍数增长,如快速排序。

- O(n²): 平方时间复杂度,表示程序的执行时间与输入规模成二次方增长,如选择排序和冒泡排序。

- O(n³): 立方时间复杂度,表示程序的执行时间与输入规模成三次方增长,如矩阵乘法。

- O(2ⁿ)、O(n!)、O(nⁿ)等等: 非常不适合的复杂度,程序的执行时间会随着输入规模的增长而成指数倍数增长,应尽量避免。

2. 空间复杂度空间复杂度衡量程序运行期间所需的内存随输入数据量的增长而增长的速度。

可以根据程序中所需要的存储空间来评估其空间复杂度。

通常情况下,空间复杂度评估要求程序使用的内存空间是所需输入的空间加上一些固定大小的辅助空间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法的时间复杂度和空间复杂度-总结通常,对于一个给定的算法,我们要做两项分析。

第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。

而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。

算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。

因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。

算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。

而度量一个程序的执行时间通常有两种方法。

一、事后统计的方法这种方法可行,但不是一个好的方法。

该方法有两个缺陷:一是要想对设计的算法的运行性能进行评测,必须先依据算法编制相应的程序并实际运行;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优势。

二、事前分析估算的方法因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。

因此人们常常采用事前分析估算的方法。

在编写程序前,依据统计方法对算法进行估算。

一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:(1). 算法采用的策略、方法;(2). 编译产生的代码质量;(3). 问题的输入规模;(4). 机器执行指令的速度。

一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。

为了便于比较同一个问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作的重复执行的次数作为算法的时间量度。

1、时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。

但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。

并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。

一个算法中的语句执行次数称为语句频度或时间频度。

记为T(n)。

(2)时间复杂度在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。

但有时我们想知道它变化时呈现什么规律。

为此,我们引入时间复杂度概念。

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。

记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

另外,上面公式中用到的Landau符号其实是由德国数论学家保罗·巴赫曼(Paul Bachmann)在其1892年的著作《解析数论》首先引入,由另一位德国数论学家艾德蒙·朗道(Edmund Landau)推广。

Landau符号的作用在于用简单的函数来描述复杂函数行为,给出一个上或下(确)界。

在计算算法复杂度时一般只用到大O符号,Landau符号体系中的小o符号、Θ符号等等比较不常用。

这里的O,最初是用大写希腊字母,但现在都用大写英语字母O;小o符号也是用小写英语字母o,Θ符号则维持大写希腊字母Θ。

T (n) = Ο(f (n))表示存在一个常数C,使得在当n趋于正无穷时总有T (n) ≤ C * f(n)。

简单来说,就是T(n)在n趋于正无穷时最大也就跟f(n)差不多大。

也就是说当n趋于正无穷时T (n)的上界是C * f(n)。

其虽然对f(n)没有规定,但是一般都是取尽可能简单的函数。

例如,O(2n2+n +1) = O (3n2+n+3) = O (7n2 + n) = O ( n2 ),一般都只用O(n2)表示就可以了。

注意到大O符号里隐藏着一个常数C,所以f(n)里一般不加系数。

如果把T(n)当做一棵树,那么O(f(n))所表达的就是树干,只关心其中的主干,其他的细枝末节全都抛弃不管。

在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。

按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),...,k次方阶O(n k),指数阶O(2n)。

随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

从图中可见,我们应该尽可能选用多项式阶O(n k)的算法,而不希望用指数阶的算法。

常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)一般情况下,对一个问题(或一类算法)只需选择一种基本操作来讨论算法的时间复杂度即可,有时也需要同时考虑几种基本操作,甚至可以对不同的操作赋予不同的权值,以反映执行不同操作所需的相对时间,这种做法便于综合比较解决同一问题的两种完全不同的算法。

(3)求解算法的时间复杂度的具体步骤是:⑴找出算法中的基本语句;算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

⑵计算基本语句的执行次数的数量级;只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。

这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

⑶用大Ο记号表示算法的时间性能。

将基本语句执行次数的数量级放入大Ο记号中。

如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。

例如:[java] view plaincopy1.for (i=1; i<=n; i++)2. x++;3.for (i=1; i<=n; i++)4.for (j=1; j<=n; j++)5. x++;第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。

Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是Ο(1)。

其中Ο(log2n)、Ο(n)、Ο(nlog2n)、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2n)和Ο(n!)称为指数时间。

计算机科学家普遍认为前者(即多项式时间复杂度的算法)是有效算法,把这类问题称为P(Polynomial,多项式)类问题,而把后者(即指数时间复杂度的算法)称为NP(Non-Deterministic Polynomial, 非确定多项式)问题。

一般来说多项式级的复杂度是可以接受的,很多问题都有多项式级的解——也就是说,这样的问题,对于一个规模是n的输入,在n^k的时间内得到结果,称为P问题。

有些问题要复杂些,没有多项式时间的解,但是可以在多项式时间里验证某个猜测是不是正确。

比如问4294967297是不是质数?如果要直接入手的话,那么要把小于4294967297的平方根的所有素数都拿出来,看看能不能整除。

还好欧拉告诉我们,这个数等于641和6700417的乘积,不是素数,很好验证的,顺便麻烦转告费马他的猜想不成立。

大数分解、Hamilton 回路之类的问题,都是可以多项式时间内验证一个“解”是否正确,这类问题叫做NP问题。

(4)在计算算法时间复杂度时有以下几个简单的程序分析法则:(1).对于一些简单的输入输出语句或赋值语句,近似认为需要O(1)时间(2).对于顺序结构,需要依次执行一系列语句所用的时间可采用大O下"求和法则"求和法则:是指若算法的2个部分时间复杂度分别为T1(n)=O(f(n))和T2(n)=O(g(n)),则T1(n)+T2(n)=O(max(f(n), g(n)))特别地,若T1(m)=O(f(m)), T2(n)=O(g(n)),则T1(m)+T2(n)=O(f(m) + g(n))(3).对于选择结构,如if语句,它的主要时间耗费是在执行then字句或else字句所用的时间,需注意的是检验条件也需要O(1)时间(4).对于循环结构,循环语句的运行时间主要体现在多次迭代中执行循环体以及检验循环条件的时间耗费,一般可用大O下"乘法法则"乘法法则: 是指若算法的2个部分时间复杂度分别为T1(n)=O(f(n))和T2(n)=O(g(n)),则T1*T2=O(f(n)*g(n))(5).对于复杂的算法,可以将它分成几个容易估算的部分,然后利用求和法则和乘法法则技术整个算法的时间复杂度另外还有以下2个运算法则:(1) 若g(n)=O(f(n)),则O(f(n))+ O(g(n))= O(f(n));(2) O(Cf(n)) = O(f(n)),其中C是一个正常数(5)下面分别对几个常见的时间复杂度进行示例说明:(1)、O(1)Temp=i; i=j; j=temp;以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。

算法的时间复杂度为常数阶,记作T(n)=O(1)。

注意:如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。

此类算法的时间复杂度是O(1)。

(2)、O(n2)2.1. 交换i和j的内容[java] view plaincopy1.sum=0;(一次)2.for(i=1;i<=n;i++) (n+1次)3.for(j=1;j<=n;j++) (n2次)4. sum++;(n2次)解:因为Θ(2n2+n+1)=n2(Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到),所以T(n)= =O(n2);2.2.[java] view plaincopy1.for (i=1;i<n;i++)2. {3. y=y+1; ①4.for (j=0;j<=(2*n);j++)5. x++; ②6. }解:语句1的频度是n-1语句2的频度是(n-1)*(2n+1)=2n2-n-1f(n)=2n2-n-1+(n-1)=2n2-2;又Θ(2n2-2)=n2该程序的时间复杂度T(n)=O(n2).一般情况下,对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加1、终值判别、控制转移等成分,当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。

相关文档
最新文档