首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

讨厌算法的程序员 7 - 归并排序的时间复杂度分析

为了求解一个规模为n/2的子问题,第3行和第4行,各需要T(n/2)的时间,所以一共需要2T(n/2)的时间来求解2个子问题。...将每行的执行时间相加: T(n) = 2T(n/2) + D1(n) + D2(n) + C(n) (当n > 1) T(n)的表达式中又包含了T,所以上式称为T(n)的递归式。...根据分析进行简化可得到: T(n) = 2T(n/2) + Θ(n) (当n > 1) 求解递归式 求解递归式,即得到描述T(n)与输入规模n关系的函数表达式的过程。...重写递归式为:T(n) = 2T(n/2) + cn (当n > 1),然后手绘出“递归”层层展开的样子——递归树: 图(a)为T(n),是未进行递归时的表达; 图(b)为扩展成一棵描绘递归式的等价树,...关于Θ(nlgn) 现在知道时间复杂度中的lgn是如何产生的了:是基于递归的原因。

71860

讨厌算法的程序员 | 第七章 归并排序的时间复杂度分析

为了求解一个规模为n/2的子问题,第3行和第4行,各需要T(n/2)的时间,所以一共需要2T(n/2)的时间来求解2个子问题。...将每行的执行时间相加: T(n) = 2T(n/2) + D1(n) + D2(n) + C(n) (当n > 1) T(n)的表达式中又包含了T,所以上式称为T(n)的递归式。...根据分析进行简化可得到: T(n) = 2T(n/2) + Θ(n) (当n > 1) 求解递归式 求解递归式,即得到描述T(n)与输入规模n关系的函数表达式的过程。...重写递归式为:T(n) = 2T(n/2) + cn (当n > 1),然后手绘出“递归”层层展开的样子——递归树: 图(a)为T(n),是未进行递归时的表达; 图(b)为扩展成一棵描绘递归式的等价树,...关于Θ(nlgn) 现在知道时间复杂度中的lgn是如何产生的了:是基于递归的原因。

1.1K110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    拜托,面试别再问我时间复杂度了!!!

    快速排序分为这么几步: 第一步,先做一次partition; partition使用第一个元素t=arr[low]为哨兵,把数组分成了两个半区: 左半区比t大 右半区比t小 第二步,左半区递归; 第三步...void swap(int& a, int& b){ int t=a; a=b; b=t; } 分析:通过了一个中间变量t,进行了3次操作,交换了a...第三大类,递归求解 简单规则和组合规则可以用来求解非递归的算法的时间复杂度。对于递归的算法,该怎么分析呢? 接下来,通过几个案例,来说明如何通分析递归式,来分析递归算法的时间复杂度。...,这一点在分治法与减治法一章节已经详细讲述过; 【式子B】不断的展开, f(n)=n+2*f(n/2) f(n/2)=n/2+2*f(n/4) f(n/4)=n/4+2*f(n/8) … f(n/2^(.../4+2*f(n/8)]=3n+8f(n/8) =… =m*n+2^m*f(n/2^m) 再配合【式子A】: f(1)=1 即,n/2^m=1时, f(n/2^m)=1, 此时m=lg(n), 这一步

    22230

    究竟为什么,快速排序的时间复杂度是n*lg(n)? | 经典面试题

    快速排序分为这么几步: 第一步,先做一次partition; partition使用第一个元素t=arr[low]为哨兵,把数组分成了两个半区: 左半区比t大 右半区比t小 第二步,左半区递归; 第三步...void swap(int& a, int& b){ int t=a; a=b; b=t; } 分析:通过了一个中间变量t,进行了3次操作,交换了a...第三大类,递归求解 简单规则和组合规则可以用来求解非递归的算法的时间复杂度。对于递归的算法,该怎么分析呢? 接下来,通过几个案例,来说明如何通分析递归式,来分析递归算法的时间复杂度。...,这一点在分治法与减治法一章节已经详细讲述过; 【式子B】不断的展开, f(n)=n+2*f(n/2) f(n/2)=n/2+2*f(n/4) f(n/4)=n/4+2*f(n/8) … f(n/2^(.../4+2*f(n/8)]=3n+8f(n/8) =… =m*n+2^m*f(n/2^m) 再配合【式子A】: f(1)=1 即,n/2^m=1时, f(n/2^m)=1, 此时m=lg(n), 这一步,

    1.5K30

    算法导论第四章分治策略剖根问底(二)

    这里引出了一个如何求解子问题的问题,显然是采用递归调用栈的方式。因此,递归式与分治法是紧密相连的,使用递归式可以很自然地刻画分治法的运行时间。...所以,如果你要问我分治与递归的关系,我会这样回答:分治依托于递归,分治是一种思想,而递归是一种手段,递归式可以刻画分治算法的时间复杂度。所以就引入本章的重点:如何解递归式?...递归树法: 1)、对递归式T(n) = 3T(n/2) +n,利用递归树确定一个好的渐近上界,用代入法进行验证。 ?...2)、对递归式T(n) = T(n/2) + n2,利用递归树确定一个好的渐近上界,用代入法进行验证。 ? 主方法: 1)、对于下列递归式,使用主方法求出渐近紧确界。   ...a、T(n) = 2T(n/4) + 1   b、T(n) = 2T(n/4) + n1/2   c、T(n) = 2T(n/4) + n   d、T(n) = 2T(n/4) + n2 ?

    1.6K60

    算法设计关于递归方程T(n)=aT(nb)+f(n)之通用解法

    算法设计关于递归方程T(n)=aT(n/b)+f(n)之通用解法 在算法设计中经常需要通过递归方程估计算法的时间复杂度T(n),本文针对形如T(n)=aT(n/b)+f(n)的递归方程进行讨论,以期望找出通用的递归方程的求解方式...注意到条件1和3中的e总是大于0的,所以在条件1和2、条件2和3之间存在所谓的“间隙”,使得某些f(n)在该情况下不能使用该定理。...因此,我们需要找到在Master定理不能使用的情况下如何解递归方程的比较通用的办法——递归树。 经过分析,递归树解法包含了Master定理,但是Master定理可以方便的判断出递归方程的解。...根据递归树计算方式,有: T(n)= aT(n/b)+nk 。 T(n/b)= aT(n/b2)+(n/b)k 。 T((n/b2)= aT(n/b3)+( n/b2)k 。...T(n)= 2T(n/2)+nlgn 。 T(n/b)= 2T(n/22)+(n/2)lg(n/2)。 T((n/b2)= 2T(n/23)+ (n/22)lg(n/22)。

    1.6K70

    2021-06-13:如果一个节点X,它左树结构和右树结构完全一

    递归函数:头num=左num+右num+0或1。 相等判断函数:左结构=右结构,O(N)。 树越不平衡,复杂度越低,因此算复杂度的时候,只需要考虑平衡树。...master公式:T(N)=2T(N/2)+O(N)。2T(N/2)是递归。O(N)是相等判断函数。 根据master公式,时间复杂度是O(N*logN)。 方法二:方法一的相等判断函数用哈希函数。...递归函数:头num=左num+右num+0或1。头哈希=【左哈希+头值+右哈希】的哈希值。这个递归有两个返回值。 相等判断函数:左结构=右结构,用哈希值判断,O(1)。...master公式:T(N)=2T(N/2)+O(1)。2T(N/2)是递归。O(1)是相等判断函数。 根据master公式,时间复杂度是O(N)。 代码用golang编写。...head.Left.Right = &Node{Val: 4} head.Right.Left = &Node{Val: 3} head.Right.Right = &Node

    32110

    2021-06-13:如果一个节点X,它左树结构和右树结构完全一样,那么我们说以X为头的树是相等树。给定一棵二叉树的头节点hea

    递归函数:头num=左num+右num+0或1。 相等判断函数:左结构=右结构,O(N)。 树越不平衡,复杂度越低,因此算复杂度的时候,只需要考虑平衡树。...master公式:T(N)=2T(N/2)+O(N)。2T(N/2)是递归。O(N)是相等判断函数。 根据master公式,时间复杂度是O(N*logN)。 方法二:方法一的相等判断函数用哈希函数。...递归函数:头num=左num+右num+0或1。头哈希=【左哈希+头值+右哈希】的哈希值。这个递归有两个返回值。 相等判断函数:左结构=右结构,用哈希值判断,O(1)。...master公式:T(N)=2T(N/2)+O(1)。2T(N/2)是递归。O(1)是相等判断函数。 根据master公式,时间复杂度是O(N)。 代码用golang编写。...head.Left.Right = &Node{Val: 4} head.Right.Left = &Node{Val: 3} head.Right.Right = &Node

    26420

    最大子序列和问题之算法优化

    3)(三重for循环) 算法二:算法一的改进 int maxSubsequenceSum(const int a[], int n) { int i, j; int thisSum, maxSum...时间复杂度分析: 假设T(n)为求解大小为n的最大子序列和问题所花费的时间。...当n = 1是,T(1) = O(1);当n > 1时,两次递归花费的总时间为2T(n/2),两个并列的for循环花费的时间是O(len(left)+len(right)) = O(n),一共为2T(n...综上可列如下方程组: T(1) = 1 T(n) = 2T(n/2) + O(n) 事实上,上述方程组常常通用于分治算法,由方程组可算出T(n) = O(nlogn)。...)如果大于0,不管当i > t的元素大小如何,加上thisSum总会使之后的和变大,而如果thisSum小于0,肯定会使之后的和变小 ,既然还会变小,那干脆就重新来过(thisSum = 0),有些另起炉灶的意味

    1.1K70

    最大子序列和问题之算法优化

    3)(三重for循环) ---- 算法二:算法一的改进 int maxSubsequenceSum(const int a[], int n) { int i, j; int thisSum...时间复杂度分析: 假设T(n)为求解大小为n的最大子序列和问题所花费的时间。...当n = 1是,T(1) = O(1);当n > 1时,两次递归花费的总时间为2T(n/2),两个并列的for循环花费的时间是O(len(left)+len(right)) = O(n),一共为2T(n...综上可列如下方程组: T(1) = 1 T(n) = 2T(n/2) + O(n) 事实上,上述方程组常常通用于分治算法,由方程组可算出T(n) = O(nlogn)。...)如果大于0,不管当i > t的元素大小如何,加上thisSum总会使之后的和变大,而如果thisSum小于0,肯定会使之后的和变小,既然还会变小,那干脆就重新来过(thisSum = 0),有些另起炉灶的意味

    74630

    【浅记】分而治之

    解决子问题 合并问题解 递归式求解 递归树法 用树的形式表示抽象递归 T(n)=\begin{cases} 2T(\frac{n}{2})+O(n), &if&n>1\\ O(1),&if&n=...例: T(n)=5T(\frac{n}{2})+n^3 k=3 a=5,b=2,\log_ba=\log_25 k>\log_ba T(n)=\Theta(n^3) 最大子数组 基于枚举策略...} S_3 :跨中点的最大子数组 数组 X 的最大子数组之和 S_{max}=max\{S_1,S_2,S_3\} 问题在于,如何高效地求解 S_3 记 mid=\frac n2 S_3 可以分为左右两部分...求解 S_3 的算法运行时间: O(n^2) 分而治之框架的运行时间: T(n)=2T(\frac n2)+O(n^2) 直接求解的分而治之较蛮力枚举并未提高算法运行时间。...: T(n)=2T(\frac n2)+O(n\log n) 算法优化 合并问题解的同时对数组进行排序 归并过程中可同时计算逆序对数目 策略三:归并求解 从左到右扫描有序子数组: A[i]\in

    31130

    最大子数组和(LeetCode 53)

    (3)跨越中间点,low 如何找到跨越中点的最大子数组,很简单,我们只要以 mid 为起点,向左遍历找出左边最大子数组。然后以 mid+1为起点,向右遍历找出左边最大子数组。两个子数组拼接在一起,就是跨越中点的最大子数组。...很明显,求解跨越中点的最大子数组的时间复杂度是 O(n)。 我们用 T(n) 表示时间复杂度,那么左右区间的时间复杂度为 2T(n/2)。 所以总的时间复杂度为 T(n)=2T(n/2)+O(n)。...此递归式与归并排序的递归式一样,求解递归式的时间复杂度可以采用《算法导论中》中文第三版的4.5节中提出的方法,可快速求解上面递归式的时间复杂度 T(n)=O(nlogn)。...空间复杂度: 递归会使用 O(log⁡n) 的栈空间。

    13700

    文心一言 VS 讯飞星火 VS chatgpt (246)-- 算法导论18.1 4题

    我们可以通过递归的方式考虑这个问题: 对于高度为 1 的树(即只有根节点的树),最多可以包含 2t-1 个关键字(如果根节点不是叶子节点的话)。...因此,我们可以写出如下的递归公式来计算最多关键字数: MaxKeys(h, t) = if h == 1 then if t == 1 then 1 else 2t -...1 end if else (2t - 1) + t * MaxKeys(h - 1, t) end if 这个递归公式考虑了根节点包含的关键字数(2t-1...因此,可以通过以下递归关系来表示: 1.( N = 1 + (t-1) + t*(N_{h-1} + (t-1) + t*(N_{h-2} + ... + (t-1) + t*N_0) ) 2.其中 (...因此,一棵高度为 ( h ) 的 B 树可以存储的最多关键字数量 ( N ) 可以表示为: [ N = 1 + (2t - 1)(h - 1) ] 这里的 ( h - 1 ) 是因为根节点不计入高度。

    11720

    可能是最可爱的一文读懂系列:皮卡丘の复杂度分析指南

    如何做“复杂度分析“? 3. 从排序算法说起 4. 递归算法分析 5. 如何选择最好的算法? 其中,1、2部分会对复杂度分析做简单介绍(熟悉复杂度分析基本概念的同学可以跳直部分3)。...在我们画出合并排序算法的递归树之前,让我们首先看一下它的递归关系。 T(N)= 2T(N / 2)+ O(N) ? 用T(N)表示对由N元素组成的数组进行排序所完成的工作量(或所花费的时间)。...我们可以写出递归关系如下: T(N) = 2T(N / 2)+ O(N) T(N / 2)= 2T(N / 4)+ O(N / 2) T(N / 4)= 2T(N / 8)+ O(N / 4) .......T(N) = 2T(N / 2) + O(N) 这算式表示树结构中的第一层的工作量为O(N), 其余的工作量2T(N / 2)在下一层完成。...例如T(n)= 2T(n / 2)+ O(n) ? 等等,这不就是归并排序嘛! 对!这就是归并排序算法的复杂度。如果我们在主定理方法中采用归并排序的递归关系,我们得到: ?

    91550
    领券