![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法分析
mvpsendoh
这个作者很懒,什么都没留下…
展开
-
《数据结构与算法分析 c++描述》 读书笔记 第一章
1.递归四法则:(1)基准情形:必须总有某些基准情形不用递归就能求解。(2)不断推进:对于那些需要递归求解的情形,递归调用必须总能朝着基准情形的方向推进。(3)设计法则:假设所有的递归调用都能运行。(4)合成效益法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。2.C++类经常将接口与其实现分离,接口列出了类及其成员(数据和函数),而实现提供了函数的具体实现,如下:类的接口通常放在以.h结尾的文件中,需要接口信息的源代码必须#include接口文件:#ifndef IntCell_H#原创 2011-01-23 14:59:00 · 2051 阅读 · 0 评论 -
关于huffman树的小疑问
<br />template<class Elem><br />class HuffTree {<br />private:<br /> HuffNode<Elem>* theRoot;<br />public:<br />HuffTree(HuffTree<Elem>* l,HuffTree<Elem>* r)<br />{ theRoot = new IntlNode<Elem>(l->root(),r->root()); }<br />HuffNode<Elem>* root() { return t原创 2011-04-30 16:07:00 · 352 阅读 · 0 评论 -
关于排序算法
看到数据结构与算法分析C++版第二版上shell的C++实现源码,想了很久才想通,现在将思路注释如下://这是shell排序算法中调用的函数,incr为间隔,A[]为起始地址//函数的目的是对间隔为incr的小组进行插入排序void inssort2(Elem A[],int n,int incr) { for(int i=incr;i for(int j=i;(j>=incr)&&(Comp::lt(A[j],A[j-incr]));j-=incr) swap(A,j,j-incr);}//shel原创 2011-05-03 20:59:00 · 404 阅读 · 0 评论 -
关于跳跃表
<br />//跳跃表的插入操作<br />template<class Key,class Elem,class KEComp,class EEComp><br />bool SkipList<Key,Elem,KEComp,EEComp>::<br />insert(const Elem& val) {<br /> int i;<br /> SkipNode<Elem> *x= head; //从头结点开始<br /> int newLevel = randomLevel(); //选择一个新级原创 2011-05-06 16:11:00 · 446 阅读 · 0 评论 -
关于图的最短路径问题
1.单源最短路径:(书上源代码加上自己的注释)//单源最短路径,Dijkstra算法//从s开始寻找最短路径,将他们记录在数组D中void Dijkstra ( Graph* G,int* D,int s) { int i,v,w; for(i=0;in();i++) { v = minVertex(G,D); //找出未被访问且权值最小的顶点 if(D[v] == INFINITY) return ; //如果还未设定从s到v的权值,退出循环 G->setMark(v,VISITED); /原创 2011-05-05 18:52:00 · 420 阅读 · 0 评论 -
关于图 最小支撑树的问题
1.Kruskal算法,注释如下class KruskElem { //用于在最小堆中存储边public: int from,to,distance; //边的两个顶点和权值 KruskElem(0 { from = -1;to = -1 ; distance = -1; } KruskElem(int f,int t,int d) { from = f;to = t;distance = d; }};Kruskel(Graph* G) { Gentree A(G->n()); //下面需要调用原创 2011-05-05 21:13:00 · 777 阅读 · 0 评论 -
整数划分 递归法
本文转自:http://hi.baidu.com/dolphin0520/blog/item/eb6afae637776322b838205e.html整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+…+mi; (其中mi为正整数,并且1 如果{m1,m2,...,mi}中的最大转载 2011-11-28 21:17:28 · 523 阅读 · 0 评论 -
大整數乘法 分治法
大整数乘法(C)请设计一个有效的算法,可以进行两个n位大整数的乘法运算。设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n2)步运算才能求出乘积XY。下面我们用分治法来设计一个更有效的大整数乘积算法。我们将n位的二进制整数X转载 2011-11-28 21:47:01 · 1934 阅读 · 0 评论 -
算法導論 第二章 實現
1.插入排序:void insert_sort(int *a,int length) { int i; for(int j=1;j<length;++j) { int key =a[j]; i = j-1; while(i>=0&&a[i]>key) { a[i+1] = a[i]; --i; } a[i+1] = key; }}2.合併原创 2011-12-07 20:43:42 · 452 阅读 · 0 评论 -
二叉树的实现(关于其中隐含的指针引用的实现细节的讨论)
<br />下面是一个二叉查找树的实现,大部分函数都已经给出了实现代码,请注意在remove函数中的注释。(代码来自《数据结构与算法分析C++第三版)<br /> <br />template<typename Comparable><br />class BinarySearchTree<br />{<br /> public:<br /> BinarySearchTree();<br /> BinarySearchTree(const BinarySearchTree& rhs);<br /> ~原创 2011-05-31 10:33:00 · 838 阅读 · 0 评论 -
由先根顺序储存序列求数的高度
给出树的先根顺序存储序列,其中“)”表示子树的结束,求树的高度。例:先根顺序存储序列RAC)D)E))BF))),对应树如下:做这道题,我第一反应是统计连续括号的数目,统计得出最大值即为树的高度。但是很快我发现这种思路虽然简单,但是却是错误的,比如:RAC)DG))E))BF))),此序列中最大的连续括号数目是3,但是树的高度却是4。既然不能使用上述方法来处理,我们还是来好好分析先根表达式的意义。一个结点后面跟着‘)’,代表的是该结点是叶节点,如果有多个‘)’,那意味着该结点还是其祖先结点的最后一个结点。从原创 2011-05-25 21:36:00 · 761 阅读 · 0 评论 -
构建表达式数的方法
<br />从后缀表达式构建表达式树的方法:<br />依次读入表达式的每一个字符:<br />如果该字符是操作数,那么就建立一个单结点数并推入栈中。<br />如果该字符是操作符,那么就从栈中弹出两棵树T1、T2,并形成一棵新的数,该树的根结点就是当前操作符。它的左右儿子分别是T1和T2。然后将指向这棵新树的指针压入栈中。原创 2011-05-25 19:00:00 · 357 阅读 · 0 评论 -
《数据结构与算法分析 C++描述》 读书笔记 第三章
1.抽象数据类型(ADT)是带有一组操作的一些对象的集合。2.表ADT:我们将处理形如A0,A1,A2,A3,...,An-1的一般表,这个表的大小是N。我们将大小为0的表称为空表。对于除空表外的任何表,我们说Ai后继于Ai-1(或继Ai-1之后)并称Ai-1(i1)。表中的第一个元素是A0,而最后一个元素是 An-1。3.表的简单数组实现: vector:插入或删除第一个元素的花费是巨大的。插入第一个元素需要将整个数组后移一个位置,而删除第一个元素则需要将表中的所有元素前移一个单位。如果操作发生在原创 2011-01-27 11:16:00 · 865 阅读 · 0 评论 -
《数据结构与算法分析 C++描述》 读书笔记 第二章
1.法则1:如果T1(N)=O(f(N))且T2(N)=O(g(N)),那么 (a)T1(N)+T2(N)=O(f(N)+g(N))(直观地非正式地表达为max(O(f(N)),O(g(N))) ) (b)T1(N)T2(N)=O(f(N)g(N)) 法则2:如果T(N)是一个k次多项式,则T(N)=Θ(N^k) 法则3:对任意常数k,log^kN=O(N)。它告诉我们对数增长得很缓慢。2.法则1:for循环 一个for循环的运行时间至多是该for循环内语句(包括测试)的运行时间乘以迭代的次数原创 2011-01-26 14:15:00 · 688 阅读 · 0 评论 -
《数据结构与算法分析 C++描述》 读书笔记 第四章
<br />1.树由称作根的结点r以及零个或多个非空的(子树)T1,T2,...Tk组成,这些子树中每一棵的根都被来自根r的一条有向的边所连接。每一棵子树的根叫做根r的儿子,而r是每一课子树的根的父亲。一棵树是N个结点和N-1条边的集合。其中的一个结点叫做根。每条边都将某个结点连接到它的父亲,而除去根结点外每个结点都有一个父亲。没有儿子的结点称为叶结点。具有相同父亲的结点为兄弟。<br />2.从结点n1到nk的路径定义为结点n1,n2,...nk的一个序列。路径的长为路径上的边的条数,即k-1。从每一个结原创 2011-01-31 14:28:00 · 124 阅读 · 0 评论 -
数据结构与算法分析 C++版第二版 笔记
<br />1. 对于堆的buildHeap()函数的理解:<br />看到第五章堆的时候,最大堆的声明:<br />template<class Elem,class Comp> class maxheap {<br />private:<br /> Elem* Heap;<br /> int size;<br /> int n;<br /> void siftdown(int);<br />public:<br /> maxheap(E原创 2011-03-24 08:09:00 · 777 阅读 · 0 评论 -
数据结构上机练习1:
<br />给出m个已经从小到大排好序的整数,另外给一个整数s,希望知道m个数中是否有两个数的和等于s。<br /> <br />输入格式:<br />首先输入整数N,表示N种测试情况。接下来是每种测试情况的输入数据。<br />每种测试情况的第一行包括两个整数m(<=1000001) 和s,第二行输入m个数据。<br /> <br />输出格式:<br />每种测试情况对应一行输出,如果存在m个数中的两个数之和等于s,输出“yes”,否则输出“no”。<br /> <br />输入示例:<br />2<b原创 2011-05-16 16:33:00 · 545 阅读 · 0 评论 -
利用栈将中缀表达式转换成后缀表达式
<br />目的:将中缀表达式(即标准形式的表达式)转换为后缀式。<br />例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+<br /> <br />转换原则:<br />1.当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中。<br />2.如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出。<br />3.在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到原创 2011-05-23 19:04:00 · 22426 阅读 · 10 评论 -
利用栈实现计算器功能(可处理括号和加减乘除优先性)
<br />承接上文,了解了理论知识后,我们来实践一下,下面是我写的简单的计算器代码,它运用了我们之前所学的知识。思路大致如下:<br />首先从string读入一连串表达式,取出每一个字符后装入一个deque容器coll1中。从该容器取出每一个元素,利用上一节的知识(文:利用栈将中缀表达式转换为后缀表达式),我们将其转换成后缀表达式,并装入容器coll3中。最后,从coll3中取出元素,逐一处理(理论知识:后缀表达式的计算,请看《数据结构与算法分析C++版第三版》第73页),计算表达式的值。<br />原创 2011-05-23 21:26:00 · 10636 阅读 · 0 评论 -
解决Josephus问题
<br />josephus问题是下面这个游戏:<br />有N个人围成一圈,编号为1~N,从编号x(x为1~N的某一个编号)的人开始传递马铃薯,M次传递后,持有热马铃薯的人退出游戏,圈缩小,然后游戏从退出的人的下一个开始。最终留下来的人获胜。<br />代码如下:<br />#include<iostream><br />#include<vector><br />using namespace std;<br />int main()<br />{<br /> vector<int> coll; /原创 2011-05-25 18:37:00 · 844 阅读 · 0 评论 -
算法導論 第七章 實現
1.快速排序void swap(int *a,int i,int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp;}int partition(int *a,int p,int r){ int x = a[r]; int i = p-1; //記錄比a[r]小的元素的坐標 for(int j=p;j<r;j++) //j記錄原创 2011-12-08 11:40:42 · 482 阅读 · 0 评论