
算法导论
文章平均质量分 51
T_W_S
这个作者很懒,什么都没留下…
展开
-
InsertionSort
//insertion-sort//input a[10]//output a[10](ASC sequence)//////////////////////////////////////////////////////////////////////////#include "stdafx.h"#includeusing namespace std;void InsertSo原创 2012-12-03 22:22:04 · 458 阅读 · 0 评论 -
二叉树的一些性质及其在编程中的应用
关于完全二叉树的最后一个非叶子节点的下标问题,(在将某个子树建立为堆时,指针下移的结束位置的确定与其有关)// 1.一颗有n个节点的完全二叉树,其非叶子节点和叶子节点各有多少个?// 非叶子节点和叶子节点要么相同,要么非叶子节点比叶子节点多一个;非叶子节点共有(int)n/2个。最后一个非叶子节点就是第n/2个节点。 // 2.完全二叉树中第n个节点的下标是原创 2013-12-30 20:21:13 · 1948 阅读 · 0 评论 -
递归的思考
理论上的概念1.函数的主要成分是一个循环,则此种解法叫做迭代,而当函数是通过不断调用自己解决问题的,那么此种解法就叫做递归。2.递归既浪费时间,又浪费空间,所以递归的效率很低,在要求高性能、低内存的算法上递归不适用。要转换为迭代方法。3.在迭代函数中必须有程序员自己完成的工作(参数入栈,出栈,转移,返回等)在递归函数中交由系统啦实现。通过隐藏某些实现细节,用时间和空间代价减少了程序设计的工原创 2013-08-07 20:40:03 · 1115 阅读 · 0 评论 -
广义表
1.广义表的定义:表的元素不是单纯的原子元素,可以又是一个表。2.广义表的存储:广义表可以方便的使用带头结点的链表表示。除头结点外,链表中的每一个节点对应广义表的一个元素(原子或子表)。例如节点数据可以为(type,data,link),type确定了data的类型,data可能是原子数据,也可能是一个指向子表的指针。link指向表的下一个元素。原创 2013-08-09 17:11:04 · 856 阅读 · 0 评论 -
使用Huffman方法对字符进行编码
1.字符编码有两种方式:定长编码和变长编码。定长编码如ASCII码,每一个字符都是由固定长度的二进制数据表示的。变长编码时,字符是可以由不同长度的二进制数据表示的。在变长编码时,为了保证解码时能有唯一的解码结果,编码必须为前缀码。(前缀码:任何一个字符的编码都不是其他字符编码的前缀)2.huffman编码思路:将要编码的字符做为二叉树的叶节点,根据其权重构造二叉树,二叉树根到叶节点的路径代表词原创 2013-08-19 21:39:06 · 2206 阅读 · 0 评论 -
next函数
//递推求解#include int* getNext( char* pattern) { int len=strlen(pattern); int* next=new int[len];//动态创建内存 next[0]=-1; for(int i=1; i<len; i++) { int j=next[i-1];原创 2013-03-14 21:19:35 · 801 阅读 · 0 评论 -
stack的数组实现
//stack的数组实现(方法类似于类的定义)//1:实现栈的数据定义//2:实现操作方法的定义push pop empty full top(并不需要,因为stack[top]就是top)//ps:栈的使用过程是先创建栈对象,然后再对此对象进行相关操作。栈定义中的top这里指定为栈顶的数组下标,top指向的是存在的数据。//ps:在采用数组实现栈时,数组0下标对应原创 2013-05-23 22:43:04 · 2838 阅读 · 0 评论 -
迷宫问题递归求解
#include #define M 10//数组大小#define N 10int endi=7;//结束点int endj=3;int v[M][N]={0};//状态位,对应a[i][j]是否被访问过bool search(int i,int j, int a[M][N]){ if(v[i][j]==1)return false;//判断a[i][j]是否被访问,访问原创 2013-05-23 19:47:08 · 2484 阅读 · 0 评论 -
计算大数n!
当要计算n!时,n不能太大,不然计算机存储不了,一般double为64位,用其存储十进制整数时,其能表示的只能是20位长度,现在要计算一个n!,使得s在50位之内都能够计算出来。#include#define MAX 50int a[MAX];void main(){ int n; cout<<"-1 is end"<<endl; cout>n: "; cin>>n;原创 2013-05-21 21:47:32 · 737 阅读 · 0 评论 -
A star
#include #include #include #include using namespace std;#define OPEN 0#define BREAK 1#define START_END 5#define PATH_NODE 8struct point{ int x; int y;};struct node{ point pt; int f;/原创 2013-03-23 11:31:01 · 708 阅读 · 0 评论 -
BM algorithm
//BM algorithm/*1: bmbc[p[i]]:p中最右边出现的p[i]字符到p最后一个字符的步长(plen-1-i),但不是坏字符时需要主串移动的步长2: suffix[i]:p[i]往前推(包括p[i]),与p[len-1]往前推(包括p[len-1]),的最大匹配长度(匹配字符个数)3: bmgs[i]:p中能够最大匹配p[i+1]到p[len-1]字符的步长,其是好原创 2013-03-18 20:34:41 · 783 阅读 · 0 评论 -
一些人对算法的一些感悟
为什么快排或者堆排序比直接的选择排序快?直接的选择排序,每次都是重复的比较数值的大小,每扫描一次,只得出一个最大(小值),再没有其它的结果信息能给下一次扫描带来便捷。我们看看快排,每扫一次,将数据按某一值分成了两边,至少有右边的数据都大于左边的数据,所以在比较的时候,下一次就不用比较了。再看看堆排序,建堆的过程也是O(n)的比较,但比较的结果得到了最大(小)堆这种三角关系,之后的比较就不用再每一个转载 2013-03-15 13:09:35 · 683 阅读 · 0 评论 -
MergeSort
//merge-sort//input a[30]//output a[30](ASC sequence)//////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include #include #includeusing namespace std原创 2012-12-05 18:30:32 · 468 阅读 · 0 评论 -
一些编程的小技巧
1. 求一个数组的中间的数。mid=(start+end)/2 几何中求两点中的的方法。所以如果要求a[4]-a[11]的中点的下标应该=(4+11) / 2;求一个数组的中间的下标即(0+lastIndex) / 2。原创 2013-12-19 20:29:57 · 691 阅读 · 0 评论