![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法导论读书笔记
爱码hyatt_hu
小猿一枚。
展开
-
创建一个计算器
import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Calculator extends JApplet { private JTextField jtf = new JTextField(10); private boolean newNumber = true; private i原创 2015-12-11 15:06:27 · 391 阅读 · 0 评论 -
迷宫问题
## POJ 3948 ##定义一个二维数组:int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 输入:一个5 × 5的二维数组,表示一个迷宫原创 2015-12-26 17:18:03 · 638 阅读 · 0 评论 -
Kosaraju算法---求解强连通分量
有向图强连通分量在有向图G中,如果两个顶点Vi,Vj间(Vi>Vj)有一条从Vi到Vj的有向路径,同时还有一条从Vi到Vj的有向路径,则称这两个顶点强。连通(strongly connected),如果有向图G中的任意两个顶点都强连通,则称G是一个强连通图。Kosaraju算法、Tarjan算法、Gabow算法皆为寻找有向图强连通分量的有效算法。但是在Tarjan 算法和 Gabow 算法的过程中,原创 2015-12-26 15:13:13 · 631 阅读 · 0 评论 -
并查集
## 序言 ##在算法导论上称之为”不相交集合” ,那么它是一种树形的数据结构,常用于处理一些不相交集合的合并以及查询问题。## 基本操作 ##1.合并两个不相交集合(Union(x,y)) 原理其实很简单,先设置一个数组Father[X],表示x的”父亲”的编号。那么,合并两个不相交集合的方法就是,找到其中一个集合父亲的父亲(也就是最久远的祖先),同时呢,将另外一个集合的最久远的祖先的父亲指原创 2015-12-24 22:07:45 · 240 阅读 · 0 评论 -
B树
## 定义 ##任何和关键字相联系的“卫星数据”将与关键字一样存放在同一个节点中。## 性质 ## ## B树的高度 ## B树上大部分的操作所需的磁盘存取次数与B树高度成正比。 ## B树上的基本操作 ##搜索B树B-TREE-SEARCH(x,k){int i=1;while(i<=x.n&&k>x.keyi)i=i+1;if(i<=x.n&&k==x原创 2015-12-04 11:04:18 · 387 阅读 · 0 评论 -
表扩张
我们假定表的存储空间是一个槽的数组。当所有槽都已被使用时,表被填满,此时装载因子为1.于是在某些软件环境下,当试图像一个满的表插入一个数据项时,唯一的选择就是报错退出。但我们假定,我们的软件环境与很多现代软件系统一样,提供一个内存管理系统系统,可以根据需要分配和释放内存块,因此当试图像一个满的表插入一个数据项,我们可以扩张表--分配一个包含更多槽的新表。由于我们总是需要表位于连续的内存空间中,因此我原创 2015-12-03 20:37:01 · 563 阅读 · 0 评论 -
Van Emde Boas Trees
## 介绍 ##van Emde Boas trees 支持所有优先级优先级队列的操作,并且巧妙的是它对于SEARCH, INSERT,DELETE,MINIMUM,MAXMUN,SUCCESSOR,和PREDECESSOR这些操作的支持都在最坏复 杂度O(lglgn)之内。不过有些限制的是,所有的Kye值都必须在 0…n−1之间,且不能有重复值。换言之,他的算法复杂度不由数据的规模 有多 大而决转载 2015-12-21 11:07:50 · 3612 阅读 · 1 评论 -
赫夫曼编码
如我们大家所知:赫夫曼编码常用于数据压缩,通常可以压缩%20至%90的空间。 ## 我们可以构造一个赫夫曼编码 ###include"iostream" #include "queue" #include "map" #include "string" #include "iterator" #include "vector" #include "algorithm"原创 2015-12-02 21:15:45 · 300 阅读 · 0 评论 -
最长公共子序列
## 问题描述 ##给定两个序列X={x1,x2,x3,…xm};y={y1,y2,y3,…yn}求X和Y公共最长子序列。本节将展示如何用动态规划方法高效地求解LCS问题.## 步骤一 ##刻画最长公共子序列的特征,如果用暴力方法求解LCS问题,就要穷举X的所有子序列,对每个子序列检查它是否也是Y的子序列,记录找到的最长子序列,所以呢,X有2的m次方个子序列,因此暴力方法的运行时间为指数阶,对较原创 2015-12-01 19:08:31 · 479 阅读 · 0 评论 -
聚合分析:二进制计数器
作为聚合分析的一个例子,我们来看一个k位二进制计数器递增问题,计数器是的初值为0.我们用一个位数组A[0,,,K-1]作为计数器,其中K=A.length,当计数器保存的二进制值为x时,x的最低位保存在A[0]中,而最高位保存在A[k-1]中,废话了这么多,## 代码 ###include <iostream>using namespace std;void count(int a[], in原创 2015-12-02 19:59:47 · 690 阅读 · 0 评论 -
斐波那契堆
## 斐波那契堆的介绍 ##斐波那契堆是堆的一种,它和二项堆一样,也是一种可合并堆,可用于实现合并优先队列。而斐波那契堆比二项堆具有更好的平摊分析性能,它的合并操作的时间复杂度是O(1). 与二项堆一样,它也是由一组堆最小有序树组成,并且是一种可合并堆。 与二项堆不同的是,斐波那契堆中的树不一定是二项树;而且二项堆中的树是有序排列的,但斐波那契堆中的树都是有根而无序的。## 斐波那契堆的基本操转载 2015-12-19 14:25:58 · 382 阅读 · 0 评论 -
数据结构的扩张—算法导论第14章(194)
OS-SELECT(x,i)int r=x.left.size+1;if(i==r){return x;}esleif(i<r)return OS-SELECT(x.left,i);elsereturn OS-SELECT(X.right,i-r);## 伪代码解释 ##为明白OS-SELECT是如何操作的,在上图所示的顺序统计图上查找第17小元素的查找过程。以X为根开始,其关原创 2015-11-30 13:38:29 · 356 阅读 · 0 评论 -
动态规划
动态规划与分支方法相似,都是通过组合子问题的解求解原问题 其步骤分为: (1):刻画一个最优解的结构特征。 (2):递归地定义最优解的值。 (3):计算最优解的值,通常采取自底向上的方法。 (4):利用计算出的信息构造一个最优解。 ## 钢条切割问题 ## CUT-ROD(int *p,n)if(n==0)return 0;int q=-INF;//作为标记for(in原创 2015-11-30 20:09:22 · 285 阅读 · 0 评论 -
区间树--(第14章200)
INTERVAL-INSERT(T,x)//将包含区间属性int 的元素x插入到区间树T中 INTERVAL-DELETE(T,x)//从区间树T中删除元素x INTERVAL-SEARCH(T,i)//返回一个指向区间树T中元素x的指针,使x.int重叠,若此元素不存在,则返回T.tail。 INTERVAL-SEARCH(T,i)x=T.root;while(x!=T.nail&&i原创 2015-11-30 15:32:50 · 304 阅读 · 0 评论 -
Dijkstra算法--寻找最短路径
#include<iostream>using namespace std;const int maxnum = 100;const int maxint = 999999;//各数组都从下标1开始int dist[maxnum]; int prec[maxnum];int c[maxnum][maxnum];int n, line;void Dijkstra(int n,in原创 2015-12-28 15:50:36 · 603 阅读 · 0 评论 -
BellMan-Ford算法--寻找最短路径
## 序言 ##Bellman-Ford算法解决的是一般情况下的单元最短路径问题,在这里,边的权重可以为赋负值,在给定带权重的有向图G=(V,E)和权重函数w:E->,Bellman-Ford 算法返回一个布尔值,以表明是否存在从源节点可以到达的权重为负值的环路。那么如果存在这样一个环路,算法将告诉我们不存在解决方案,如果没有这种环路存在,算法将给出最短路径和它们的权重。 Bellman-For原创 2015-12-26 21:15:31 · 830 阅读 · 0 评论