随笔分类 -  数据结构与算法

摘要:一、排序相关概念 根据在排序过程中待排序的记录是否全部被放置在内存中,排序分为:内排序和外排序。 内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中。外排序是由于排序的记录个数太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据才能进行。 根据排序过程中借助的主要操作,把内排序分为:插入排序、交换排序、选择排序和归并排序。1.1 排序用到的结构和函数 为了讲清楚排序代码,先提供一个用于排序用的顺序表结构,此结构用于之后讲的所有排序算法。1234567#define MAXSIZE 100 //用于排序数组个数最大值typedefstruct{intdata[M... 阅读全文
posted @ 2013-10-01 20:59 小竹zz 阅读(203) 评论(0) 推荐(0)
摘要:上一篇文章我们通过迪杰斯特拉算法解决了从某个源点到其余各顶点的最短路径问题。从循环嵌套很容易得到此算法的时间复杂度为O(n^2)。可是怎么只找到从源点到某一个特定终点的最短路径,其实这个问题和求源点到其他所有顶点的最短路径一样复杂,时间复杂度依然是O(n^2)。 此时比较简单方法就是对每个顶点当作源点运行一次迪杰斯特拉算法,等于在原有算法的基础上,再来一次循环,此时整个算法的时间复杂度为O(n^3)。 对此,我们再来学习另一个求最短路径的算法——弗洛伊德(Floyd),它求所有顶点到所有顶点的最短路径,时间复杂度也为O(n^3),但其算法非常简洁优雅。 为了能讲明白该算法的精妙所在,先来... 阅读全文
posted @ 2013-10-01 20:57 小竹zz 阅读(277) 评论(0) 推荐(0)
摘要:Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,比如数据结构、图论、运筹学等。 1、算法思想 令G = (V,E)为一个带权有向图,把图中的顶点集合V分成两组,第一组为已求出最短路径的顶点集合S(初始时S中只有源节点,以后每求得一条最短路径,就将它对应的顶点加入到集合S中,直到全部顶点都加入到S中);第二组是. 阅读全文
posted @ 2013-10-01 20:53 小竹zz 阅读(392) 评论(0) 推荐(0)
摘要:平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。它是一种高度平衡的二叉排序树。高度平衡?意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。平衡二叉树的前提是它是一棵二叉排序树。距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,称为最小不平衡子树。如下图所示,当插入结点37时,距离它最近的平衡因子的绝对值超 阅读全文
posted @ 2013-10-01 20:37 小竹zz 阅读(20292) 评论(0) 推荐(0)
摘要:一个连通图的生成树是一个极小的连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。那么我们把构造连通网的最小代价生成树称为最小生成树。 找连通网的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法。下面分别介绍两种算法。一、普里姆(Prim)算法 普里姆算法,图论中的一种算法,可在加权连通图里搜索最小生成树。意即此算法搜索到的边子集所构成的树中,不但包括连通图里的所有顶点,且其所有边的权值之和亦为最小。1.1 算法描述从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。 (1)输入:一个加权连通图,其中顶点集合为V,边集合为E; ... 阅读全文
posted @ 2013-10-01 19:28 小竹zz 阅读(494) 评论(0) 推荐(0)
摘要:一、图的存储结构1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图。 从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij= aji。即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都是相等的。 从这个矩阵中,很容易知道图中的信息。 (1)要判断任意两顶点是否有边无边就很容易了; (2)要知道某个顶点的度,其实就是这个顶点vi在邻接矩阵中第i行或(第... 阅读全文
posted @ 2013-10-01 16:09 小竹zz 阅读(464) 评论(0) 推荐(0)
摘要:// 二叉树.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #define maxSize 10 using namespace std; typedef struct BinaryTreeNode { char data; BinaryTreeNode * leftChild; BinaryTreeNode * rightChild; }Node; //构造二叉树 使用先序和中序构造一颗二叉树 void MakeBinaryTree(Node** root, char* preOrder, char* ... 阅读全文
posted @ 2013-09-30 12:46 小竹zz 阅读(186) 评论(0) 推荐(0)
摘要:我们设置一个结构数组 HuffNode 保存哈夫曼树中各结点的信息。根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有 2n-1 个结点,所以数组 HuffNode 的大小设置为 2n-1 。HuffNode 结构中有 weight, lchild, rchild 和 parent 域。其中,weight 域保存结点的权值, lchild 和 rchild 分别保存该结点的左、右孩子的结点在数组 HuffNode 中的序号,从而建立起结点之间的关系。为了判定一个结点是否已加入到要建立的哈夫曼树中,可通过 parent 域的值来确定。初始时 parent 的值为 -1。当结点加入到树中去时,该 阅读全文
posted @ 2013-09-29 16:59 小竹zz 阅读(1630) 评论(0) 推荐(0)
摘要:#include using namespace std; typedef struct BinaryTreeNode { char data; BinaryTreeNode * leftChild; BinaryTreeNode * rightChild; }Node; void MakeBinaryTree(Node** root, char* preOrder, char* midOrder, int length) { if (length == 0) { (*root) = NULL; return; ... 阅读全文
posted @ 2013-09-29 00:10 小竹zz 阅读(160) 评论(0) 推荐(0)
摘要:int match(char a[],int n) { char sq[maxSize]; int top=-1; for(int i=0;i<n;i++) { if(a[i]=='(') sq[++top]=a[i]; if(a[i]=='[') sq[++top]=a[i]; if(a[i]==')') { if(top==-1) return 0; if(sq[top]=='(') --top; } if(a[i]==']') { if(top==-1) return 0; if(sq[top... 阅读全文
posted @ 2013-09-28 23:54 小竹zz 阅读(140) 评论(0) 推荐(0)
摘要:转载自董的博客1. 前言本文介绍了常用的排列组合算法,包括全排列算法,全组合算法,m个数选n个组合算法等。2. 排列算法常见的排列算法有:(A)字典序法(B)递增进位制数法(C)递减进位制数法(D)邻位对换法(E)递归法介绍常用的两种:(1) 字典序法对给定的字符集中的字符规定了一个先后关系,在此基础上按照顺序依次产生每个排列。[例]字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,312,321。生成给定全排列的下一个排列 所谓一个的下一个就是这一个与下一个之间没有字典顺序中相邻的字符串。这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制 阅读全文
posted @ 2013-09-28 10:30 小竹zz 阅读(577) 评论(0) 推荐(0)
摘要:这两道题答案我觉得太复杂笔译理解我做的方法很容易理解而且简单//寻找倒数第k个 int count=0; void LocateE(LNode *&L,int k) { if(L->next!=NULL) { LocateE(L->next,k); count++; if(count==k) { printf(" 倒数第%d个位置是%d",k,L->next->data); } } } //数据结构高分笔记 第二章 综合应用第二题 void move(int a[],int n,int p) { int temp; for(int i=0;i 阅读全文
posted @ 2013-09-28 10:21 小竹zz 阅读(364) 评论(0) 推荐(0)
摘要:// 队列.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "malloc.h" #define maxSize 10 //循环队列 typedef struct { int data[maxSize]; int front; int rear; }SqQueue; void initQueue(SqQueue &qu)//初始队 { qu.front=qu.rear=0; } int isEmpty(SqQueue qu)//判断队是否为空 { if(qu.front==qu.rear) 阅读全文
posted @ 2013-09-27 23:49 小竹zz 阅读(201) 评论(0) 推荐(0)
摘要:// 队列.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "malloc.h" #define maxSize 10 //循环队列 typedef struct { int data[maxSize]; int front; int rear; }SqQueue; void initQueue(SqQueue &qu)//初始队 { qu.front=qu.rear=0; } int isEmpty(SqQueue qu)//判断队是否为空 { if(qu.front==qu.rear) 阅读全文
posted @ 2013-09-27 23:49 小竹zz 阅读(238) 评论(0) 推荐(0)
摘要:#include "stdafx.h" #include "malloc.h" #define maxSize 100 typedef struct LNode { int data; struct LNode *next; }LNode; void push(LNode *&L,int x)//使用这个方法 使得栈的入栈和出栈都在表头了 { LNode *p; p=(LNode*)malloc(sizeof(LNode)); p->next=L->next; p->data=x; L->next=p; } void pu 阅读全文
posted @ 2013-09-27 14:37 小竹zz 阅读(205) 评论(0) 推荐(0)
摘要:// 栈.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "malloc.h" #define maxSize 100 typedef struct { int data[maxSize]; int top; }SqStack; void push(SqStack &st,int x) { if(st.top==maxSize-1) return; st.top++; st.data[st.top]=x; } void pop(SqStack &st,int &x) { i 阅读全文
posted @ 2013-09-26 23:32 小竹zz 阅读(164) 评论(0) 推荐(0)
摘要:// 栈.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "malloc.h" #define maxSize 100 typedef struct { int data[maxSize]; int top; }SqStack; void push(SqStack &st,int x) { if(st.top==maxSize-1) return; st.top++; st.data[st.top]=x; } void pop(SqStack &st,int &x) { i 阅读全文
posted @ 2013-09-26 23:32 小竹zz 阅读(151) 评论(0) 推荐(0)
摘要:数据结构中的双链表的实现// 双链表.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "malloc.h" #define maxSize 100 //双链表结构 typedef struct DLNode { int data; struct DLNode *prior; struct DLNode *next; }DLNode; //尾插法创建链表 void CreateDLNodeR(DLNode *&L,int a[],int n) { DLNode *p,*s; L=(DLNod 阅读全文
posted @ 2013-09-24 14:07 小竹zz 阅读(206) 评论(0) 推荐(0)
摘要:// 链表.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include "malloc.h" #define maxSize 10 //单链表节点定义 typedef struct LNode { char data; struct LNode *next; }LNode; //插入数据 在第locate个节点位置插入 void Listinsert(LNode *&L,int locate,int x) { LNode *p,*s; p=L; int j=0; while(p!=NULL&&a 阅读全文
posted @ 2013-09-24 01:05 小竹zz 阅读(203) 评论(0) 推荐(0)
摘要:加密类using System; using System.Collections.Generic; using System.Linq; using System.Text; using DAL; namespace 加密算法 { class Program { static void Main(string[] args) { while(true) { Console.Write("请输入加密字符串"); string s = Console.... 阅读全文
posted @ 2013-09-23 12:17 小竹zz 阅读(939) 评论(0) 推荐(0)