`
uule
  • 浏览: 6352916 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

时间复杂度

 
阅读更多

百度百科-时间复杂度

 

等差



 

 

等比:



  

对数阶:

int count = 1;  
while (count < n)  
{  
	count = count * 2;  
} 

 

由于每次count乘以2之后,就距离n更近了一分。也就是说,有多少个2相乘后大于n,则会退出循环。由2的X次方=n  ==》 x=log(2)n。所以这个循环的时间复杂度为O(logn)。

 

------------------------------------------------------------------------------------------------------------------------------------------------

算法复杂度分为时间复杂度空间复杂度

时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。

 

一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。

  

 

分类

按数量级递增排列,常见的时间复杂度有:

常数阶O(1) 

线性阶O(n)

 

对数阶O(log(2)n

线性对数阶O(nlog(2)n)

 

平方阶O(n^2)

立方阶O(n^3)

...

k次方阶O(n^k),

指数阶O(2^n) 

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

 

 

计算方法

 

1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))

 

分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高

 

2. 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n) 的同数量级

(它的同数量级有以下:1,log(2)n,n,n log(2)n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n) = 该数量级,若 T(n)/f(n) 求极限可得到一常数c,则时间复杂度T(n) = O(f(n))

 

例子1:

for(i=1;i<=n;++i)
{
	for(j=1;j<=n;++j)
	{
		c[i][j]=0;//该步骤属于基本操作执行次数:n的平方次
		for(k=1;k<=n;++k)
			c[i][j]+=a[i][k]*b[k][j];//该步骤属于基本操作执行次数:n的三次方次
		}
	}	
}

 

 

则有 T(n) = n 的平方 + n的三次方,根据上面括号里的同数量级,我们可以确定 n的三次方 为T(n)的同数量级

则有 f(n) = n的三次方,然后根据 T(n)/f(n) 求极限可得到常数c

则该算法的时间复杂度:T(n) = O(n^3) 注:n^3即是n的3次方。

 

 1.

for i:=1 to 100 

      do for j:=1 to 100 

             do s[i,j]:=0;

执行次数100*100次,时间复杂度O(1)

 

//O(10000)和O(1)都是常数阶,所以O(10000)可以近似看成O(1)。

 

2.

for i:=1 to n 

      do for j:=1 to 200 

            do s[i,j]:=0;

执行次数n*200次,时间复杂度O(n)

 

3.

for i:=1 to n 

        do for j:=1 to n div 2 

              do s[i,j]:=0;

执行次数n*n/2次,时间复杂度O(n^2)

 

//O(n*n/2)和O(n^2)都是平方阶,所以O(n*n/2)可以近似看成O(n^2)

 

4.

for i:=1 to n

     do for j:=1 to n-1 

           do for k:=1 to n-2 

                 do s[i,j,k]:=0;

执行次数n*(n-1)*(n-2)次,时间复杂度O(n^3)

 

5.

for i:=1 to n do

   begin

         for j:=1 to n 

                 do s[i,j,0]:=0;

         for j:=1 to n 

                 do for k:=1 to n do s[i,j,k]:=1;

  end;

执行次数n*(n+n*n)次,时间复杂度O(n^3)

 

 

一个算法在计算机上的执行效率,主要看这个算法的时间复杂度是属于哪一阶的,常数的影响并不大。当n非常大时,O(10000)的算法和O(1)的算法执行的时间差不多,O(n*n/2)的算法和O(n^2)的算法执行的时间差不多,但是O(n*n/2)的算法会比O(10000)的算法慢很多。

 

 

3.在pascal中比较容易理解,容易计算的方法是:看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(logn),二分例如快速幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlogn)。

 

问题1:

冒泡排序在最坏的情况下的比较次数是O(N^2) 

怎么有的就写冒泡排序在最坏情况下的比较次数是n(n-1)/2

 

一头雾水

 

答:

冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。举个例子来说,一个数列 5 4 3 2 1 进行冒泡升序排列,第一次大循环从第一个数(5)开始到倒数第二个数(2)结束,比较过程:先比较5和4,4比5小,交换位置变成4 5 3 2 1;比较5和3,3比5小,交换位置变成4 3 5 2 1……最后比较5和1,1比5小,交换位置变成4 3 2 1 5。这时候共进行了4次比较交换运算,最后1个数变成了数列最大数。

第二次大循环从第一个数(4)开始到倒数第三个数(2)结束。进行3次比较交换运算。

……

所以总的比较次数为 4 + 3 + 2 + 1 = 10次

对于n位的数列则有比较次数为 (n-1) + (n-2) + ... + 1 = n * (n - 1) / 2,这就得到了最大的比较次数

 

而O(N^2)表示的是复杂度的数量级。举个例子来说,如果n = 10000,那么 n(n-1)/2 = (n^2 - n) / 2 = (100000000 - 10000) / 2,相对10^8来说,10000小的可以忽略不计了,所以总计算次数约为0.5 * N^2。用O(N^2)就表示了其数量级(忽略前面系数0.5)。

 

 

 

 

 

  • 大小: 939 Bytes
  • 大小: 543 Bytes
  • 大小: 807 Bytes
  • 大小: 4.5 KB
  • 大小: 6.6 KB
分享到:
评论

相关推荐

    数据结构时间复杂度

    ### 数据结构时间复杂度详解 #### 一、算法时间复杂度定义 在计算机科学中,算法的时间复杂度是一个衡量算法效率的重要指标。它用来描述算法的运行时间与输入数据规模之间的关系。通常,我们关心的是算法运行时间...

    平衡二叉树时间复杂度计算1

    "平衡二叉树时间复杂度计算1" 在计算机科学中,平衡二叉树是一种特殊的二叉树数据结构,它的时间复杂度计算是非常重要的。下面我们将详细介绍平衡二叉树的时间复杂度计算。 首先,让我们了解什么是平衡二叉树。...

    算法的设计与分析——时间复杂度.docx

    算法设计与分析——时间复杂度 算法设计与分析是计算机科学中的一门重要课程,旨在研究和分析算法的设计、实现和优化。时间复杂度是算法设计与分析的核心概念之一,指的是算法执行所需的时间成本。了解时间复杂度...

    排序算法时间复杂度的分析java语言描述

    - 时间复杂度:快速排序的平均时间复杂度为O(n log n),但在最坏情况下(输入序列已排序或逆序)时间复杂度为O(n²)。通常,快速排序被认为是实际应用中最快的排序算法之一。 5. **插入排序(Insertion Sort)** ...

    NOIP普及组 提高组 CSP-J CSP-S初赛 算法的时间复杂度部分题目(2023.09.15)C.pdf

    在计算机科学中,算法的时间复杂度是对算法运行时间的一个度量,它反映了问题规模n增长时,算法执行步骤的数量的增长趋势。本题集主要涉及了NOIP(全国青少年信息学奥林匹克竞赛)普及组和提高组的CSP-J(Junior)和...

    算法 时间复杂度 空间复杂度 经典

    ### 算法的时间复杂度与空间复杂度详解 #### 一、算法复杂度概述 在计算机科学领域,算法的时间复杂度与空间复杂度是衡量一个算法效率的重要指标。时间复杂度关注的是算法执行时间的增长速率,而空间复杂度则侧重...

    遗传禁忌搜索算法收敛性和时间复杂度分析

    应用马尔科夫链模型证明了遗传禁忌搜索算法是以概率1收敛到全局最优解的,并应用求解随机算法时间复杂度的方法,即求解算法的期望收敛时间,估算了该算法的时间复杂度,结果证明该算法的时间复杂度与所得解的多样性、...

    算法的时间复杂度分析.pdf

    ### 算法的时间复杂度分析 #### 一、引言与基本概念 算法的时间复杂度是衡量一个算法效率的关键指标之一。它反映了随着输入数据规模的增长,算法所需执行时间的增长速度。通常情况下,时间复杂度越低的算法,在...

    时间复杂度计算练习.zip

    本资源“时间复杂度计算练习.zip”提供了深入理解和掌握时间复杂度计算的实践练习,包括一篇详细讲解的时间复杂度计算练习.docx文档以及一份实现源码的时间复杂度计算练习.cpp。 首先,我们来深入了解时间复杂度。...

    算法实验代码和报告(时间复杂度、0-1背包问题、分治与贪心、蛮力法)

    本资源包含的“算法实验代码和报告”聚焦于几个重要的算法概念:时间复杂度、0-1背包问题、分治策略以及贪心方法,这些都是计算机科学中基础且实用的知识点。 首先,我们来看**时间复杂度**。时间复杂度是用来衡量...

    时间复杂度的几种计算方法

    时间复杂度的几种计算方法 时间复杂度是算法优劣的重要指标,是数据结构的重要理论基础,是学习和教学过程中贯穿始终的主要线索。该知识点是数据结构的重要组成部分,对算法的时间性能进行评估和分析。时间复杂度的...

    关于算法时间复杂度的计算

    算法时间复杂度的计算 算法时间复杂度的计算是计算机科学中一个非常重要的概念,它描述了算法执行时间随着输入规模的变化而增长的速度。时间复杂度通常用大 O 记法表示,即 O(f(n)),其中 f(n) 是问题规模 n 的函数...

    计算计算法基础-时间复杂度

    ### 计算机算法基础——时间复杂度 #### 引言 在计算机科学领域,算法的设计与分析至关重要。其中,时间复杂度作为衡量算法效率的关键指标之一,对于优化程序性能、提升软件质量具有不可替代的作用。本文将通过具体...

    桶排序的时间复杂度的计算公式.docx

    桶排序的时间复杂度分为两个部分:桶内排序的时间复杂度和合并桶的时间复杂度。 1. 桶内排序的时间复杂度:如果每个桶都使用插入排序,那么每个桶的时间复杂度为O((n/k)²),因为插入排序在最坏情况下需要O(n²)的...

    NOIP普及组 提高组 CSP-J CSP-S初赛 算法的时间复杂度部分题目.pdf

    算法时间复杂度的相关知识点 从给定的文件信息中,我们可以看到该文件主要关注算法的时间复杂度,涉及到算法设计、递归式、主定理等概念。下面,我们将对这些知识点进行详细的解释和分析。 一、算法时间复杂度 ...

    矩阵乘法时间复杂度Matlab演示

    在计算机科学中,时间复杂度是衡量算法效率的重要指标,它描述了算法执行时间与输入数据大小之间的关系。本主题将深入探讨如何使用Matlab来分析矩阵乘法的时间复杂度,以及如何通过可视化来理解这一概念。 矩阵乘法...

    数据结构时间复杂度超详细概念解析(附实例)

    数据结构时间复杂度超详细概念解析 数据结构是计算机科学中一个非常重要的概念,而时间复杂度是数据结构中一个非常重要的分析方法。时间复杂度是指算法执行时间随输入规模增长而增长的量级,它是评价算法优劣的重要...

    分治法与时间复杂度计算

    **分治法与时间复杂度计算** 在计算机科学中,分治法是一种强大的算法设计策略,它将一个大问题分解为几个小问题来解决。这种技术的核心思想是“分割”和“合并”,即将一个问题分解成两个或更多的相同或相似的子...

Global site tag (gtag.js) - Google Analytics