在归并排序或者和二叉树相关的算法中,我们需要将处理的数据,分割成两部分,然后再组合,此时关于时间复杂度,就成为了这样
T(N) = 2T(N/2) + O(N)
我们知道,归并排序的时间复杂度是 O(NlogN),那么这是怎么推导出来的呢?或者说更抽象一点,类似于这种分治手段的时间复杂度怎么计算呢?在《算法导论》中提出了主方法的概念,如下
image
正如图中所示,由于a,b的不同关系,T(n)有三种可能性,接下来就来详细推导这个过程。
首先我们先得做一个假定,T(1)=1,因为如果数据只有一个的话,我们根本不需要排序,只需要遍历一下即可,然后设 N = b的k次方,这样就去掉了n这个变量,同时a,b,n,d就被连接起来,我们只需要对式子进行化简,并注意合并,即可完成推导……
详细推导可以查看视频哦
<mpvideosnap class="js_uneditable custom_select_card channels_iframe custom_select_card_selected" data-pluginname="videosnap" data-id="export/UzFfAgtgekIEAQAAAAAA--gSadFMCwAAAAstQy6ubaLX4KHWvLEZgBPEmKFMZDxFMZb4zNPgMIuB0ingUHP1-wpoz7cvChdu" data-url="https://findermp.video.qq.com/251/20350/stodownload?encfilekey=wMyh8PvoRic4QvEiapufQCa94hDqSSU4IKW8K58jG1YvDXDoptXAJXtZyueoBehakGnJkjCyzmJKpjTpEg8oyofI2dbmsdS51Lkb4r8LTMnHExdeGSdbXkluWia963aSbWhJJibWVA9OEYoUSfXwdqNnKynFuX7IlRADoU6gQlq5tuy1iceicjD3Whhw&adaptivelytrans=0&bizid=1023&dotrans=0&hy=SZ&idx=1&m=61f89de81cc63761443191c481fc10dc&token=x5Y29zUxcibB5swgCmOQ85rZu3a3nmtpKFuV6NLpBe6wgTictLQuhoaA4EBN2SzOAG" data-headimgurl="http://wx.qlogo.cn/finderhead/lXKSjDuiaN7xwWmRxpzbTFUXr3xW2Qia5U66m39pNpUNA/0" data-username="v2_060000231003b20faec8cae0891cc4d6cf06ee31b077c6493cb053a5e0f8c8659f89829db088@finder" data-nickname="小松漫步" data-desc="递归时间复杂度计算大杀器" data-nonceid="2106970874272682350" data-type="video" contenteditable="false" style="margin: 0px 1px; padding: 0px; max-width: 100%; overflow-wrap: break-word !important; box-sizing: border-box !important; position: relative; display: inline-block; width: 575.109px;">image
小松漫步递归时间复杂度计算大杀器视频号</mpvideosnap>推导所用到的知识基本大学都学过,但是小松在自己推导的时候,总是卡壳,学习只要 20 分钟,但是录视频却录了 1 个小时,剪辑更是花了 2 小时……不过,这也让小松对于推导过程烂熟于心,加油吧,打工人公众号回复【数据结构与算法】,即可获取pdf版