算法
文章平均质量分 74
Mr_Fogg
嘿嘿嘿
展开
-
算法导论--堆排序
堆排序涉及到一个数据结构就是“堆”,所以我们先从“堆”开始讲起。一、堆堆的存储方式其实就是一个数组,而堆的逻辑结构是一个完全二叉树(什么是完全二叉树请自行百度)。如图(a)是一个完全二叉树,树的父节点都比孩子节点要大,这个就是“大根堆”,如果树的父节点都比孩子节点小,那么就是一个“小根堆”。而图(b)则表示了一个图(a)是如何存储的。这样就很容易计算每个节点的父节点,左孩子节点,右孩子节点。 例如原创 2017-06-03 12:02:25 · 568 阅读 · 0 评论 -
算法导论--二叉树
搜索树这个数据结果支持很多动态的操作:搜索、最小值啦、最大值,插入和删除,当然也可以作为词典以及优先级队列。啥是二叉搜索树 上图便是二叉搜索树,一个父节点最大分两个叉,并且左孩子子树的所有节点小于等于父节点,右孩子子树的所有节点大于等于父节点。这样就可以通过访问根节点顺序的不同递归遍历这样的二叉搜索树,这就是我们所熟知的:前序遍历,中序遍历,后序遍历。 上图伪代码是中序遍历,其实中序遍历二叉原创 2017-06-17 11:47:25 · 885 阅读 · 0 评论 -
算法导论--快速排序
快速排序算法最坏情况下有O(n^2)的时间复杂度,但是在实践过程中快速排序往往有很好的平均性能,在O(nlogn)中的常数项很小。《算法导论》里有很多快速排序的分析,在这里我们不做太多的数学分析,仅仅从直觉上来谈这个算法。不仅如此,《算法导论》里的Partitioning算法也和我之前在国内教材上看的不一样,而且更容易理解。 快速排序采用“分治法”的思想,递归解决问题。原创 2017-06-06 20:36:49 · 891 阅读 · 0 评论 -
算法导论--线性时间排序
Counting sortcounting sort假设待排序的数组元素是整型,并且都在一个范围内,例如学生们的考试分数(没有0.5分)在0-100之间,这样我们可以用O(n)的时间来排序。 假如我们要给A[1…n]排序,我还需要两个数组,B[1…n]来排过序的结果,数组C[0…k]来存储临时变量。伪代码如下: 来解释一下伪代码: 2-3行:初始化C数组 4-5行原创 2017-06-08 20:27:56 · 608 阅读 · 0 评论 -
算法导论--在平均线性时间下选择元素
一般的选择问题比简单的选择最小值要难的多。但是,随着n的增大,它们所消耗的时间都是O(n)。这一次我们介绍一个基于分治法的算法来解决这个问题,叫做随机选择算法,英文名叫,RANDOMIZED-SELECT。这个算法跟快速排序很像,只不过它只在一边执行partition算法。这个区别导致这样的分析:苏日安快速排序的时间复杂度是O(nlgn),但是RANDOM-SELECT算法的平均时间是O(n),在元原创 2017-06-12 16:34:48 · 426 阅读 · 0 评论 -
Goroutine的调度分析(一)
golang这个新兴的语言,最关键的就在于goroutine,而goroutine的调度又是golang的核心。可以说,没有goroutine,那么这个语言就会毫无意义,没有发明的必要。为了能够更好的写出高质量的代码,最近学习了goroutine的调度,收获良多。写篇文章总结记录一下。我的参考资料Analysis of the Go runtime scheduler 一篇分析goroutine的论原创 2017-09-24 23:46:39 · 889 阅读 · 0 评论