算法导论
DreamMakers
凡办大事,以识为主,以才为辅,凡成大事,人谋居半,天意居半。
展开
-
算法导论第7章快速排序答案
一、概念快速排序是基于分治模式的,选择一个数作为主元,经过一遍扫描,所有小于主元的数放在主元的左边,大于主元的数放在主元的右边,这样就划分成了两组数据。然后对两组数分别进行快排。快排的运行时间与划分是否对称有关,关键是如何选择主元。最坏情况下,时间复杂度是O(n^2),最好情况下,时间是O(nlgn)二、程序[cpp] view plaincopypri转载 2012-11-25 15:57:10 · 3597 阅读 · 0 评论 -
红黑树实现(Java语言)
最近在看红黑树,也想自己写程序实现一下,因为红黑树的删除还没有看,所以程序中并没有包含删除操作,等看完了再补上,呵呵。。。至于红黑树的原理我就不多说了,我是参考中的伪代码写的程序。代码实现如下:package com.datastructure.tree;public class MyRbTree { RbTreeNode root=null; RbTreeNode原创 2012-12-21 16:55:05 · 812 阅读 · 0 评论 -
算法导论15.5最优二叉查找树实现(Java语言)
这两天在看算法导论中的最优二叉查找树,关于最优二叉查找树的动态规划实现原理大家可以参考算法导论第15章第5小节。我把自己用Java语言实现的最优二叉查找树贴出来供大家参考一下。package homework.part5.work1;import java.util.Scanner;public class OptimalBST { private double[]原创 2012-12-30 21:43:46 · 2427 阅读 · 0 评论 -
算法导论15.2 矩阵链乘法
下面讲述一下动态规划法的一个应用实例——矩阵链乘法。下面是Java语言实现的矩阵链乘法,代码按照算法导论严格编写,大家可以对照着算法导论进行学习。实现代码如下:package homework.part2.work1;public class Matrix_Chain { public int[][] m; public int[][] s; publi原创 2012-12-27 11:10:23 · 1581 阅读 · 0 评论 -
算法导论第7章课后题(对区间的模糊排序)
一、题目考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序1, i2, i3, i4,…in >,使得存在一个 cj ∈[ai, bi ],满足c1≤转载 2012-11-25 16:00:44 · 890 阅读 · 0 评论 -
算法导论第6章堆排序答案
一、概念1.堆的定义与性质(1)堆是一种数组对象(2)堆可以被视频一棵完全二叉树,二叉树的层次遍历结果与数组元素的顺序对应,树根为A[1]。对于数组中第i个元素,具体计算如下PARENT(i) return i/2LEFT(i) return 2iRIGHT(i) return 2i+1(3)一个最大堆对应的树,每一个结点p,若其孩子存在,则key[p] > key[p转载 2012-11-23 19:38:54 · 1617 阅读 · 0 评论 -
算法导论 9.3-8 求两个数组的中位数
一、题目设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数,给出一个求数组X和数组Y中所有2n个元素的中位数的O(lgn)时间的算法二、思路递归求解该问题,解题规模不断减半,最后剩下4个元素时,得到问题的解,本文求的是下中位数,下中位数的特点是:(1)当n为奇数,令n = 2 * m + 1,下中位数是第m+1小的数,数组中有m个数小于下中位数,有m转载 2012-12-06 22:34:30 · 1258 阅读 · 0 评论 -
算法导论 6-3 Young氏矩阵
一、题目二、思考[plain] view plaincopyprint?a)不唯一 2 3 4 5 8 9 12 14 16 c) 提取Y[1][1],并用ox7FFFFFFF填充。然后向右下调整 YOUNG-EXTRACR-MIN(Y) 1 if Y[1][1] == 0X7FFFFFFF转载 2012-11-23 19:55:53 · 920 阅读 · 0 评论 -
算法导论6.5-8堆排序-K路合并
一、题目请给出一个时间为O(nlgk)、用来将k个已排序链表合成一个排序链表算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)二、步骤step1:取每个链表的第一个元素,构造成一个含有k个元素的堆step2:把根结点的值记入排序结果中。step3:判断根结点所在的链表,若该链表为空,则go to step4,否则go to step5step转载 2012-11-23 19:24:11 · 832 阅读 · 0 评论 -
算法导论 9.1-1 求第二小元素
一、题目证明:在最坏情况下,利用n+ceil(lgn)-2次比较,即可得到n个元素中的第2小元素。(提示:同时找最小元素)二、思考step1:对所有元素,两个一组比较大小,小的一个进入下一轮比较。一直到比较出最小的元素。此时所有比较结果构成一棵二叉树。比较次数为n-1。step2:沿着树从树根向下到叶子,找出第二小的元素,比较次数是ceil[lgn]-1。令m2[p转载 2012-12-02 21:02:35 · 892 阅读 · 0 评论 -
算法导论第8章线性时间排序答案
一、概念1.比较排序比较排序是指通过输入元素间的比较来确定各元素次序的排序算法。任何比较排序在最坏情况下都要用O(nlgn)次比较来进行排序合并排序和堆排序是渐近最优的2.非比较排序非比较排序指使用一些非比较的操作来确定排序顺序的排序算法对于非比较排序,下界O(nlgn)不适用计数排序是稳定排序,若n个数据的取值范围是[0..k],则运行时间为O(n+k),转载 2012-11-27 10:42:55 · 1830 阅读 · 0 评论 -
算法导论-8-3-排序不同长度的数据项
一、题目a)给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但是该数组中,所有整数中总的数字数为n。说明如何在O(n)时间内对该数组进行排序b)给定一个字符串数组,其中不同的串包含的字符个数可能不同,但所有串中总的字符个数为n。说明如何在O(n)时间内对该数组进行排序(注意此处的顺序是指标准的字母顺序,例如,a 二、思路a)先用计数排序算法按数字位数排序O(n)转载 2012-11-27 10:47:09 · 737 阅读 · 0 评论 -
算法导论8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序
Java实现如下:package com.application.sample;import java.util.Arrays;import java.util.Random;//算法导论第8章练习题8.3-4public class Algorithm8 { /** * @param args */ public static void mai原创 2012-11-27 12:41:34 · 1641 阅读 · 0 评论 -
算法导论8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序 .
一、题目如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 二、思路把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 三、代码[cpp] view plaincopyprint?#include #include using namespace std; int n, radix转载 2012-11-27 10:45:01 · 1591 阅读 · 0 评论 -
算法导论16.1 活动选择问题
这篇文章主要讲述一个经典问题:活动选择问题。并给出该问题的贪心算法实现和动态规划实现。对于该问题的描述,在算法导论第16章给出了详细的讲解,这里就不做解释说明了,下面给出贪心算法的Java语言实现:package chapter1.homework1;import java.util.*;public class ActivitySelector { private i原创 2013-01-13 14:28:56 · 2092 阅读 · 0 评论