回 帖 发 新 帖 刷新版面

主题:关于时间复杂度和空间复杂度的疑惑?!!!!!!!!!!!!!!!!!!!

我对数据结构中的那个时间复杂度和空间复杂度很不理解.不知道到底应该怎么算.
那位朋友能帮我解说下呀.帮帮我这位新手吧.

[em1][em1][em1][em1][em1][em1]

我在书上看到这段话很不明白>

人们通常采用大O表示法来描述算法分析结果。如果存在正的常数M和n0,当问题的规模n>=n0后,算法的时间量度T(n)=<M*f(n),那么就称该算法的时间复杂度为0(f(n)).这种说法意味着:当n充分大时,该算法的时间复杂度不大于f(n)的一个常数倍。

这里的O和n,n0 T(n)  M,等等.这些到底什么意思呀?

回复列表 (共6个回复)

沙发

有不明白的问题可以去百度查查

板凳

我也查过了呀!
可以都和书上讲的差不多.很难理解.

3 楼

我觉得这个定义有点问题,我举个例子,比如T(n)=2n,那么我们可以取f(n)=n,M=2,n0=1这很显然,但是我们也可以取f(n)=n*n,M=1,n0=2,那时间复杂度到底是O(n)还是O(n*n)呢?

实际上当时我看到这些的时候,我完全是按我学的数学里的大O理解的,在数学里大O是表示同阶的意思,也就是同阶无穷大。

在数学里,如果T(n)=O(f(n)),那么当且仅当
limT(n)/f(n)=C C为非零常数
n->无穷大

比如
lim 2n/n = 2
n->无穷大
因此2n=O(n)
反过来也对,n=O(2n),2n=O(2n)

但是一般在算法分析里都把大O里面化得简单,也就是取‘主要部分’,呈现‘主要部分’,以此把握它的增长趋势。

比如,如果T(n)=2n*n-3n,显然是O(n*n),随着n的增大,T(n)中的2n*n部分会成‘主要部分’,到n非常大的时候,-3n的影响可以忽略。

总而言之,T(n)是一个随n增大无限增大的数列,即无穷大,而大O描述就是找到它的‘阶’,因为T(n)的阶如果是k,当且仅当T(n)=O(n^k)。

4 楼

此外,为什么要用大O的形式描述,为什么不用阶描述,也挺方便,XX算法是多少阶的算法。。。,是因为有时候不能用阶完全描述,比如O(nlogn),O(n!),O(2^n)等等,

5 楼

看不明白

6 楼

又翻了些资料,那个定义是正确的,比如我如果T(n)=n,那可以是O(n)也可以是O(n*n),按定义是正确的,而所有的大O表示中最小的那个(最精确的)是另外一个符号,大O里面一个'工',表示确切的时间复杂度,我们经常谈论到的是后者.

我来回复

您尚未登录,请登录后再回复。点此登录或注册