算法导论

算法导论 5.1习题

﹥>﹥吖頭↗ 提交于 2020-12-17 08:54:35
5.1-1 该题个人认为有问题,这个过程只是一个最优次序问题,如果出现了次优比较时,该算法无法完成,所以总次序是应该是不能得到的。 5.1-2 可以利用前面分治法(Devide and Conquer)来求,将(a,b)范围二分缩小范围,因每次范围选取的概率为1/2,所以二分缩小的策略是可行的。最后只缩小为某个具体的数值。 同时,看到另一种解法,因为Random(a,b)的实质是以同概率随机取得[a,b)区间上的整数,则将每个整数表示为对应二进制,这样利用Random(0,1)来得到对应的整数,但是个人感觉需要考虑的边界条件比第一种策略要多很多,有兴趣可以仔细实现下。 5.1-3 这个题自己觉得挺逗,不是很难,而是训练你的思维是否僵化了,一开始我也是在找一个函数f,使得f(p)=f(1-p)=1/2对任意p成立,而实际上除非是常函数,不然做不到。然后就想了想别的办法,虽然每次0,1的随机概率不同,但是对于出现(0,1)和(1,0)时,0和1的随机选取概率都是1/2。即 int getRandom(){ while(true){ int x = random(0,1); int y = random(0,1); if(x != y){ return x; } } } 来源: oschina 链接: https://my.oschina.net/u/111639/blog/42263

Red-Black Tree 的Java实现

拟墨画扇 提交于 2020-05-04 05:57:28
Every node is either red or black. The root is black. Every leaf (NIL) is black. If a node is red, then both its children are black. For each node, all paths from the node to descendant leaves contain the same number of black nodes. 上面是算法导论对红黑树性质的描述,这两天趁着不那么忙又比较无聊研究了一下,顺便用Java实现并简单进行了测试。算法不再赘述,只说说自己理解。 红黑树的核心在于进行普通BST的插入删除操作后对树结构的调整以维持红黑树的特性。 在插入操作中,设定新插入的节点为红色,这是为了不改变该节点所在路径的Black Height。但是新节点可能会与它的父节点同为红色,这会与性质4冲突(原树为空导致性质2不满足的情况比较简单,略过不提)。插入后的调整操作就是要在保持其他性质的前提下消除与性质4的冲突。由于新插入的节点x与x.p都是红色,则x.p.p一定为黑色,此时根据x.p.p的另一个孩子(x的uncle)的颜色分了两种情况:第一种即为case 1;第二种有根据x是x.p的左节点还是右节点分为case 2和case 3

MIT Introduction to Algorithms 学习笔记(七)

此生再无相见时 提交于 2020-05-04 03:29:24
Lecture 6: Balanced Binary Search Trees AVL 树 定义: AVL 树是自平衡二叉查找树, 每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 平衡(Balance) : 平衡最坏的情况是每个节点高度差1. AVL 插入: 1. insert as in simple BST 2. work your way up tree, restoring AVL property (and updating heights as you go). 步骤: suppose x is lowest node violating AVL . assume x is right-heavy (left case symmetric) if x's right child is right-heavy or balanced: follow steps in Fig. 5 else: follow steps in Fig. 6 then continue up to x's grandparent, greatgrandparent . . . Example : AVL 排序: 代码 ''' Created on 20151223 @author: Administrator ''' class BST(object): ''' classdocs

算法导论————EXKMP

柔情痞子 提交于 2020-03-14 18:38:09
【例题传送门: caioj1461 】 【EXKMP】最长共同前缀长度 【题意】 给出模板串A和子串B,长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](1<=i<=lenA),求出A[i..lenA]与B的最长公共前缀长度 【输入文件】 输入A,B两个串,(lenB<=lenA<=1000000) 【输出文件】 输出lenA个数,表示A[i...lenA]与B的最长公共前缀长度,每个数之前有空格 【样例输入】 aabbabaaab aabb 【样例输出】 4 1 0 0 1 0 2 3 1 0 算法分析:   学EXKMP前,必须将KMP学透,如果仍未学KMP,请出门左转【 传送门 】   我们在 KMP 算法中可以理解, p 数组是 KMP 的核心, p[i] 代表着以 i 为结尾和以开头为首的最长公共子串长度,也就是说对于 st 字符串数组的 p[i] 代表的就是 st 字符串数组从 1 开始到 p[i] 和从 i-p[i]+1 到 i 是完全相同的( st[1...p[i]]=st[i-p[i]+1...i] )   那么扩展 KMP 就高级了。一样还是 p 数组(还是原来的配方,还是熟悉的味道!),但是既然是扩展 KMP 就不要用 p ,我就改成 extend 数组了,表示的意义与普通 KMP 就大有不同。 extend[i] 表示的是以 i

算法导论学习笔记第26章 & acm专题训练7——最大流

白昼怎懂夜的黑 提交于 2020-03-10 00:09:44
26最大流 1.研究的问题 可以把最大流问题用货运公司的运货来模拟。有一个源点持续不断地产生新货物,并通过有限条道路运往一个汇点,每条道路有限定的容量,且进入一个节点的速度和出一个节点的速度相同。求源点到汇点的最大速率。 2.运用算法条件 容量值为非负数,对于两个节点,u,v,(u,v)与(v,u)至多存在一个,如果不连通,令c(u,v)=0,不允许自循环,图必须连通. c(u,v)指的是容量,f(u,v)指的是流量 3.使实际情况满足条件的修改 (1)解决双向边问题 对于双向边(u,v),添加一个新的节点v’,将c(v,u)=0,连通(v,v’),(v’,u),让它们的容量等于之前的c(v,u)。 (2)解决多个源节点与多个汇点的问题 设立一个超级源节点s和超级汇点t,让超级源节点s到每个源节点的流量为无穷大,设立一个超级汇点,让每个汇点到超级汇点t的流量为无穷大。 4.Ford-Fulkerson方法 算法核心:沿着增广路径重复增加路径上的流量,直到 先引入三个概念 (1)残存网络 由原图G诱导出来的新图Gf 由那些仍有空间对流量进行调整的边构成 边cf(u,v)=c(u,v)-f(u,v) 为了表示对一个正流量(u,v)的缩减,将边(v,u)加入G,将其残存容量设置为f(u,v),一条边的反向流量最多将其正向流量抵消 (2)增广路径 一条从源节点s到汇点t的简单路径

算法导论-9.3-7

不想你离开。 提交于 2020-03-03 19:47:59
【转】 题目: 给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k<=n后,它能确定出S中最接近其中位数的k个数。 —————————— 算法思想: 1.找到数组a中第n/2小的数median; 2.对a中非median数进行|a[i] - median|,得到一个大小为n - 1的数组distance; 3.寻找distance中第k小的数值; 4.对distance进行一次遍历,找到小于等于k的数,从而对应得到数组a中的k个数。 上述每一步的时间复杂度都为O(n),因而最后总的时间复杂度为O(n). #include <iostream>#include <time.h>using namespace std;//随机化分割int randomized_partition(int* a, int p, int r);int randomized_select(int* a, int p, int r, int i);int main(){const int LEN = 12;int arr[LEN] = { 5, 7, 10, 3, 6, 2, 8, 9, 4, 1, 11 , 12};int median = randomized_select(arr, 0, LEN - 1, (LEN - 1)/2);int distance[LEN - 1]

一丁点算法学习感悟

孤人 提交于 2020-03-03 05:56:25
在忙项目的空隙看算法导论这本书,首先当然是接触一些排序算法,bubble sort,insert sort , merge sort , quick sort , heap sort,按着书上给的算法一一的实现上述算法。 然后接着看哈希表,还有树,图,发现有些困难。可能算法导论这本书对于初学者还是有些难度,但是想想这不是主要的原因。我太依赖于已有的东西了,缺少必要的思考和分析,加改进的一点点想法,一点点的积累对自己的思维锻炼都是多有裨益的,在这个应试的僵化的学院氛围中。 总结不能因噎废食,止步不前,接着多看,接着多编程,4月结束算法导论的学习,剩下的时间结合算法导论这本书然后联系oj上的题来巩固。 不要畏难,困难会一直存在,以各种形式存在,你不可能一下子消灭所有问题,大多时候应该是一种对待困难的态度,一种钻研解决困难的精神,团队作战搞定它。不要学千里走单骑,社会越来越需要一个能够带动整个团队,带强一个团队的人。谨记。当然这之前你的个人能力必须足够好,业务水平足够优秀,才能carry 全队。 来源: https://www.cnblogs.com/bestwangjie/p/4384781.html

MIT Introduction to Algorithms 学习笔记(一)

社会主义新天地 提交于 2020-03-01 22:41:20
MIT Introduction to Algorithms 学习笔记 http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/ 整个课程分成8个部分: Lecture 1: Introduction and Peak Finding Peak Finder 在数组中找到一个峰值。 在数组中 , 如果 b ≥ c 且 b ≥ a ,那么 b 是一个峰值。如果 i ≥ h , i 是一峰值。 最简单的算法就是从数组的第一个元素和它的相邻的元素比较。算法运行时间为Θ (n) 。 另外就是使用二分法: 算法运行时间为Θ (log2(n)): Two-dimensional Version 在二维数组中如果 a ≥ b, a ≥ d, a ≥ c, a ≥ e ,那么 a 是峰值。 过程如下: 假设二维数组大小为( m , n ),算法运行时间为 Θ ( n log n ) : python代码: def getMaxIndex(sList): #print(sList) iMax = 0 Max = sList[0] for i in range(0,len(sList)): if sList[i] > Max:

算法导论笔记

♀尐吖头ヾ 提交于 2020-03-01 22:03:45
插入算法 将所需排序的数一个个通过循环找到相应位置插入已排序好的数列中 *时间复杂度:*O(n^2) # include <stdlib.h> # include <stdio.h> int main ( ) { int i , j , a , key ; scanf ( "%d" , & a ) ; int A [ 100 ] ; for ( i = 0 ; i < a ; i ++ ) scanf ( "%d" , & A [ i + 1 ] ) ; for ( j = 2 ; j <= a ; j ++ ) { key = A [ j ] ; i = j - 1 ; while ( i > 0 && A [ i ] > key ) { A [ i + 1 ] = A [ i ] ; i = i - 1 ; A [ i + 1 ] = key ; } } return 0 ; } 归并排序 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表。 时间复杂度:O(nlog(n)) # include <stdio.h> # include <math.h> # include <string.h> void MERGE ( int * A , int left , int mid , int right ) { int

MIT Introduction to Algorithms 学习笔记(六)

僤鯓⒐⒋嵵緔 提交于 2020-03-01 21:19:21
Lecture 5: Scheduling and Binary Search Trees 1. 跑道预留系统( Runway Reservation System) Airport with single (very busy) runway. “ Reservations" for future landings. When plane lands, it is removed from set of pending events . Reserve req specify "requested landing time" t. Add t to the set if no other landings are scheduled within k minutes either way. Assume that k can vary. - else error, don't schedule Example: 飞机预留的降落时间 R = (41, 46 , 49 , 56),K = 3. Goal: 系统运行在 O (lg n ) 时间内. Algorithm Key Lesson : 我们需要更快的插入方法. 2. 二叉查找树(Binary Search Trees ) 二叉查找树的每个节点(node)x都有一个key 为 key(x) .除去根(Root)外,都有双亲 p