现在来看,堆的含义大概有两种,一种是数据结构,一种是在一些语言中所定义的“垃圾回收机制”,如Java,在书本上的开篇强调了这两者,并强调若非特殊说明,皆把堆看做是一种数据结构。(二叉)堆的定义:1)它是一个数组,可以被看成是一棵近似的完全二叉树,树上的每一个节点看做是数组中的每一个元素。2)堆分为最...
分类:
编程语言 时间:
2015-09-20 16:18:56
阅读次数:
240
计数排序是一种能够达到运行时间能够线性时间θ(n)的排序算法。在排序算法里算是最快的算法之一,当然,他有很强烈的前提。下面开始介绍一下技术排序(Counting Sort)。算法思想计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,此处k为某个整数。这样可以用一个数组C[0..k]来记录待排序数组里元素的数量。当k=O(n)时,计数排序的运行时间为θ(n).
注:关于C[0..k],用...
分类:
编程语言 时间:
2015-09-18 12:03:25
阅读次数:
209
1. 预备知识 (1) 基本概念 如图,(二叉)堆一个数组,它可以被看成一个近似的完全二叉树。树中的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且从左向右填充。堆的数组A包括两个属性:A.length给出了数组的长度;A.heap-size表示有多少个堆元素保存在该数组中(因为...
分类:
编程语言 时间:
2015-09-17 21:22:24
阅读次数:
351
一、插入排序算法导论上有很形象的比喻,把插入排序类比成扑克牌,默认你手里本身拥有的第一张是有序的,第二章和第一张对比后决定其位置,以此类推。代码如下: 1 public class InsertSort { 2 public void insertSort(int[] a){ 3 ...
分类:
编程语言 时间:
2015-09-17 01:06:13
阅读次数:
256
题目定义: 给定一个大小为n的数组,无序,找到其中的最大值和最小值,要求元素间的比较次数尽可能少。这道题出自《算法导论》。创新工场2016校招笔试也考了这道题。以下摘自《算法导论》: 事实上,我们只需要最多3?n/2?次比较就可以同时找到最小值和最大值。具体的方法是记录已知的最大值和最小值,然后.....
分类:
其他好文 时间:
2015-09-16 21:31:05
阅读次数:
141
在上一篇中,通过一个求连续子数组的最大和的例子讲解,想必我们已经大概了然了分治策略和递归式的含义,可能会比较模糊,知道但不能用语言清晰地描述出来。但没关系,我相信通过这篇博文,我们会比较清楚且容易地用自己的话来描述。 通过前面两章的学习,我们已经接触了两个例子:归并排序和子数组最大和。这两个例...
分类:
编程语言 时间:
2015-09-15 21:38:12
阅读次数:
192
1. 引言 接下来几篇将通过几个有趣的例子继续探究概率分析和随机算法。2. 生日悖论(1) 问题的提出 我们的第一个例子是生日悖论:一个屋子里人数必须要达到多少人,才能使其中两人的生日相同的机会达到50%。你可能认为是365 / 2,但事实上,答案是一个很小的数值。下面我们对这个问题进行分析。(2)...
分类:
编程语言 时间:
2015-09-15 14:34:45
阅读次数:
183
我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下。但我一直不明白这是怎么算出来的,因此通过阅读《算法导论-第2版》的2.2节,使用对插入排序最佳时间复杂度推算的方法,来计算冒泡排序的复杂度。1. 《算法导论》2.2中对插入排序最佳时间复杂度的推算 在最好情况下,....
分类:
编程语言 时间:
2015-09-14 22:35:27
阅读次数:
342
1. 雇用问题 (1) 提出问题 你的老板让你为公司雇用一名程序员,现在有n个人投了简历。你每天会随机的从这n份简历中挑选一份,然后让对应的投简历者过来面试,每次面试都将花费C1。而你的雇用原则是:如果当前面试的程序员比目前的程序员优秀,那么你就辞掉目前的程序员,而花高价C2去聘请面试的这位程序员。...
分类:
编程语言 时间:
2015-09-14 19:26:43
阅读次数:
195
1. 引言 这一篇博文首先会介绍基于分治策略的矩阵乘法的Strassen算法,然后会给出几种求解递归式的方法。 2. 矩阵乘法的Strassen算法 ...
分类:
编程语言 时间:
2015-09-13 14:29:28
阅读次数:
301