算法导论
文章平均质量分 81
啃着算法导论
FibonacciCode
因为热爱而坚持,因为坚持而卓越
展开
-
八、计数排序及其应用分析
1 本节思路之前的算法的最基本的思想是比较元素大小,所以算法复杂度最好是Θ(nlogn)\Theta(nlogn)Θ(nlogn),本节不再基于元素比较,而是基于计数的Counting sort,然后应用在Radix sort上。2 Counting sort2.1 算法思想Counting sort算法的思想比较简单,就是通过统计每个数字的的个数确定每个数字的位置,譬如【8,6,2】这三个数,通过计数统计知道#8=1,#6=1,#2=1,很自然就是2排正位置1上,6排在位置1+1=2上,8排在位置原创 2021-02-13 19:40:31 · 201 阅读 · 1 评论 -
七、基于比较的排序算法总结
1 问题至此,总结一下已经研究过的排序算法:insertion sort,Θ(n2)\Theta(n^2)Θ(n2)merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlogn)quicksort, Θ(nlogn)\Theta(nlogn)Θ(nlogn)heapsort,Θ(nlogn)\Theta(nlogn)Θ(nlogn)从上面这个现象发现,这些算法的算法复杂度≥Θ(nlogn)\ge\Theta(nlogn)≥Θ(nlogn);从算法的细节上看,算法的原创 2021-02-01 21:35:36 · 299 阅读 · 0 评论 -
六、Analysis of quicksort
1 引言如题目所示,本节的精华在于用数学解决一个直觉上看似纷乱复杂的问题,里面有一些一般性的分析方法,如引入Indicator变量,从而把不确定问题引入到概率框架进行分析,一步一步把直觉上混乱的问题理清楚,数学之美也就是如此吧!如果有个算法在某些情况下表现的很差,在某些情况下又表现的不错,那么你还会放心的使用该算法吗?通过下面的分析后你会很放心使用快速排序算法。2 Quicksort2.1 算法描述2.2 手工演示指针iii指示的是≤pivot\leq pivot≤pivot的最后一个,作原创 2021-01-24 16:21:33 · 149 阅读 · 0 评论 -
五、分治法应用--矩阵乘法
1 朴素算法这个算法就是矩阵乘法的定义:很容易看出这个算法复杂度是Θ(n3)\Theta(n^3)Θ(n3)。2 递归算法分治法首先是从分割问题开始的,得到数学上的递归关系后,然后使用递归的方式实现。由上面的数学性质,可以使用递归实现:T(n)=8T(n/2)+Θ(n2)T(n)=8T(n/2)+\Theta(n^2)T(n)=8T(n/2)+Θ(n2),应用主定理可知,T(n)=Θ(n3)T(n)=\Theta(n^3)T(n)=Θ(n3),没有什么进步,不过这里分割思路是没有问题原创 2021-01-17 19:41:15 · 2516 阅读 · 1 评论 -
四、Dynamic-programming algorithm Dynamic--LCS
(学习笔记,无什参考价值!)1 问题2 算法2.1 Brute-force LCS algorithm检查每一个subsequence是否是yyy的子列时,遍历yyy的每一个元素,看是否依次可以全部覆盖subsequence所有元素,所以其复杂度为O(n)O(n)O(n);2.2 Dynamic-programming hallmark #1动态规划的第一特征–最优子结构,下面用定理的方式证明这种特征;这个性质是说,一个规模稍大的最优解问题建立在一些规模较小的最优解问题基础原创 2021-01-10 15:29:19 · 401 阅读 · 0 评论 -
三、递归树分析法
1 问题2 解决思路使用递归树猜想一个上界,使用归纳法证明上界也是下界。2.1 使用递归树(recursion tree)猜想结论(不严谨)使用递归树两点:1⃣️逐行展开;2⃣️逐行相加;逐行展开本质上是分解问题,每个非叶子结点表示分解+合并问题所付出的代价,叶子结点表示解决边界问题所付出的代价。逐层求和这里要注意,除去非叶子结点,每一层的和呈现出等比数列性质,计算整个代价T(n)T(n)T(n)本质上就是分解(合并)问题付出的代价+解决递归边界付出的代价。Case1:分解问题的代价原创 2020-12-30 20:45:13 · 951 阅读 · 0 评论 -
二、Merge sort
1 问题2 算法2.1 伪代码 2.2 算法思想2.3 手工演示2.4 Python实现在这里插入代码片3 算法分析原创 2020-12-13 15:18:22 · 193 阅读 · 1 评论 -
一、Insertion sort
1. 问题2. 算法2.1 伪代码2.2 算法思想2.3 手工演示2.4 Python实现《算法导论》一书数组默认从111开始,这种方式适合算法分析,从000开始适合程序实现,为了能和伪代码一致便于对比,后边所有的Python实现中数组均从111开始。# -*- coding: utf-8 -*-import sysdef insertion_sort(A, n): for j in range(2, n+1): key = A[j] i原创 2020-12-13 13:04:25 · 131 阅读 · 2 评论