5

老狗啃骨头之数据结构-小说算法

 3 years ago
source link: http://www.veiking.cn/blog/1016-page.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

老狗啃骨头之数据结构-小说算法_老狗啃骨头_Veiking百草园-知识点滴,日常分享


一般说,随着数据结构复杂度和解决问题的复杂度的增长,时间复杂度也是随之增长的。在相同的资源条件下,空间复杂度和时间复杂度决定了一个算法的好坏,实际运用过程中,我们还是可能会遇到空间换时间、时间换空间的情况,实际运用,很多情况下是没有最优、只有最合适的,只有精于计算、深刻理解,才好做出最恰当的算法设计

  每每从购物公园那个东门出来,抬头,总是能看到平安金融中心,感受这座深圳最高大楼带来那种视觉上的压迫和心理上的震撼,高耸如云,巍峨耸立。人类文明对自然的改造在今天的科技加成下,甚至让我们很难想象在不远的明天,将会面临何种意想不到的体验。

  这一砖一瓦、钢筋水泥、玻璃管材…… 差不多就是我们之前啰嗦半天的数据结构,但是钢筋水泥们如何能如此壮观的拔地而起,耸入云霄?就必须要考量各种因素来一套设计:如何搭梁架柱,如何飞管走线,如何修幅饰边…… 还要考虑各种气候、地质、环境等各种,等等等等太多太多因素,这样做出一个最优方案,一套近乎完美的设计。这个设计,就是算法。

  算法,是利用可用资源,解决问题的方案。就像盖一座平安大厦,钢筋水泥有了,这是数据结构;设计方案拿出来了,这是算法;建筑工人叮咣叮咣机器设备开始轰鸣…..这是程序在运行了!
  我们再来回顾一下这个公式定义:

数据结构 + 算法 = 程序
  确实,很多事情抽丝剥茧,归纳总结抽象一下,差不多也是这样子的。
  在计算机里,我们讲数据结构的时候,计算机程序的这个算法,就是用计算机解决问题的方案。

  同样是盖大房子,古代欧洲人喜欢用石头,中国人喜欢用木头,现代人则几乎相当依赖钢筋水泥。不同的方案,导致了在实用性、功能性、艺术性上,各有千秋。算法也一样,达到同样的目的、解决同样的问题,方法可能有千般万种,那怎么来评判,计算机中算法的优劣呢?
  一般计算机算法的评判,会考虑两个维度:空间和时间。完成同样功能的前提下,运算过程占用空间越小、使用时间越少,是更好的算法。

空间复杂度

  在早期的计算机中,计算单元的体积是很大的,还需要足够庞大的电力来维持运行,从数据的结构上进行精简优化,利用更少的单位完成计算,是非常非常必要的;当然在今天科技水平加持下,芯片领域的摩尔定律进化早已让空间维度不再显得那么捉襟见肘,但在超大数据的运算过程中,相对复杂的数据结构是同样会导致性能下降,以至会产生瓶颈。当然,普通计算中,空间结构的复杂也会导致存读取用花费更多时间,只不过现在计算机性能足够好,我们感觉起来不是那么明显了。说这个在程序中的实际运用,一维数组能解决的,最好不要二维,二维能解决的,最好不要三维;线性表能搞定的,最好不要弄成树或者图,除非说复杂结构能换来算法在时间维度上绝对的优势。在研究算法的层面上,算法的空间复杂度,也是很重要很重要的。

时间复杂度

  时间这个维度,很好理解,就是一个算法,程序运行体现出来的时长,时间用得越少,效率就越高,我们说就是好的算法。
  在实际编程中,我们经常会去遍历一个结构,比较常见的是遍历线性结构,这个线性表长度为n,从头到尾来一遍,我们把这每次遍历组成元素的“时间”,看成1,那这个算法的时间复杂度就为n。
  写成代码,可以直观地看到:

for(int i = 0 ; i < n ; i++){
    // do;
}

  这段代码的时间复杂度,我们就可以认为是n。
  我们也会经常遇到很多遍历再遍历的情况,写成代码就是循环套循环,代码如下:

for(int i = 0 ; i < n ; i++){
    for(int j= 0 ; j < m; j++){
        // do;
    }
}

  这种n×m的,情况,我们把n和m看成是一样的,认为直接就是n2。
  在数据结构和算法里,我们对于这个时间复杂度,一般是这么记得:复杂度n,记为O(n);复杂度n2,记为O(n2)。以此类推,根据对应的数学模型,我们总结出以下常见的时间复杂度时间关系:

O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n2)平方阶 < O(n3)(立方阶) < O(2n) (指数阶)
  一般说,随着数据结构复杂度和解决问题的复杂度的增长,时间复杂度也是随之增长的。我们在研究算法时,一般考虑的是它的最差情况,实际使用时还要考虑数据结构和数据本身的特性,来衡量这个算法的优劣。

  在相同的资源条件下,空间复杂度和时间复杂度决定了一个算法的好坏,实际运用过程中,我们还是可能会遇到空间换时间、时间换空间的情况,实际运用,很多情况下是没有最优、只有最合适的,只有精于计算、深刻理解,才好做出最恰当的算法设计。


Recommend

  • 8
    • www.veiking.cn 3 years ago
    • Cache

    老狗啃骨头之算法-插入排序

    插入排序,一般是说直接插入排序,是一种最直观最简单的排序算法。插入排序的原理是依次将未排序的数据元素插入已完成排序的有序数列,如此往复,最终完成所有数据的排序。在插入排序中,往前遍历的时候,遇到等值的元素就直接插入结...

  • 4
    • www.veiking.cn 3 years ago
    • Cache

    老狗啃骨头之算法-选择排序

    简单选择排序是一种相对简单直观的基础排序算法,每一次都做简单选择,每一次都选出最大或最小。选择排序的核心思想就是:在遍历的过程中,每次都选数据样本中最小的数据,放在首位。看起来简单纯朴吧,从第一个元素开始,每次都取剩...

  • 5
    • www.veiking.cn 3 years ago
    • Cache

    老狗啃骨头之算法-归并排序

    归并排序是一种非常典型的分治策略应用排序算法,简而概括:分而排之,合而并之。归并排序,据说是冯·诺伊曼在1945年首次提出。冯·诺伊曼,是现代计算机科学发展史上开天辟地的大佬之一,不单单是计算机领域,这哥们在整个数学、量子...

  • 8

    老狗啃骨头之数据结构-栈和队列_老狗啃骨头_Veiking百草园-知识点滴,日常分享 栈和队列也是比较常见的数据结构,它们是比较特殊的线性表。相对于数组和链表,栈和队列是一种更具特性的场景应用,栈和队列都可...

  • 4
    • www.veiking.cn 3 years ago
    • Cache

    老狗啃骨头之算法-冒泡排序

    冒泡排序是交换排序,是一种简单直观的排序算法。冒泡的算法原理是逐次循环遍历,比较两个相邻的元素,将小的(或大的)往前调。这样,每一轮都能得到一个最小的(或最大的),剩下的重复这个操作,最后完成排序。这个算法的名字,每...

  • 5

    老狗啃骨头之算法-排序算法总结_老狗啃骨头_Veiking百草园-知识点滴,日常分享 关于排序的算法,还有很多种。还有一些排序算法的思想,在不同的使用场景下再结合其它的算法逻辑,又可以衍生出新的算法设计。比...

  • 5

    天地玄黄,宇宙洪荒……千年以前,南梁周大侍郎,用一夜白头给我们留下了包罗万象又朗朗上口的童谣,得以千年唱诵,这是古人原始纯真的智慧。但浩瀚如宇宙,细微如尘沙,世间如此繁杂,计算机是搞不懂的,计算机的一零世界努力模拟,也...

  • 6

    老狗啃骨头之数据结构-图和散列表_老狗啃骨头_Veiking百草园-知识点滴,日常分享 图也是典型的非线性数据结构,相较于树,更为复杂。线性表和树在逻辑结构上都是没有回路的,图就不一样了,图任意两个元素,都...

  • 5
    • www.veiking.cn 3 years ago
    • Cache

    老狗啃骨头之数据结构-引言

    老狗啃骨头之数据结构-引言_老狗啃骨头_Veiking百草园-知识点滴,日常分享 我们存在的现实世界,是具象的,生活中的各种东西,是几十年反复加强的概念,锅碗瓢盆啤酒饮料矿泉水…但计算机是一个抽象世界,计算...

  • 2
    • www.veiking.cn 3 years ago
    • Cache

    老狗啃骨头之数据结构-树和堆

    老狗啃骨头之数据结构-树和堆_老狗啃骨头_Veiking百草园-知识点滴,日常分享 树在实际应用中非常广泛,较为具体的是,我们用到的Mysql数据库的索引,就是用B+树实现的;很多Hash结构,底层也是用到了红黑树。...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK