随笔分类 -  算法导论

算法导论 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个数大于... 阅读全文

posted @ 2014-06-14 23:18 windmissing 阅读(2000) 评论(0) 推荐(0)

第26章 最大流(正在修改)
摘要:一、综述 1.定义 定义1:流网络 定义2:残留容量 定义3:增广路径 已知一个网络流G=(V,E)和流f,增广路径p为残留网络G|f中从s到t的一条简单路径 能够沿一条增广路径p的每条边传输的网络流的最大量为p的残留容量,由下式定义: c|f(p) = min{c|f(u,v) : (u,v)在p上} 定义4:割、净流、容量、最小割 净流和容量的区别: 穿过(S,... 阅读全文

posted @ 2014-06-13 20:54 windmissing 阅读(626) 评论(0) 推荐(0)

算法导论 第12章 二叉查找树
摘要:一、概念1.定义与性质(1)设x为二叉查找树中的一个结点,若y是x左子树中的一个结点,则key[y] 2 #include 3 using namespace std; 4 5 struct BST_Node 6 { 7 public: 8 int key;//关键字 ... 阅读全文

posted @ 2014-06-10 20:33 windmissing 阅读(280) 评论(0) 推荐(0)

算法导论-9.3-7
摘要:题目:给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k<=n后,它能确定出S中最接近其中位数的k个数思考:step1:求出数组的中位数的值O(n)step2:计算数组每个数与中位数差的绝对值,存于另一个数组B中O(n)step3:求出数组B中第k小的数ret O(n)step4:计算数组S中与ret差的绝对值小于ret的数并输出O(n)其中,step4也可以通过划分的方法找出数组S中与ret差的绝对值小于ret的数代码: 1 #include <iostream> 2 using namespace std; 3 4 int length_A; 5 阅读全文

posted @ 2012-06-25 15:06 windmissing 阅读(399) 评论(0) 推荐(0)

算法导论-9.3-6算法导论-9.3-6 .
摘要:题目:对一个含有n个元素的集合来说,所谓k分位数(the kth quantile),就是能把已排序的集合分成k个大小相等的集合的k-1个顺序统计量。给出一个能列出某一集合的k分位数的O(nlgk)时间的算法思考:令每个子集合的元素个数为t = n / k,A[j]是数组A中下标为j的元素,A(j)是数组是第j大的元素则所求的k分位数是指A(t),A(2t),A(3t),……,A((k-1)t)按顺序依次求这k-1个数的运行时(k-1)*n要使运行时间为O(nlgk),改进方法是不要依次寻找这k-1个数,而是借用二分的方法来找。先找第k/2个分位数,再以这个分位数为主元把数组分为两段,分别对这 阅读全文

posted @ 2012-06-25 14:00 windmissing 阅读(1116) 评论(0) 推荐(0)

算法导论-9.3-3
摘要:题目:假定元素的值不同,说明如何才能使快速排序在最坏情况下以O(nlgn)时间运行思考:要改善最坏情况的下运行时间,就要从划分入手,保证即使是最坏情况,也要尽量均衡地划分。因此,使用SELECT找到中值,再以这个中值为主元进行划分代码:1.以RANDOMIZED-SELECT作为选择中值的算法 1 //9.3-3-使用RANDOMIZED-SELECT作为选择中值算法 2 #include <iostream> 3 using namespace std; 4 5 //已经出现很多次了,不解释 6 int Partition(int *A, int p, int r) 7 { 8 阅读全文

posted @ 2012-06-24 20:07 windmissing 阅读(470) 评论(0) 推荐(0)

算法导论-8-3-排序不同长度的数据项
摘要:题目:a)给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但是该数组中,所有整数中总的数字数为n。说明如何在O(n)时间内对该数组进行排序b)给定一个字符串数组,其中不同的串包含的字符个数可能不同,但所有串中总的字符个数为n。说明如何在O(n)时间内对该数组进行排序(注意此处的顺序是指标准的字母顺序,例如,a < ab < b)思路:a)先用桶排序方法按数字位数排序O(n),再用基数排序的方法分别对每个桶中的元素排序O(n)b)递归使用计数排序,先依据第一个字母进行排序,首字相同的放在同一组,再对每一组分别使用计数排序的方法比较第二个字母见到有人用字典树,也是可以的代码: 阅读全文

posted @ 2012-06-23 15:14 windmissing 阅读(290) 评论(0) 推荐(0)

算法导论8.3-4
摘要:题目:如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序思路:把整数转换为n进制再排序代码:#include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A, int start, int end){ int i; for(i = start; i <= end; i++) { if(i == start)cout<<'{'; else cout<<' ' 阅读全文

posted @ 2012-06-23 11:27 windmissing 阅读(253) 评论(0) 推荐(0)

算法导论7-6对区间的模糊排序
摘要:题目:考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi]的闭区间,其中ai,≤bi.算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序<i1, i2, i3, i4,…in>,使得存在一个 cj∈[ai, bi],满足c1≤c2≤…≤cn.a)为n个区间的模糊排序设计一个算法,你的算法应该具有算法的一般结构,它可以快速排序左部端点(即各ai),也要能充分利用重叠区间来改善运行时间.(随着各区间重叠得越来越多,对各区间的排序的问题会变得越 阅读全文

posted @ 2012-06-21 09:19 windmissing 阅读(277) 评论(0) 推荐(0)

第8章 线性时间排序
摘要:一、概念任何比较排序在最坏情况下都要用O(lgn)次比较不进行排序计算排序、基数排序、桶排序都是稳定排序二、代码#include <iostream>#include <cmath>using namespace std;int length_A, digit;void Print(int *A, int start, int end){ int i; for(i = start; i <= end; i++) { if(i == start)cout<<'{'; else cout<<' '; cout&l 阅读全文

posted @ 2012-06-20 10:24 windmissing 阅读(171) 评论(0) 推荐(0)

第7章 快速排序
摘要:一、概念快速排序是基于分治模式的快排的运行时间与划分是否对称有关、最坏情况下,时间复杂度是O(n^2),最好情况下,时间是O(nlgn)二、程序#include <iostream> using namespace std; //输出过程 void Print(int *A, int len) { for(int i = 0; i < len; i++) { if(i)cout<<' '; else cout<<"==> A = {"; cout<<A[i]; } cout<<' 阅读全文

posted @ 2012-06-19 11:00 windmissing 阅读(207) 评论(0) 推荐(0)

第6章 堆排序
摘要:一、概念堆是一种数组对象,却被视频一棵完全二叉树二、程序#include <iostream> #include <stdio.h> using namespace std; #define PARENT(i) (i)>>1 #define LEFT(i) (i)<<1 #define RIGHT(i) ((i)<<1)+1 int length = 10;//数组中元素的个数 int heap_size = 10;//属于堆的元素个数,看到HeapSort就会明白 /******************其它************* 阅读全文

posted @ 2012-06-17 15:42 windmissing 阅读(342) 评论(0) 推荐(0)

算法导论6.5-8堆排序-K路合并
摘要:一、题目:请给出一个时间为O(nlgk)、用来将k个已排序链表合成一个排序链表算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)二、步骤:step1:取每个链表的第一个元素,构造成一个含有k个元素的堆step2:把根结点的值记入排序结果中。step3:判断根结点所在的链表,若该链表为空,则go to step4,否则go to step5step4:删除根结点,调整堆,go to step2step5:把根结点替换为原根结点所在链表中的第一个元素,调整堆,go to step 2三、代码://heap.h #include <iostream> #inclu 阅读全文

posted @ 2012-06-16 10:39 windmissing 阅读(279) 评论(0) 推荐(0)