a算法的时间复杂度
Ⅰ 下列算法,指出算法A的功能和时间复杂度,其中h、g分别为单循环链表中两个节点指针。
估计你的代码是这样的吧:
void B(int *s, int *q)
{
int *p;
p = s;
while(p->next != q)
p = p->next;
p->next = s;
}
void A(int *h, int *g)
{
B(h, g);
B(g, h);
}
首先说下函数B的作用,函数B的作用是将单循环链表(也可以是单向链表,如果是单链表,那么s节点一定要在q节点之前,题意中指的是单循环链表)中的q节点和s节点相连接(q->next = s),从而形成一个单循环链表。
函数A的作用是使单循环链表中的g的下一个节点为h而h的下一个节点为g(即g->next = h且h->next = g),也可以说是形成一个只有g和h节点的单循环链表。
如果g,h所在单循环链表节点数为n,则当q->next == s时,"B(h, g);"要执行最多次" p = p->next;"(n-2次),执行p->next = s;一次;B(g, h);只执行p->next = s;一次。所以时间复杂度肯定是线性阶,即T(n) = O(n)。
Ⅱ 算法的时间复杂度是指什么具体点
算法复杂度不是简单的时间的度量
是用来评价算法优劣程度的依据
比如,一个程序要扫描100 * n * n + 10000 * n + 99999遍,那么时间复杂度是O(n^2)
也就是说,时间复杂度只取次数最高的项,并且忽略系数
所以,时间复杂度是用来描述随着 n 的增大,算法耗时“增大”的!不是用来描述运行所花时间的(这个我们初中老师给我们强调了半天)
还有一点,O(9999999999)(实际应写为O(1),这里只是表达意思)和O(n)的算法那个好?
答案是O(9999999999),因为他的耗时不随n的增大而变化,所以他更优
一般来说,算法的好坏是这样的 (>表示好于) O(1) > O(logn) > O(n) > O(n logn) > O(n^2) > O(n^3) > O(2^n) > O(n!)
Ⅲ 算法的时间复杂度定义
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度。记作:T(n)=O(f(n))。它表示随问题n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中,f(n)是问题规模n的某个函数。
这样用大写O()来体现算法时间复杂度的记法,我们称之为大0记法。
Ⅳ 【算法笔记】算法的平均时间复杂度A(n)的公式及示例
算法平均时间复杂度计算公式
其中:
举例:检索问题,数组 有 个元素,每个元素为从1到n的整数。若待检索元素在 中(例如1,2,3,4,5),则比较次数为其本身。若待检索元素位于 的空隙中(例如0.5,1.5,2.5),则比较次数为 ,也就是从头到尾比较一遍。若位于 和位于 的空隙的待检索元素数量各占一半,检索的平均时间复杂度是多少?
位于 的情况:假设 在 的概率为 ,则 在每个位置的概率为 ,若 的值为 ,则需要比较 次。平均时间复杂度为
位于 的空隙的情况: 不在 的概率为 ,每种情况都要比较 次,则该情况的平均时间复杂度为
综上,结合等差数列求和公式有:
当 ,
Ⅳ 求最短路径的A*算法的时间复杂度与空间复杂度是多少
从数学上定义,给定算法A,如果存在函数F(n),当n=k时,F(k)表示算法A在输入规模为k的情况下的运行时间,则称F(n)为算法A的时间复杂度。这里首先要明确输入规模的概念。关于输入规模,不是很好下定义,非严格的讲,输入规模是指算法A所接受输入的自然独立体的大小。例如,对于排序算法来说,输入规模一般就是待排序元素的个数,而对于求两个同型方阵乘积的算法,输入规模可以看作是单个方阵的维数。为了简单起见,总是假设算法的输入规模是用大于零的整数表示的,即n=1,2,3,……,k,…… 对于同一个算法,每次执行的时间不仅取决于输入规模,还取决于输入的特性和具体的硬件环境在某次执行时的状态。所以想要得到一个统一精确的F(n)是不可能的。为了解决这个问题,做以下两个说明: 1.忽略硬件及环境因素,假设每次执行时硬件条件和环境条件是完全一致的。 2.对于输入特性的差异,将从数学上进行精确分析并带入函数解析式。
Ⅵ 请问算法的时间复杂度是怎么计算出来的
首先假设任意一个简单运算的时间都是1,例如a=1;a++;a=a*b;这些运算的时间都是1.
那么例如
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
a++; //注意,这里计算一次的时间是1.
}
那么上面的这个例子的时间复杂度就是 m*n
再例如冒泡排序的时间复杂度是N*N;快排的时间复杂度是log(n)。
详细的情况,建议你看《算法导论》,里面有一章节,具体讲这个的。
Ⅶ 算法的时间复杂度是指什么
就是对算法执行时所花时间的度量。一般为问题规模的函数。
计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间资源,因此复杂度分为时间和空间复杂度。
相关内容解释:
函数在数学上的定义:给定一个非空的数集A,对A施加对应法则f,记作f(A),得到另一数集B,也就是B=f(A)。那么这个关系式就叫函数关系式,简称函数。
简单来讲,对于两个变量x和y,如果每给定x的一个值,y都有唯一一个确定的值与其对应,那么我们就说y是x的函数。其中,x叫做自变量,y叫做因变量。
Ⅷ (11) 算法的时间复杂度是指______。 A. 执行算法程序所需要的时间 B. 算法程序的长度 C. 算法执行过程中所
(11)[答案]C
[考点]数据结构与算法
[评析]
算法的复杂度分时间复杂度和空间复杂度。
时间复杂度:在运行算法时所耗费的时间为f(n)(即 n的函数)。
空间复杂度:实现算法所占用的空间为g(n)(也为n的函数)。
称O(f(n))和O(g(n))为该算法的复杂度。
简单的例子比如常见的顺序结构时间复杂度为O(1),1层循环里面次数为n,时间复杂度就是O(n),2层循环for i=1 to n,for j=1 to n算法时间复杂度为O(n2)(里面为n的平方),复杂度主要用于算法的效率比较与优化,比如排序,查找…
Ⅸ 时间复杂度怎么计算
1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))
分析:随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。
2. 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n)=该数量级,若T(n)/f(n)求极限可得到一常数c,则时间复杂度T(n)=O(f(n))
例:算法:
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的三次方)
Ⅹ 算法A时间复杂度比B高,但是实验运行时间却比B低,试研究可能的原因
如果是同一个N,跟其关系不大。
运行时间还和计算机有关,尤其是比较耗费时间的运算。如输入输出运算等。