| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1099 人关注过本帖
标题:求一个简单的问题
只看楼主 加入收藏
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
结帖率:95.74%
收藏
已结贴  问题点数:20 回复次数:21 
求一个简单的问题
数据结构中的
时间复杂度到底要怎么算的啊。
一直没有明白是怎么回事。。
看书也没有看明白。

希望大家指点一下。。。
搜索更多相关主题的帖子: 看书 
2012-02-17 13:41
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:0 
从来不算...靠感觉,  复杂的算法也没写过

为游戏狂~~!!    大家努力编哈!
2012-02-17 15:07
慕羿
Rank: 4
等 级:业余侠客
帖 子:40
专家分:206
注 册:2012-2-16
收藏
得分:0 
算法里才有时间复杂度吧?数据结构本身是没有的。

这个就是个数学问题,用来估算算法的时间成本。通常是用算法运算时间随参数量增大而增大的函数来表达。通常线性函数是最优的,但常常得不到这个结果。以排序算法来说,能够达到n*logn的级别就是优秀的了。当然也有例外,比如查找算法,很容易就可以做到对数函数的程度。

这个东西其实一般不需要计算,真要算的话,对于数学水平的要求就比较高了。
2012-02-17 19:24
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:20 
就是忽略常数,只考虑输入数据规模所对应的指数等级

比如冒泡排序
程序代码:
for (i=1; i<n; i++)
  for (j=i; j<n; j++)
  {   内部代码  }

我们可以看出内部代码被执行的次数是(n-1)+(n-2)+...1=1/2*n*(n-1)
所以时间复杂度是0.5*n*(n-1)*内部代码执行次数

由于内部代码执行次数是个常数,我们忽略掉,得出复杂度是n*(n-1)=n^2-n,同时我们忽略掉较低的指数级,所以最终时间复杂度是O(n^2)

然后说说为什么忽略常数和较低的指数级:
就说O(0.5n^2)和O(10000n)这两个复杂度哪个比较优秀,你可以得出当n<=某个数时第一个好,否则第二个好,但是我们可以看到当n小的时候运算时间很短可以忽略,而当n增大时第二个算法会优秀很多,所以常数相对来说没指数这么重要,同理由于指数的快速增长性,所以低指数也是可以忽略的

算法计算有很多方法,我最上面那直接算只是为了说明,一般来说都是直接估计的,看多了就会有经验的
2012-02-17 20:13
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
挣分
2012-02-17 21:32
zxd675816777
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:252
专家分:631
注 册:2012-2-3
收藏
得分:0 
楼主可以考虑下平均性态,也就是我们的加权平均或数学期望;或者是用最坏情况的复杂性,也就是最大运行次数。这两个结合起来能计算出来,或者估算出大概的时间复杂度

数学好难!
2012-02-17 21:36
魏新建
Rank: 2
等 级:论坛游民
帖 子:55
专家分:86
注 册:2012-2-17
收藏
得分:0 
我今天刚学了时间复杂度,一般看的都是最坏时间复杂度,就是最坏情况下的时间复杂度。其实简单的想,时间复杂度就是一个程序的频度,即执行的次数。只要求执行次数最多的语句的频度就好了。
2012-02-17 21:45
心灵百合
Rank: 5Rank: 5
等 级:职业侠客
帖 子:215
专家分:367
注 册:2011-3-30
收藏
得分:0 
看是否有循环,循环中是否有嵌套循环!
2012-02-17 21:54
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
回复 4楼 czz5242199
谢谢你详细指点,,

用心做一件事情就这么简单
2012-02-17 23:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
關於複雜度,給你舉一個例子,看如下兩個版本的代碼:

程序代码:
void * memchr(void * pv, unsigned char ch, size_t size)
{
    unsigned char * pch = (unsigned char * )pv;
    unsigned char * pchEnd = pch + size;
    while (pch < pchEnd && *pch != ch) pch++;
    return ((pch < pchEnd) ? pch : NULL);
}


程序代码:
void * memchr(void * pv, unsigned char ch, size_t size)
{
    unsigned char * pch = (unsigned char * )pv;
    unsigned char * pchEnd = pch + size;
    while (pch < pchEnd)
    {
        if (*pch == ch) return (pch);
        pch++;
    }
    return (NULL);
}


你覺得哪個較好?

授人以渔,不授人以鱼。
2012-02-18 11:29
快速回复:求一个简单的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018952 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved