摘要:1. 引言 这一篇我们来探讨选择问题。 它的提法是:输入:一个包含n个(互异)数的序列A和一个数i(1≤i≤n)。输出:元素x(x∈A),且A中有i-1个元素比x小。简单的说,就是在A中找到第i小的数。2. 期望为线性时间的选择算法(1) 算法描述与实现 我们先给出算法的伪代码描述:其主要思想与我们... 阅读全文
posted @ 2015-09-27 14:31 学数学的程序猿 阅读(440) 评论(0) 推荐(0) 编辑
摘要:1. 比较排序算法的下界 (1) 比较排序 到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序n个数的算法:归并排序和堆排序达到了最坏情况下的上界;快速排序在平均情况下达到该上界。 如果仔细观察,我们会发现:在排序的最终结果中,各元素之间的次序依赖于它们之间的比较。我们把这类排序算法统称为比较排序。到目前为止我们介绍的排序算法都是比较排序。下面我们来论... 阅读全文
posted @ 2015-09-23 17:14 学数学的程序猿 阅读(6941) 评论(0) 推荐(1) 编辑
摘要:1. 算法描述 快速排序(quick-sort)与前面介绍的归并排序(merge-sort)(见算法基础——算法导论(1))一样,使用了分治思想。下面是对一个一般的子数组A[p~r]进行快速排序的分治步骤: ① 分解:数组A[p~r]被划分为两个子数组A[p~q]和A[q+1~r],使得 A[q] 阅读全文
posted @ 2015-09-21 21:00 学数学的程序猿 阅读(8913) 评论(0) 推荐(2) 编辑
摘要:1. 预备知识 1.1 基本概念 先来介绍堆的概念。 如图(a),(二叉)堆是一个近似的完全二叉树。树中的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且从左向右填充。 堆可以用数组来实现,如图(b)所示。堆中的节点在数组中,按树广度优先遍历的结果依次排列。在这种实现方式下,堆应 阅读全文
posted @ 2015-09-17 20:48 学数学的程序猿 阅读(1555) 评论(0) 推荐(0) 编辑
摘要:1. 引言 接下来几篇将通过几个有趣的例子继续探究概率分析和随机算法。2. 生日悖论(1) 问题的提出 我们的第一个例子是生日悖论:一个屋子里人数必须要达到多少人,才能使其中两人的生日相同的机会达到50%。你可能认为是365 / 2,但事实上,答案是一个很小的数值。下面我们对这个问题进行分析。(2)... 阅读全文
posted @ 2015-09-15 12:24 学数学的程序猿 阅读(1623) 评论(2) 推荐(0) 编辑
摘要:1. 雇用问题(1) 提出问题 你的老板让你为公司雇用一名程序员,现在有n个人投了简历。你每天会随机的从这n份简历中挑选一份,然后让对应的投简历者过来面试,每次面试都将花费C1。而你的雇用原则是:如果当前面试的程序员比目前的程序员优秀,那么你就辞掉目前的程序员,而花高价C2去聘请面试的这位程序员。你... 阅读全文
posted @ 2015-09-14 18:56 学数学的程序猿 阅读(1550) 评论(0) 推荐(0) 编辑
摘要:1. 引言 这一篇博文主要介绍基于分治策略的矩阵乘法的Strassen算法。2. 矩阵乘法的Strassen算法(1) 普通矩阵乘法算法 矩阵乘法的基本算法的计算规则是: 若A=(aij)和B=(bij)是n×n的方阵(i,j = 1,2,3...),则C = A · B中的元素Cij为: 下面给出... 阅读全文
posted @ 2015-09-13 13:36 学数学的程序猿 阅读(809) 评论(2) 推荐(1) 编辑
摘要:1. 从一个股价的问题说起 假如你获得了一种可以预测未来某公司股价的能力。下图是你预测的股价情况,那么你会在哪一天买入,哪一天卖出呢? 你可能认为可以在这17天当中的股价最低的那天(第7天)买入,然后在之后的股价最高的那天(第11天)卖出;或者反过来,在整段时间内股价最高的那天卖出,然后在之前的股价 阅读全文
posted @ 2015-09-11 14:59 学数学的程序猿 阅读(1231) 评论(2) 推荐(1) 编辑
摘要:1. 引言 这一章主要是介绍一些概念,虽然很乏味,但是它确实能够帮助我们去更好的分析、处理问题。2. 渐进记号(1) θ 记号 在上一章中,我们记插入排序的最坏运行时间为:T(n) = θ(n²)。下面给出严格的定义:θ(g(n)) = {f(n):存在正常量c1,c2,n0,使得对所有n ≥ ... 阅读全文
posted @ 2015-09-10 13:49 学数学的程序猿 阅读(736) 评论(0) 推荐(1) 编辑
摘要:1. 写在前面 本篇博文是学习算法导论的第一次记录,主要想介绍如何去证明算法的正确性;如何去评判一种算法的好坏;以及如何去改进算法。 2. 从插入排序说起 插入排序(insert-sort)是一种十分常见的算法,我们在生活中可能就经常在使用——玩扑克。考虑我们抓牌时的场景。首先,你的右手(不考虑左撇 阅读全文
posted @ 2015-09-05 02:04 学数学的程序猿 阅读(2406) 评论(0) 推荐(4) 编辑