等差:
等比:
对数阶:
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)。
相关推荐
### 数据结构时间复杂度详解 #### 一、算法时间复杂度定义 在计算机科学中,算法的时间复杂度是一个衡量算法效率的重要指标。它用来描述算法的运行时间与输入数据规模之间的关系。通常,我们关心的是算法运行时间...
"平衡二叉树时间复杂度计算1" 在计算机科学中,平衡二叉树是一种特殊的二叉树数据结构,它的时间复杂度计算是非常重要的。下面我们将详细介绍平衡二叉树的时间复杂度计算。 首先,让我们了解什么是平衡二叉树。...
算法设计与分析——时间复杂度 算法设计与分析是计算机科学中的一门重要课程,旨在研究和分析算法的设计、实现和优化。时间复杂度是算法设计与分析的核心概念之一,指的是算法执行所需的时间成本。了解时间复杂度...
- 时间复杂度:快速排序的平均时间复杂度为O(n log n),但在最坏情况下(输入序列已排序或逆序)时间复杂度为O(n²)。通常,快速排序被认为是实际应用中最快的排序算法之一。 5. **插入排序(Insertion Sort)** ...
在计算机科学中,算法的时间复杂度是对算法运行时间的一个度量,它反映了问题规模n增长时,算法执行步骤的数量的增长趋势。本题集主要涉及了NOIP(全国青少年信息学奥林匹克竞赛)普及组和提高组的CSP-J(Junior)和...
### 算法的时间复杂度与空间复杂度详解 #### 一、算法复杂度概述 在计算机科学领域,算法的时间复杂度与空间复杂度是衡量一个算法效率的重要指标。时间复杂度关注的是算法执行时间的增长速率,而空间复杂度则侧重...
应用马尔科夫链模型证明了遗传禁忌搜索算法是以概率1收敛到全局最优解的,并应用求解随机算法时间复杂度的方法,即求解算法的期望收敛时间,估算了该算法的时间复杂度,结果证明该算法的时间复杂度与所得解的多样性、...
### 算法的时间复杂度分析 #### 一、引言与基本概念 算法的时间复杂度是衡量一个算法效率的关键指标之一。它反映了随着输入数据规模的增长,算法所需执行时间的增长速度。通常情况下,时间复杂度越低的算法,在...
本资源“时间复杂度计算练习.zip”提供了深入理解和掌握时间复杂度计算的实践练习,包括一篇详细讲解的时间复杂度计算练习.docx文档以及一份实现源码的时间复杂度计算练习.cpp。 首先,我们来深入了解时间复杂度。...
本资源包含的“算法实验代码和报告”聚焦于几个重要的算法概念:时间复杂度、0-1背包问题、分治策略以及贪心方法,这些都是计算机科学中基础且实用的知识点。 首先,我们来看**时间复杂度**。时间复杂度是用来衡量...
时间复杂度的几种计算方法 时间复杂度是算法优劣的重要指标,是数据结构的重要理论基础,是学习和教学过程中贯穿始终的主要线索。该知识点是数据结构的重要组成部分,对算法的时间性能进行评估和分析。时间复杂度的...
算法时间复杂度的计算 算法时间复杂度的计算是计算机科学中一个非常重要的概念,它描述了算法执行时间随着输入规模的变化而增长的速度。时间复杂度通常用大 O 记法表示,即 O(f(n)),其中 f(n) 是问题规模 n 的函数...
### 计算机算法基础——时间复杂度 #### 引言 在计算机科学领域,算法的设计与分析至关重要。其中,时间复杂度作为衡量算法效率的关键指标之一,对于优化程序性能、提升软件质量具有不可替代的作用。本文将通过具体...
桶排序的时间复杂度分为两个部分:桶内排序的时间复杂度和合并桶的时间复杂度。 1. 桶内排序的时间复杂度:如果每个桶都使用插入排序,那么每个桶的时间复杂度为O((n/k)²),因为插入排序在最坏情况下需要O(n²)的...
在计算机科学中,时间复杂度是衡量算法效率的重要指标,它描述了算法执行时间与输入数据大小之间的关系。本主题将深入探讨如何使用Matlab来分析矩阵乘法的时间复杂度,以及如何通过可视化来理解这一概念。 矩阵乘法...
数据结构时间复杂度超详细概念解析 数据结构是计算机科学中一个非常重要的概念,而时间复杂度是数据结构中一个非常重要的分析方法。时间复杂度是指算法执行时间随输入规模增长而增长的量级,它是评价算法优劣的重要...
在计算机科学与信息学竞赛中,算法的时间复杂度分析是一个核心知识点,它直接关系到算法的效率以及解决问题的可行性。本文将对这些关键概念进行深入探讨,并提供一些实例来加深理解。 首先,算法的时间复杂度是衡量...
**分治法与时间复杂度计算** 在计算机科学中,分治法是一种强大的算法设计策略,它将一个大问题分解为几个小问题来解决。这种技术的核心思想是“分割”和“合并”,即将一个问题分解成两个或更多的相同或相似的子...