![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
introduction to algorithm
liucheng17
但总的来说,如果再让我活一回,我要把握好分分秒秒,留心生活,真正关注生活,品味生活,决不使岁月蹉跎。
展开
-
introduction to algorithm-chapter2
插入排序: 原地排序:这些数字是在数组A中重新排序的,在任何时刻,至多只有其中的常数个数是存储在数组之外的。 插入排序是一种增量排序,主要思想:从1到n遍历数组,并假设遍历之前的数据已排好序(此假设因为从开始迭代故成立),那么就要将当前元素插入到已排序好的元素中的适当位置。 代码如下: /* input: a array of integer number,and the原创 2012-11-04 14:19:34 · 418 阅读 · 0 评论 -
Introduction to Algorithm(chapter 14)
数据结构的扩张,针对某些应用通过在原有的数据结构上增加某些信息(需要维护该类信息保持原有数据结构的性质不变)就可以添加一些操作来简化问题。 动态顺序统计:在红黑树的基础上,在每个节点i上增加一个域size,表示以该节点为根的子树中节点的个数(包括该节点本身)。 求取一系列数中的第j大的数,对于根节点root,根节点的左子树有t=size(left(root))个节点,那么根节点就是第t+原创 2012-12-29 19:15:14 · 491 阅读 · 0 评论 -
Introduction to algorithm(chapter 13)
红黑树,由于在二叉查找树上进行的insert,delete,search等的时间都为o(h),故保持良好的h可以避免最坏运行时间,红黑树就是这样一种保持良好高度的二叉查找树。 首先看看红黑树必须满足的几个性质: 1):每个节点非红即黑 2):根节点是黑色的 3):每个叶节点(NIL)均是黑色的 4):一个节点为红,则它的两个儿子均是黑色的。(必有两个儿子的原因在于需要保持黑高度相同)换句原创 2012-12-17 10:12:09 · 295 阅读 · 0 评论 -
Introduction to Algorithm(chapter 12)
二叉查找树的满足这样性质的二叉树:对于一个节点,它的左子树中的任何节点都小于等于该节点的值,它的右子树中的任何节点都大于该节点的值。一般的动态集合操作如插入、删除、查找等在二叉查找树上的开销平均情况与树的高度成正比,但如果二叉查找树极其不平衡(可能形成一个线性链),那么将达到最坏开销o(n)即线性时间,而平均则是o(logn),因为二叉查找树的期望高度为logn,故要避免最坏运行时间就希望保持树的原创 2012-12-09 11:30:10 · 338 阅读 · 0 评论 -
Introduction to Algorithm(chapter 11)
直接散列就是按照数组的方式存储,一个记录的关键字就当做它的索引,这种方式对有些情况无疑是不适合的会造成极大的浪费。 散列表,主要是将一个关键字映射或者说散列到h(x)的位置(x为关键字),要力图避免碰撞,这就需要选择合适的散列函数,选择散列函数的一个主导思想是:让h(x)尽可能地随机,这样可以最小化碰撞。 但有时全域空间太大,因此无法避免地要发生碰撞情况,首先介绍解决碰撞情况的链接法。链接法就原创 2012-12-04 09:11:52 · 324 阅读 · 0 评论 -
Introduction to Algorithm(chapter 8)
基于比较的排序都有一个下界w(n*lgn),因为基于比较的排序都可以通过建立一颗决策树来表示,其中叶子节点代表最终的排序结果,这颗树共有n!个叶子,那其中从根到叶子的最长路径就代表了最坏情况下的比较次数,即树的高度h。对于一颗h高的树,叶子节点不多2^h,而这颗决策树的叶子个数为n!故,n! h>=lg(n!) = w(n*lgn),故基于比较的排序都有此下界。 而计数排序则不是基于比较的排序原创 2012-11-16 08:48:26 · 403 阅读 · 0 评论 -
Introduction to Algorithm( chapter 9 and 10)
顺序统计主要是利用快排中分割的思想,然后进行递归地对元素进行划分。然后每5个元素为一组主要是选取比较好的接近于中位数的数来当Pivot. 基本数据结构中,利用数组来实现双向链表主要有两种方法:一种是多维数组,每一维作为一个域,然后一纵列代表一个对象。或者像图像中RGB排列的那种方式来存储,将一个对象的多个域连续存储在一维数组中。 而对于有根树,当一个父节点包含多个孩子时,可以用左孩子-右兄弟的原创 2012-12-02 14:24:39 · 618 阅读 · 0 评论 -
Introduction to Algorithm(chapter 7)
快速排序,快排思想上类似于归并排序,都是采用分治法的思想,归并排序是将一列数分成两半,然后单独对两半处理,最后再合并;而快排也是将一列数据分成两列,分别对两列进行处理,最后再合并,但这里的合并是不需要做任何操作的。 对于一组数A[p.....r],快排是在p...r中找到q,使得A[p...q-1] 快速排序其实是产生一个二叉排序树,根节点为A[q],左孩子为A[p...q-1],右孩子为A原创 2012-11-15 10:16:34 · 392 阅读 · 0 评论 -
Introduction to Algorithm(chapter 6)
最大堆:除了根元素外的其他每个元素,都有A[parent(i)] >= A[i],即父母是不小于儿子的,这样堆的最大元素就存放在根节点中了。 堆其实是放在数组的一列数据,然后通过三个基本操作:1)建堆 2)维护堆的性质 3)堆排序来操作的。堆中存放的都是key,而卫星数据(一个待排序的数据通常是一条记录,每个记录有一个关键字key,记录的其它数据称为卫星数据)则存放于其它地方。原创 2012-11-12 10:43:27 · 292 阅读 · 0 评论 -
Introduction to Algorithm(chapter 5)
这一章主要介绍了概率分析和随机算法,概率分析就是假设对于不确定的输入的条件下通过概率分析来得到时间复杂度的一个平均情况。 对于某些平均情况较好的算法,而对于某些特定输入条件下时间复杂度较高的情况,可以对输入进行随机化来达到平均情况,即对部分地随机化来达到一个较好的情况。例如对于数组A[1.....n]的输入,要让数组中元素随机排列文中提高两个方法,1.给A[i]随机赋予一个优先级R[i原创 2012-11-09 09:16:58 · 336 阅读 · 0 评论 -
Introduction to Algorithm(chapter 3 and 4)
第三章主要介绍了三种记号,即上下确界、上确界和下确界,这三种记号的主要目的就是隐藏一些不必要的细节(即一些常数因子和低阶项)而让我关注于主要部分(即高阶项),通过这样的处理,可以提供给我们一种标准的方式来进行纵向的对比,这样复杂度分析也就被简化了。 第四章主要介绍了递归方法的几种求取方法:代换法、递归树和主方法。首先谈谈递归,递归就是将一个大问题不断分解成性质相似的小问题通过这种从大到原创 2012-11-08 21:31:21 · 281 阅读 · 0 评论 -
Introduction to Algorithm ( chapter 15: Dynamic Programming)
Dynamic programming is a very powerful algorithmic paradigm in which a problem is solved by identifying a collection of subproblems and tackling them one by one, smallest first, using the answers to原创 2012-12-31 17:21:05 · 769 阅读 · 0 评论