数据结构和算法(一)复杂度

介绍

随着开发进度渐进渐深和产品用户的更高台阶的突破,你回发现数据结构和算法的重要性,作为一个Android开发工程师随着技术的发展,你会发现你要掌握的知识点要越来越广,比如Kotlin,NDK,Flutter,主流框架的源码,线程的并发等,但是所有这些知识点都离不开数据结构和算法,掌握了算法思维在技术选项的时候能够快速的定位到合适自己项目的框架。我们上大学的时候在书本上看到过这句话:数据结构+算法=程序;可见算法和数据结构的重要性,我们就重温一下这两个课题。

复杂度

我们都是到算法的优劣和算法的复杂度息息相关,那么什么是复杂度?复杂度的计算规则是什么呢?算法就是一个计算机任务,将输入数据进行加工处理得到结果的过程。算法在计算的过程会消耗两部分资源:时间资源,内存资源,我们也称内存资源就是空间资源。在这个计算任务的过程中,消耗的资源和输入的数据量有直接的关系,那么我们称复杂度是一个关于数据量N的函数。通常我们使用O(n)等表示复杂度。复杂度的计算规则如下:

  • 复杂度与具体常数无关 当输入的数据量取向无穷大的时候,常数对函数的影响可以忽略不计。
  • 多项式复杂度相加的时候,选择高着作为结果,比如O(n2)+O(n),如果用坐标系图会指出来,你回发现当N越来越大,趋向无穷大的时候O(n2)的影响性是最大的。

为了方便你理解不同计算方法对复杂度的影响,我们来看一个代码任务:对于输入的数组,输出与之逆序的数组。例如,输入 a=[1,2,3,4,5],输出 [5,4,3,2,1]。

方法一建立并初始化数组 b,得到一个与输入数组等长的全零数组。通过一个 for 循环,从左到右将 a 数组的元素,从右到左地赋值到 b 数组中,最后输出数组 b 得到结果。

  fun reverseArray(){
        val a:IntArray = intArrayOf(1,2,3,4,5)
        val b:IntArray = IntArray(5)
        for (i in a.withIndex()) {
            b[b.size-1-i.index] = i.value
        }

        b.forEach(::println)
    }

这段代码使用for循环将数组a中的元素倒序的存入b数组中,其执行次数和a数组的长度成线性关系,因此时间复杂度是O(n)
方法二我们对数组的首位元素进行交换位置,实现方式如下:

 fun reverseArray2(){
        val a:IntArray = intArrayOf(1,2,3,4,5)
        val maxIndex = a.size-1
        for(i in 0..a.size/2){
            val tmp = a[i]
            a[i]=a[maxIndex-i]
            a[maxIndex-i]=tmp
        }

        a.forEach(::println)
    }

这个算法的循环计算次数是a.size/2,因此时间复杂度是O(n/2),根据复杂度计算规则1,忽略常数后的时间复杂度是O(n),那么空间复杂度呢?空间方面我们只是定义了一个临时变量tmp,这个临时变量与元素的个数无关因此空间复杂度是O(1)。

总结

通过前面的分析我们可以知道时间复杂度和代码结构紧密相关,空间复杂度和数据结构的设计相关。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335