算法分析主要研究两个内容:时间复杂度 和 空间复杂度。 时间复杂度分析 一般来说,最关注的是时间复杂度。(或称时间上的增长数量级) 1. 时间复杂度的渐进表示 1. 渐近上界: 表示 T(N) 的阶数小于或等于 f(N) 的阶数,这种记法称为大 O 标记法。 (该算法不会比 f(N) 还坏) 写成极 ...
分类:
编程语言 时间:
2018-05-12 15:12:58
阅读次数:
242
国际惯例的题面:一看到这种维护序列的题,数据范围分块过不去,显然线段树了。考虑位运算的性质,and相当于钦定一些位必须是0,or相当于钦定一些位必须是1,这都是一些区间赋值操作。然而我们不可以按位确定,为什么?因为当你确定了最高位之后,你需要在满足高位的情况下求出低位,这相当于是一个取子集操作,单层 ...
分类:
其他好文 时间:
2018-05-05 00:27:57
阅读次数:
259
题:有一个字符串数组,将数组中的每一个字符串按照字母序排序;之后再将整个字符串数组按照字典序排序。整个操作的时间复杂度? 分析: 1.假设最长的字符串长度为s;数组中有n个字符串 2.对每个字符串排序:O(slogs) 3.将数组中的每一个字符串按照字母序排序:O(n slogs) 4.将整个字符串 ...
分类:
编程语言 时间:
2018-05-04 14:18:03
阅读次数:
271
例子: 有一个字符串数组,首先将数组中每一个字符串按照字母序排序,之后再将整个字符串按照字典序排序。整个操作的时间复杂度? 答: 假设最长的字符串长度是s,数组中有n个字符串。 对每个字符串进行排序: slogs, 共有n个,所以 n s log(s) 所有的字符串进行排序:O(s\ nlog(n) ...
分类:
编程语言 时间:
2018-05-02 23:52:20
阅读次数:
262
经常能遇到类似于这样的情况,给出一个n,寻找[1,n]中每个数x的所有落于[1,n]中的倍数。 举一个比较常见的例子,我们用普通的筛法寻找[1,n]之间的所有素数并标记。代码大概如下: 很容易发现对于数x,在区间[1,n]中其倍数数目为floor(n/x)。而累加每个数,倍数的总数为$ \sum_{ ...
分类:
其他好文 时间:
2018-02-24 23:08:30
阅读次数:
176
题目 第一步 复杂度分析 由于 n 的级别是100的,所以可以往O(n^3)上面想,数组可以开到三维。 第二步 类比 类比普通的树龟,我们通常设F[i][j]表示在以 i 为根的子树上选取 j 个结点的最优解。但这道题并不同于普通的树龟。所以需要寻找它与普通树龟的根本差别。 可以发现这道题多了一个D ...
分类:
其他好文 时间:
2018-01-30 00:08:31
阅读次数:
222
查找无序数组的中位数,要想时间复杂度为O(n)其实用计数排序就能很方便地实现,在此讨论使用快速排序进行定位的方法。 1、中位数定义 2、算法思想 3、Java代码实现 4、时间复杂度分析 5、附录 中位数一般两种定义: 第一种: 排序后数组的中间位置的值,如果数组的个数是偶数个,则返回排序后数组的第 ...
分类:
编程语言 时间:
2018-01-26 20:59:15
阅读次数:
241
算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增 ...
分类:
其他好文 时间:
2018-01-18 16:58:28
阅读次数:
175
Java排序算法 1)分类: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆 ...
分类:
编程语言 时间:
2018-01-08 10:59:28
阅读次数:
205
2017-12-30 17:01:18 递归问题的时间复杂度分析广泛存在于分治法和DP中,根据算法导论的记载,可以使用主定理的公式直接计算。另外,这篇文章介绍一下使用迭代手算的过程。 主定理 迭代计算 有一点需要说明:2^k*T(n/2^k) = 2^k*T(1) := 2^k*O(1) = n*O ...
分类:
其他好文 时间:
2017-12-30 19:09:48
阅读次数:
139