06 2012 档案
摘要:第十三章 红黑树首先说一下本章有一个地方的图有误,P168页的图,正确的图如下(case3有误,中文版):在Linux内核和STL中,都大量使用了红黑树这种数据结构,原因是红黑树的搜索、插入和删除效率都很高。红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是RED(红色)或BLACK(黑色)。一棵红黑树有如下性质:(1)每个结点要么是红的,要么是黑的。(2)根结点是黑的。(3)每个叶结点,即空结点(NIL)是黑的。(4)如果一个结点是红的,那么它的俩个儿子都是黑的。(5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。树中每个结点有五个域:color,
阅读全文
摘要:算法导论本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。本书内容丰富,对本科生的数据结构课程和研究生的算法课程都是很实
阅读全文
摘要:第十二章 二叉查找树前几章比较简单,都是数据结构里的简单内容,以前也都写过,这次就不浪费时间在这些上面了。直接写二叉查找树、红黑树。在二叉查找树上执行的基本操作的时间与树的高度成正比。对一棵含n个结点的完全二叉树,这些操作的最坏情况运行时间为O(lgn)。但是如果二叉查找树是含n个结点的线性链,则这些操作的最坏情况运行时间为O(n)。二叉查找树的基本操作有:遍历,查找,求最大值,求最小值,求直接前驱,求直接后继,插入,删除等。1、遍历根据二叉查找树的性质,可以用一个递归算法按排列顺序输出树中的所有关键字。这种算法称为中序遍历算法。因为对任一子树根的关键字在输出时介于左子树和右子树的关键字之间。
阅读全文
摘要:第九章 中位数和顺序统计学9.2 以期望线性时间做选择上一讲是找出最小值,同时找出最大值最小值,以及找出次小值的问题。随意选择数组中第i小(大)的元素看起来要比找最小值的简单选择问题要复杂一些。但是令人惊奇的是,两种问题的渐近运行时间却是相同的,都是O(n)。算法导论上介绍了一种用来解决选择问题的分治算法,即RANDOMIZED-SELECT算法。本算法以快速排序算法的分割算法为基础,如同在快速排序中一样,此算法的思想也是对输入数组进行递归划分。但与快速排序不同的是,快速排序会递归处理划分的两边,而RANDOMIZED-SELECT只处理划分的某一边。这一差异在算法的分析中就体现出来了:快速排
阅读全文
摘要:第九章 中位数和顺序统计学9.1 最小值和最大值在一个有n个元素的集合中,要做多少次比较才能确定其最小元素呢?可以很容易地给出n-1次比较这个上界:依次查看集合中的每个元素,并记录比较过程中的最小元素。同样道理,最大值也可以通过n-1次比较找出来。这个算法比较简单,我就没有写程序实现了。在某些应用中,必须找出n个元素集合中的最大值和最小值。按照上面的思路,可以对目标数组进行两次扫描,便可独立得到最小值和最大值。但这是不是最优的算法呢?事实上,至多3floor(n/2)次比较就足以同时找出最大值和最小值。做法是记录比较过程中遇到的最小值和最大值。并不是将每一个输入元素与当前的最大值和最小值分别进
阅读全文
摘要:第八章 线性时间排序8.4 桶排序桶排序的思想就是把区间[0, 1)划分成n个相同大小的子区间,每一个区间称为桶(bucket)。然后,将n个输入数据分布到各个桶中去。因为输入数均匀且独立均匀分布在[0, 1)上,所以一般不会有很多数落在一个桶中的情况。为得到结果,先对各个桶中的数进行排序,然后按次序把各个桶中的元素列出来即可。在桶排序算法中,假设输入的是一个含n个元素的数组A,且每个元素满足0≤A[i]<1。另外,还需要一个辅助数组B[0..n-1]来存放链表(桶),并假设可以用某种机制来维护这些表。BUCKET-SORT(A)1 n ← length[A]2 for i ← 1 to
阅读全文
摘要:第八章 线性时间排序8.3 基数排序算法导论上对基数排序的算法描述只有两行。。。 微言大义的说。。。RADIX-SORT(A, d)1 for i ← 1 to d2 do use a stable sort to sort array A on digit iC++代码 1 #include <iostream> 2 3 using namespace std; 4 5 //求数组中数字的最大位数 6 int maxDigit(int* arr,int digit) 7 { 8 int n = 0; 9 int* temp = new int[digit];10 ...
阅读全文
摘要:第八章 线性时间排序8.2 计数排序这个算法比较简单。计数排序的基本思想就是对每一个输入元素x,确定出小于x的元素个数。然后就可以把x直接放到它的最终输出数组的位置上。例如如果有17个元素小于x,则x旅游属于第18个输出位置。假定输入的日企 数组A[1..n],length[A]=n。另外还需要两个数组:存放排序结果的B[1..n],以及提供临时存储区的C[0..k]。COUNTING-SORT(A, B, k)1 for i ← 0 to k2 do C[i] ← 03 for j ← 1 to length[A]4 do C[A[j]] ← C[A[j]] + 15 for...
阅读全文
摘要:第七章 快速排序主要分为两个子算法,PARTITION(A, p, r)以A[r]为基准对数组进行一个划分,比A[r]小的放在左边,比A[r]大的放在右边。QUICKSORT(A, p, r)是快速排序的子程序,调用划分程序对数组进行划分,然后递归地调用QUICKSORT(A, p, r),以完成快速排序的过程。快速排序的最差时间复杂度为O(n2),平时时间复杂度为O(nlgn)。最差时间复杂度的情况为数组基本有序的时候,平均时间复杂度为数组的数值分布较为平均的时候。在平时情况下快速排序跟堆排序的时间复杂度都为O(nlgn),但是快速排序的常数项较小,所以要优于堆排序。PARTITION(A,
阅读全文
摘要:第六章 堆排序主要分为三个子算法。算法MAX-HEAPIFY(A, i)为调整堆,算法BUILD-MAX-HEAP(A)为建堆,算法HEAPSORT(A)为堆排序。运行环境Code::Blocks 10.05。MAX-HEAPIFY(A, i) 1 l ← LEFT(i) 2 r ← RIGHT(i) 3 if l ≤ heap-size[A] and A[l] > A[i] 4 then largest ← l 5 else largest ← i 6 if r ≤ heap-size[A] and A[r] > A[largest] 7 then largest ← r 8..
阅读全文
摘要:第二章 算法入门两个有序数组的合并这个算法我的实现跟算法导论上的实现有些许区别。我没有使用《算法导论》上的哨兵位的方法。而且直接判断有没有到数组的末尾。不过为了跟书上保持一致,我的伪代码还是使用算法导论上的伪代码。算法描述:MERGE(A, p, q, r)是把存储在A[p...q]和A[q+1...r]这两部分中的有序子序列合并到A[p...r]并使其有序。两个子数组的长度分别为int n1=q-p+1;int n2=r-q; 建立两个新数组L和R,用于分别存放原数组的两个有序部分。分别遍历两个新的数组L和R,依次比较其中元素,将其中较小的元素存放到原数组A的对应位置。L和R中任何一个数组遍
阅读全文
摘要:过几个月要面试了,最近在看《算法导论》,想把里面的算法都用C++实现一遍。今天是第一个算法,比较简单。第二章 算法入门插入排序伪代码实现INSERTION-SORT(A) 《算法导论》P101 for j ← 2 to length[A]2 do key ← A[j]3 //Insert A[j] into the sorted sequence A[1 ‥ j - 1].4 i ← j - 15 while i > 0 and A[i] > key6 do A[i + 1] ← A[i]7 ...
阅读全文

浙公网安备 33010602011771号