【【算法导论】 第十二课 跳跃表】教程文章相关的互联网学习教程文章

算法导论学习---红黑树详解之插入(C语言实现)【代码】【图】

前面我们学习二叉搜索树的时候发现在一些情况下其高度不是很均匀,甚至有时候会退化成一条长链,所以我们引用一些”平衡”的二叉搜索树。红黑树就是一种”平衡”的二叉搜索树,它通过在每个结点附加颜色位和路径上的一些约束条件可以保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).下面会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码。先给出红黑树的结点定义:#define RED 1#define BLACK 0///红黑...

【听课笔记】算法导论

课程地址http://v.163.com/special/opencourse/algorithms.html今天课程地址:http://open.163.com/movie/2010/12/G/F/M6UTT5U0I_M6V2T1JGF.html讨论performanceAnalysis of Algorithms: the study of computer program performance ans resource usage.Thinking: What is more important than performance?Functionality, modularity, user-friendliness, security...Then why study algs and perf?performance is like the "money...

算法导论——斐波那契堆【代码】【图】

斐波那契堆是具有最小堆序的有根树的集合,也就是集合中的每棵树都具有父结点的关键字小于或等于子结点的关键字。 对于每一个结点x,主要有以下属性:名称说明记作关键字结点存储的值x.key父结点结点的父亲x.p左兄弟结点的左兄弟x.left右兄弟结点的右兄弟x.right孩子结点的一个儿子结点x.child度结点的儿子数量,不包括孙子及下层x.degree标记结点是否有儿子被删除x.mark堆H本身属性:名称说明记作最小结点最小的根结点H.min结点数...

《算法导论》中动态规划求解钢条切割问题【代码】

动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题。不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契数列。在斐波那契数列的求解问题中,我们经常要对一个公共子问题进行多次求解,而动态规划算法,则对每个子问题只求解一次,将其解保存在一个表格中,从而避免了大量的冗余计算量。 动态规划算法常用于寻找最优解问题(optimization pro...

算法导论 第11章 散列表

散列表是主要支持动态集合的插入、搜索和删除等操作,其查找元素的时间在最坏情况下是O(n),但是在是实际情况中,散列表查找的期望是时间是O(1),散列表是普通数组的推广,因为可以通过元素的关键字对数组进行直接定位,所以能够在O(1)时间内访问数组的任意元素。1、直接寻址表当关键字的全域较小,即所有可能的关键字的量比较小时,可以建立一个数组,为所有可能的关键字都预留一个空间,这样就可以很快的根据关键字直接找到对应元...

读书笔记 -- 算法导论 (序言+第一部分)

什么是基础呢? 就是要把我们大学所学的离散数学,算法与数据结构,操作系统,计算机体系结构,编译原理等课程学好。对计算机的体系,CPU本身,操作系统内核,系统平台,面向对象编程,程序的性能等要有深层次的掌握。要编写出优秀的代码同样要扎实的基础,如果数据结构和算法学的不好,怎么对程序的性能进行优化,怎样从类库中选择合适的数据结构。如果不了解操作系统,怎样能了解这些开发工具的原理,它们都是基于操作系统的。不...

【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)

1、算法思想 问题描述:从数组array中找出第i小的元素(要求array中没有重复元素的情况),这是个经典的“线性时间选择(Selection in expected linear time)”问题。 思路:算法导论215页9.2 Selection in expect linear time 2、java实现 思路:算法导论216页伪代码/*期望为线性时间的选择算法,输入要求,array中没有重复的元素*/public static int randomizedSelect(int[] array,int start,int end,int i) {if (start==end) {...

【算法导论之七】动态规划求解最长公共子序列

一、动态规划的概念 动态规划(Dynamic Programming)是通过组合子问题的解而解决整个问题的。分治算法是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原始问题的解,与此不同,动态规划适用于子问题不是独立的情况,也就是各个子问题包含公共的子问题。在这种情况下,采用分治法会做许多不必要的工作,即重复地求解公共地子问题。动态规划算法对每个子问题只求解一次,将其结果保存在一张...

算法导论-求x的n次方【代码】【图】

目录 1、分治求x的n次方思路 2、c++代码实现内容 1、分治求x的n次方思路T(n)=Θ(lgn) 为了计算乘方数a^n,传统的做法(所谓的Naive algorithm)就是循环相乘n次,算法效率为Θ(n)。但是如果采用分治法的思想,算法效率可以提高到Θ(lgn),如...

【算法导论学习笔记】第3章:函数的增长【图】

原创博客,转载请注明:http://www.cnblogs.com/wuwenyan/p/4982713.html   当算法的输入n非常大的时候,对于算法复杂度的分析就显得尤为重要,虽然有时我们能通过一定的方法得到较为精确的运行时间,但是很多时候,或者说绝大多数时候,我们并不值得去花精力求得多余的精度,因为精确运行时间中的倍增常量和低阶项已经被输入规模本身的影响所支配。我们需要关心的是输入规模无限增加,在极限中,运行时间是如何随着输入规模增大...

算法导论 第七章 快速排序(python)【代码】

用的最多的排序 平均性能:O(nlogn){随机化nlogn}原地址排序稳定性:不稳定思想:分治 (切分左右)学习方式:自己在纸上走一遍 def PARTITION(A,p,r):x = A[r] # 锚点 主元{大于它放一边,小于的放另一边}i = p - 1for j in range(p,r):if A[j] <= x:i += 1A[i],A[j] = A[j],A[i]A[i+1],A[r] = A[r],A[i+1]return i + 1def QUICKSORT(A,p,r):if p < r: #分治q = PARTITION(A,p,r)QUICKSORT(A,p,q-1)QUICKSORT(A,q+1,r)if__name__ ...

算法导论第十九章 斐波那契堆【代码】【图】

《算法导论》第二版中在讨论斐波那契堆之前还讨论了二项堆,但是第三版中已经把这块的内容放到思考题中,究极原因我想大概是二项堆只是个引子,目的是为了引出斐波那契堆,便于理解,而且许多经典的算法实现都是基于斐波那契堆,譬如计算最小生成树问题和寻找单源最短路径问题等,此时再把二项堆单独作为一章来讲显然没有必要。类似的堆结构还有很多,如左倾堆,斜堆,二项堆等,下次我打算开一篇博客来记录下它们的异同点。一、摊...

【算法导论】简单哈希表的除法实现

哈希表,又名散列表,hashtable。。。云云,看似很高大上,其实不过是直接寻址的延伸而已。直接寻址为何物,看一个数组:a[10],那么取其中一个元素a[1],这就是直接寻址,直接去这个a+1的地址上,就找到了这个数值,时间复杂度为O(1)。而哈希表的目的就是要让查找的时间复杂度尽量往O(1)上靠。 一、哈希表的最简单形式假如有10000个数,比如0~9999,是可能出现的数字的集合,我们现在要将一段时间内,出现的数字,全部保存...

算法导论——所有点对的最短路径:FloydWarshall算法【代码】

package org.loda.graph;import java.math.BigDecimal; import java.math.RoundingMode;import org.loda.util.In;/*** * @ClassName: FloydWarshall* @Description: 求一个图中任意两点之间的最短路径* * FloydWarshall算法是通过动态规划来计算任意两点之间的最短路径* * 如果普通求最短路径,可以对图进行V次(顶点数)BellmanFord算法。 这样的话时间复杂度为EV^2* 如果是稀疏图,则...

算法导论--动态顺序统计与区间树【代码】【图】

本文的基础是红黑树 算法导论–红黑树通过在基础的数据结构中添加一些附加信息,来扩张一种标准的数据结构,然后编写新的操作来支持所需要的应用。下面是介绍在红黑树的基础上扩张的数据结构。1.动态顺序统计动态顺序统计可以在O(lgn)时间内确定任何的顺序统计量(即在n个元素的集合中,能在O(lgn)的时间内确定第i小的元素),同时也可以在O(lgn)的时间内计算一个元素的秩(即它在中序遍历下的位置顺序)。1 添加附加信息结点x中加入...