当前位置:文档之家› 图的算法实现

图的算法实现

图的算法实现
图的算法实现

数据结构课程设计报告

设计题目:图的算法实现

班级:

学号:

姓名:

数据结构课程设计报告内容

一.课程设计题目

图的算法实现

【基本要求】

(1)建立一文件,将图的信息存在此文件中;

(2)从此文件读入图的信息,建立邻接矩阵和邻接表;

(3)实现Prim、Kruskal、Dijkstra和拓扑排序算法。

二.算法设计思想

(1)图的存储结构:

邻接矩阵:用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。

邻接表:对图中的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(对有向图是以顶点Vi为尾的弧)。每个结点由3个域组成,其中邻接点域指示与顶点Vi邻接的点在图中的位置,链域指示下一条边或弧的结点;数据域存储和边或弧相关的信息。每个链表上附设一个表头结点。在表头结点中,除了设有链域指向链表中第一个结点之外,还设有存储顶点Vi的名或其他相关信息的数据域。

(2)prim算法

是一种求图的最小生成树的算法。

假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。算法从U={u0}(u0∈V)、TE={}开始。重复执行下列操作:在所有u∈U,v∈V-U的边(u,v)∈E中找一条权值最小的边(u0,v0)并入集合TE中,同时v0并入U,直到V=U为止。此时,TE中必有n-1条边,T=(V,TE)为G 的最小生成树。Prim算法的核心:始终保持TE中的边集构成一棵生成树。

(3)Kruskal算法

Kruskal算法是另一种求最小生成树的算法

他的基本思想是以边为主导地位,始终选择当前可用(所选的边不

能构成回路)的最小权植边。所以Kruskal算法的第一步是给所有的边按照从小到大的顺序排序。

具体实现过程如下:

<1> 设一个有n个顶点的连通网络为G(V,E),最初先构造一个只有n个顶点,没有边的非连通图T={V,空},图中每个顶点自成一格连通分量。

<2> 在E中选择一条具有最小权植的边时,若该边的两个顶点落在不同的连通分量上,则将此边加入到T中;否则,即这条边的两个顶点落到同一连通分量上,则将此边舍去(此后永不选用这条边),重新选择一条权植最小的边。

<3> 如此重复下去,直到所有顶点在同一连通分量上为止。

(4)Dijkstar算法

Dijkstra算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。

它的主要特点是以起始点为中心向外层层扩展直到扩展到终点为止。

基本思想

通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s 开始计算)。

此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。

初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。…重复该操作,直到遍历完所有顶点。

操作步骤

<1>初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为”起点s到该顶点的距离”[例如,U中顶点v的距离为(s,v)的长

度,然后s和v不相邻,则v的距离为∞]。

<2> 从U中选出”距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。

<3> 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。

<4> 重复步骤(2)和(3),直到遍历完所有顶点。

(5)拓扑排序

<1>在有向图中选一个没有直接前驱的顶点,并输出之;

<2>从图中删去该顶点, 同时删去所有它发出的有向边;

重复以上步骤,直到全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;或图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时有向图中必定存在有向环。

二.程序结构

此工程包含一个头文件,和六个源文件

四.实验结果与分析

1.用户使用说明

打开图的项目运行或打开图.exe文件运行

在prim求最小生成树时输入(A-E)一个大写的起源顶点

Dijkstar求最短路径时同上

如果需要更改图请打开graphin.txt按如下格式更改

第一行:输入顶点和边数(格式:4,3)

第二行:输入顶点(格式:abcd)

第三行:输入顶点间的边关系(格式:a,b,1一行一条边信息,回

车结束)

样例:

4,3

abcd

a,b,1

b,c,2

a,d,3

2. 测试结果

测试数据:

5,7

ABCDE

A,B,1

A,C,6

A,D,2

B,C,5

B,D,8

D,E,3

C,E,4

图的邻接表与邻接矩阵存储

Prim算法求最小生成树

Kruskal算法求最小生成树

Dijkstar算法求最短路径

拓扑排序

测试数据

4,4

ABCD

A,B,1

A,C,6

A,D,2

B,C,5

图的邻接表与邻接矩阵存储

Prim算法求最小生成树

Kruskal算法求最小生成树

Dijkstar算法求最短路径

拓扑排序

3.调试分析

在文件的读入中,会出现字符的读取出错,将回车读入,在经过网上的搜索和查阅之后,我找到并学会了freopen函数(包含在在头文件stdio.h中),比如freopen("graphin.txt","r",stdin)的作用就是把标准输入流stdin重定向到graphin.txt文件中,这样在用scanf输入时便不会从标准输入流读取数据,而是从graphin.txt文件中获取输入。这样就可以直接在graphin.txt文件中更改数据,方便读入。

五.总结(收获与体会)

在一周的实验课程后,我加深了对数据结构的理解,熟练了对图和四个算法的操作。加强了查阅相关文献书籍的能力;加深对于所学内容的理解,并能将其实践出,或许会有许多瑕疵但也十分不错。在这次的实验中,我遇到了很多困难,在请教同学和网上查阅之后将其一一解决,从中我汲取了同学的意见网上的讲解,有了自己对各种算法新的认识与见解,并能将其程序化实现。

在写代码的过程中,有着许多的bug,其中有逻辑错误和语法错误,苦恼着我,一次次的改动也磨砺着我的内心。尤其是逻辑错误,在调试的过程中,一次又一次更改逻辑错误,让人很是暴躁所以在这次的实验中,也磨砺了我浮躁的内心,只有耐心冷静才能将代码的错误找出,也只有冷静才能使大脑清晰,逻辑顺畅。

在这一周的实验,让我收获颇多,有了程序员的一些素养,磨砺了自己的心性,做事变得有规划。

六.源程序

Graph.h

#include

#include

#include

#define MaxVertices 100

#define INF 65999

#define MVNUM 100

#define OK 1

#define ERROR -1

/*邻接矩阵*/

typedef struct graph{//图的邻接矩阵的定义

char Vertices[MaxVertices];//顶点信息

int Edge[MaxVertices][MaxVertices];//边信息

int numV;//顶点数

int numE;//边数

}MGraph;

/*邻接表*/

typedef int InfoType;

typedef char VertexType;

typedef struct ArcNode{//边结点的类型定义

int adjvex;//边的另一顶点在数组的位置

struct ArcNode *next;//指向下一边的指针

int info;//边的信息

}ArcNode;

typedef struct VNode{//顶点结点

int in;

VertexType data;//顶点信息

ArcNode *firstarc;//指向关联该顶点的边链表

}VNode,AdjList[MVNUM];

typedef struct{

AdjList vertices;

int vexnum,arcnum;//图的当前顶点数和边数

}ALGraph;

typedef struct{

char begin;

char end;

int weight;

}closeEdge;

//邻接矩阵

void search(MGraph &G,char v1,char v2,int w);//寻找顶点位置,存入边信息

void CreatMGraph(MGraph &G,FILE *fp);//生成图(邻接矩阵) void printMGraph(MGraph G);//输出图

//邻接表

int locateMGraph(MGraph G,char u);//确定顶点位置

int LocateALGraph(ALGraph G,VertexType x);//寻找顶点的位置void CreatALGraph(ALGraph &G,FILE *fp);//建立邻接表

void printALGraph(ALGraph G);//输出邻接表

//prim

void prim(MGraph G);//pirm求最小生成树

//Kruskal

int Find(int *parent,int i);

int fun(closeEdge *arr,int low,int high);//快排

void sort(closeEdge *arr,int low,int high); //快排

void Kruskal(MGraph G);//Kruskal算法

//拓扑排序

int TopologicalSort(ALGraph G);//拓扑排序算法

//Dijkstar

void Dijkstar(MGraph G);// Dijkstar算法

prim.cpp

#include"Graph.h"

void prim(MGraph G)//pirm求最小生成树

{

printf("\n------------------------------------------\n" );

printf("\n\t用prim算法求最小生成树\n");

char u;

printf("请输入起源顶点:");

scanf("%c",&u);

getchar();

char adjvex[MaxVertices];//顶点

int lowcost[MaxVertices];//边的权值

int k,i,j,min;

k=locateMGraph(G,u);

for(i=1;i<=G.numV;i++)//初始化辅助数组

{

if(i!=k)

{

adjvex[i]=u;

lowcost[i]=G.Edge[k][i];//到u点的距离

}

}

adjvex[k]=u;

lowcost[k]=0;

for(i=1;i

{

min=INF;//初始化最小权值为inf不可能数值

j=1;

k=0;

while(j<=G.numV)//遍历全部顶点

{

if(lowcost[j]!=0&&lowcost[j]

{

min=lowcost[j];

k=j;//下标存入k;

}

j++;

}

printf("(%c,%c)",adjvex[k],G.Vertices[k]);//打印当前顶点中权值最小的边

lowcost[k]=0;//将当前顶点的权值设置为0,表示此顶点已经完成任务

for(j=1;j<=G.numV;j++)//图的k行依次遍历全部顶点

{

if(lowcost[j]!=0&&G.Edge[k][j]

{

lowcost[j]=G.Edge[k][j];

adjvex[j]=G.Vertices[k];

}

}

}

}

Kruskal.cpp

#include"Graph.h"

int Find(int *parent,int i)

{

while(parent[i]>0)

i=parent[i];

return i;

}

int fun(closeEdge *arr,int low,int high)

{

int key;

closeEdge lowx;

lowx=arr[low];

key=arr[low].weight;

while(low

{

while(low=key)

high--;

if(low

arr[low++]=arr[high];

while(low

low++;

if(low

arr[high--]=arr[low];

}

arr[low]=lowx;

return low;

}

void sort(closeEdge *arr,int low,int high)//快排

{

int temp;

if(low

{

temp=fun(arr,low,high);

sort(arr,low,temp-1);

sort(arr,temp+1,high);

}

}

void Kruskal(MGraph G)

{

printf("\n------------------------------------------\n" );

printf("\n\tKruskal算法求出的最小生成树:\n");

int i,j,n,m,flag=1;

closeEdge edges[MaxVertices];//定义边数组

int parent[MaxVertices];//用来判断是够形成环路

for(i=1;i<=G.numV;i++)//存入边信息

for(j=i;j<=G.numV;j++)

{

if(G.Edge[i][j]!=INF)

{

edges[flag].begin=G.Vertices[i];

edges[flag].end=G.Vertices[j];

edges[flag].weight=G.Edge[i][j];

flag++;

}

}

sort(edges,1,G.numE);

for(i=1;i<=G.numV;i++)//初始化为0

{

parent[i]=0;

}

for(i=1;i<=G.numE;i++)

{

n=Find(parent,locateMGraph(G,edges[i].begin));

m=Find(parent,locateMGraph(G,edges[i].end));

if(n!=m)//如果n=m就形成环路

{

parent[n]=m;//将此边的结尾顶点放入下标为起点的parent数组中,表示此顶点已经在生成树集合中

printf("(%c,%c) %d

",edges[i].begin,edges[i].end,edges[i].weight);

}

}

printf("\n");

}

Dijkstar.cpp

#include"Graph.h"

void Dijkstar(MGraph G)

{

printf("\n------------------------------------------\n" );

printf("\n\tDijkstar求最短路径\n");

char V0;

printf("请输入起源顶点:");

scanf("%c",&V0);

getchar();

int i,j,k,min,n;

n=locateMGraph(G,V0);

int final[MaxVertices];//final[w]表示已经求得顶点V0-Vw 的最短路径

int P[MaxVertices];//用于存储最短路径下标的数组

int D[MaxVertices]; //用于存储到各点最短路径的权值和

for(i=1;i<=G.numV;i++)//初始化数据

{

final[i]=0;//全部顶点初始化为未找到的最短路径

D[i]=G.Edge[n][i];//将于V0有连线的顶点加上权值

P[i]=0;//初始化路径数组p为0

}

D[n]=0;//V0-V0的路径为0

final[n]=1; //V0-V0不需要求路径

for(i=1;i<=G.numV;i++)//每次循环求得V0到某个点的最短路径

{

min=INF;

for(j=1;j<=G.numV;j++)

{

if(!final[j]&&D[j]

{

k=j;

min=D[j];

}

}

final[k]=1;//将目前找到的最近的顶点置为1

for(j=1;j<=G.numV;j++)

{

if(!final[j]&&(min+G.Edge[k][j])

{

D[j]=min+G.Edge[k][j];//修改当前路径长度

P[j]=k; //存放前驱顶点

}

}

}

for(i=1;i<=G.numV;i++)

{

if(i==n)

continue;

printf("%c->%c %d\n",V0,G.Vertices[i],D[i]);

}

}

TopologicalSort.cpp

#include"Graph.h"

int TopologicalSort(ALGraph G)

{

printf("\n------------------------------------------\n" );

printf("\n\t拓扑排序的结果\n");

ArcNode *e;

e=(ArcNode*)malloc(sizeof(ArcNode));

int i,k,gettop;

int top=0;//用于栈指针下标索引

int count=0;//用于统计输出顶点的个数

int *stack;//用于存储入度为0的顶点

stack=(int*)malloc((G.vexnum+1)*sizeof(int));

for(i=1;i<=G.vexnum;i++)

{

if(G.vertices[i].in==0)

{

stack[++top]=i;//将度为0的顶点下标入栈

}

}

while(0!=top)

{

gettop=stack[top--];//出栈

if(count==(G.vexnum-1))

printf("%c",G.vertices[gettop].data);

else

printf("%c->",G.vertices[gettop].data);

count++;

e=G.vertices[gettop].firstarc;

while(e)

{

k=e->adjvex;

if(!(--G.vertices[k].in))//将k号顶点的邻接点入度-1,再判断-1后入度是否为0,为0就入栈

{

stack[++top]=k;

}

e=e->next;

}

}

if(count

{

return ERROR;

}

else return OK;

}

main.cpp

#include"Graph.h"

int main()

{

ALGraph G2;

MGraph G1;

FILE *fp;

freopen("graphin.txt","r",stdin);

if((fp=fopen("graphin.txt","r"))==NULL) {

printf("无法打开此文件\n");

exit(0);

}

CreatALGraph(G2,fp);

printALGraph(G2);

fclose(fp);

freopen("graphin.txt","r",stdin);

if((fp=fopen("graphin.txt","r"))==NULL) {

printf("无法打开此文件\n");

exit(0);

}

CreatMGraph(G1,fp);

printMGraph(G1);

fclose(fp);

freopen("CON", "r", stdin);

prim(G1);

Kruskal(G1);

Dijkstar(G1);

TopologicalSort(G2);

printf("\n");

system("pause");

return 0;

}

排序演示 vb课程设计论文

成绩南京工程学院课程设计报告(论文) 题目排序演示 课程名称程序设计基础---VB 院(系、部、中心)先进制造技术工程中心 专业机械制造及其自动化 班级D机加工091 学生姓名钱丽 学号231090406 设计地点图书馆A307 指导教师黄陈蓉 设计起止时间: 2011 年 1月4 日至 2011 年 1月 6日

目录 一、设计任务 (3) 二、总体设计思路 (4) 三、画出程序总体框图 (4) 四、系统的调试 (6) 五、收获体会 (8) 六、源代码 (9) 七、主要参考资料 (23)

一、设计任务 (1)程序启动后,显示主界面。首先单击“产生10个随机数”按钮来产生10个随机数,并显示在10个文本框中;然后选择一种“演示模式”和“排序方式”,其中演示模式可以直接给出排序结果,也可以通过动画动态演示整个排序过程,排序方式可以按从小到大顺序,也可以按从大到小顺序排序。 (2)在主窗口的空白区单击鼠标右键,弹出快捷菜单。从中选择“排序算法”命令,打开对话框,从中选择一种排序方式,单击不同排序方式时,“算法描述”中简要介绍了这种算法。单击“确定”按钮返回到主窗口,主窗口中最上方框架控件的标题文字显示当前所选的排序算法。 (3)设置完毕,单击“开始排序”按钮(此按钮在生成数据之前是不可用的),启动排序过程。若选择了动画方式,红色背景的文本框表示当前正在比较的元素,黄色的代表已排序的元素,2个运动的文本框表示交换过程。在排序过程中可以调节水平滚动条的位置来控制演示过程的速度。排序结束后程序以消息框的形式报告数据交换的次数。可以使用快捷菜单中的“将数据写入文件”命令将排序后的数据保存到“data.txt”中覆盖原有内容。 (4)选择窗口主菜单中的“颜色设置”命令,主窗口扩大,底部显示“颜色设置”框架,可以对“文本背景色”、“文本前景色”、“已排序元素色”和“交换结点色”进行设置。再选择此命令,窗口恢复到原来的大小。(5)选择主菜单中的“退出”命令可退出本程序,程序显示消息对话

数据结构课程设计报告---几种排序算法的演示(附源代码)

? & 数据结构课程设计报告 —几种排序算法的演示( ; 时间:2010-1-14 … 一需求分析

运行环境 Microsoft Visual Studio 2005 程序所实现的功能 对直接插入排序、折半插入排序、冒泡排序、简单选择排序、快速排序、堆排序、归并排序算法的演示,并且输出每一趟的排序情况。 程序的输入(包含输入的数据格式和说明) % <1>排序种类三输入 <2>排序数的个数的输入 <3>所需排序的所有数的输入 程序的输出(程序输出的形式) <1>主菜单的输出 <2>每一趟排序的输出,即排序过程的输出 " 二设计说明 算法设计思想 <1>交换排序(冒泡排序、快速排序) 交换排序的基本思想是:对排序表中的数据元素按关键字进行两两比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。 <2>插入排序(直接插入排序、折半插入排序) % 插入排序的基本思想是:每一次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。开始时建立一个初始的有序序列,它只包含一个数据元素。然后,从这个初始序列出发不断插入数据元素,直到最后一个数据元素插到有序序列后,整个排序工作就完成了。 <3>选择排序(简单选择排序、堆排序) 选择排序的基本思想是:第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟(例如第i趟,i=1,…,n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素,作为有序数据元素序列的第i个数据元素。等到第n-1趟选择结束,待排序数据元素仅剩下一个时就不用再选了,按选出的先后次序所得到的数据元素序列即为有序序列,排序即告完成。 <4>归并排序(两路归并排序) 两路归并排序的基本思想是:假设初始排序表有n个数据元素,首先把它看成是长度为

算法可视化演示软件开发毕业设计

算法可视化演示软件开发毕业设计 目录 前言 (1) 第一章绪论 (2) 第一节课题背景 (2) 第二节课题的目的与意义 (2) 第三节论文结构 (3) 第二章相关知识概述 (4) 第一节 Java知识相关概述 (4) 一、Java的发展史 (4) 二、Java的主要特性 (4) 三、JDK 平台相关信息 (5) 第二节 Java图形界面技术概述 (5) 一、 Java Swing相关概述 (5) 二、容器和布局 (7) 三、事件处理 (8) 第三节相关算法的介绍 (9) 一、冒泡排序 (9) 二、插入排序 (10) 三、选择排序 (12) 四、二叉查找树 (12) 第四节本章小结 (15) 第三章需求分析 (17) 第一节系统功能需求 (17) 一、系统设计目标 (17) 二、系统功能需求 (17) 第二节系统运行环境 (18) 第三节本章小结 (18) 第四章系统设计 (19) 第一节系统总体描述 (19) 第二节模块设计 (20) 一、算法模块设计 (20) 二、界面模块设计 (22)

第三节系统流程图 (25) 第四节本章小结 (26) 第五章系统实现 (27) 第一节可视化主界面的实现 (27) 第二节排序算法界面所实现的功能 (28) 第三节二叉查找树可视化功能的实现 (31) 第四节本章小结 (33) 第六章系统测试 (34) 第一节问题解决及测试结果 (34) 一、遇到的问题 (34) 二、解决的方法 (34) 三、测试结果 (34) 第二节本章小结 (41) 结论 (42) 致谢 (43) 参考文献 (44) 附录 (45) 一、英文原文 (45) 二、英文翻译 (52)

数据结构课程设计报告---几种排序算法的演示(附源代码)

数据结构课程设计报告 —几种排序算法的演示 时间:2010-1-14 一需求分析 运行环境 Microsoft Visual Studio 2005

程序所实现的功能 对直接插入排序、折半插入排序、冒泡排序、简单选择排序、快速排序、堆排序、归并排序算法的演示,并且输出每一趟的排序情况。 程序的输入(包含输入的数据格式和说明) <1>排序种类三输入 <2>排序数的个数的输入 <3>所需排序的所有数的输入 程序的输出(程序输出的形式) <1>主菜单的输出 <2>每一趟排序的输出,即排序过程的输出 二设计说明 算法设计思想 <1>交换排序(冒泡排序、快速排序) 交换排序的基本思想是:对排序表中的数据元素按关键字进行两两比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。 <2>插入排序(直接插入排序、折半插入排序) 插入排序的基本思想是:每一次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。开始时建立一个初始的有序序列,它只包含一个数据元素。然后,从这个初始序列出发不断插入数据元素,直到最后一个数据元素插到有序序列后,整个排序工作就完成了。 <3>选择排序(简单选择排序、堆排序)

选择排序的基本思想是:第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟(例如第i趟,i=1,…,n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素,作为有序数据元素序列的第i个数据元素。等到第n-1趟选择结束,待排序数据元素仅剩下一个时就不用再选了,按选出的先后次序所得到的数据元素序列即为有序序列,排序即告完成。 <4>归并排序(两路归并排序) 两路归并排序的基本思想是:假设初始排序表有n个数据元素,首先把它看成是长度为1的首尾相接的n个有序子表(以后称它们为归并项),先做两两归并,得n/2上取整个长度为2的归并项(如果n为奇数,则最后一个归并项的长度为1);再做两两归并,……,如此重复,最后得到一个长度为n的有序序列。 程序的主要流程图

数字图像处理算法汇总

形态学运算:基本思想是具用一定结构形状的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。 腐蚀运算:将结构元素中心遍历整个图像,当图像完全包含结构元素时的中心点的轨迹即为腐蚀后的图像,图像变细。腐蚀运算可用于滤波,选择适当大小和形状的结构元素,可以滤除掉所有不能完全包含结构元素的噪声点。当然利用腐蚀滤除噪声有一个缺点,即在去除噪声的同时,对图像中前景物体形状也会有影响,但当我们只关心物体的位置或者个数时,则影响不大。 膨胀运算:将结构元素中心遍历整个图像边缘,中心点的轨迹即为腐蚀后的图像,图像整体变粗。通常用于将图像原本断裂开来的同一物体桥接起来,对图像进行二值化之后,很容易是一个连通的物体断裂为两个部分,而这会给后续的图像分析造成干扰,此时就可借助膨胀桥接断裂的缝隙。 开运算:先腐蚀后膨胀,可以使图像的轮廓变得光滑,还能使狭窄的连接断开和消除细毛刺;但与腐蚀运算不同的是,图像大的轮廓并没有发生整体的收缩,物体位置也没有发生任何变化。可以去除比结构元素更小的明亮细节,同时保持所有灰度级和较大亮区特性相对不变,可用于补偿不均匀的背景亮度。与腐蚀运算相比,开运算在过滤噪声的同时,并没有对物体的形状轮廓造成明显的影响,但是如果我们只关心物体的位置或者个数时,物体形状的改变不会给我们带来困扰,此时腐蚀滤波具有处理速度上的优势。 闭运算:先膨胀后腐蚀,可以去除比结构元素更小的暗色细节。开闭运算经常组合起来平滑图像并去除噪声。可使轮廓变的平滑,它通常能弥合狭窄的间断,填补小的孔洞。腐蚀运算刚好和开运算相反,膨胀运算刚好和闭运算相反,开闭运算也是对偶的,然而与腐蚀、膨胀不同的是,对于某图像多次应用开或闭运算的效果相同。 击中击不中运算:先由结构元素腐蚀原图像,再将结构元素取反去腐蚀原图像的取反图,最后将两幅处理后的图像取交。主要用于图像中某些特定形状的精确定位。 顶帽变换:原图像减去开运算以后的图像。当图像的背景颜色不均匀时,使用阈值二值化会造成目标轮廓的边缘缺失,此时可用开运算(结构元素小于目标轮廓)对整个图像背景进行合理估计,再用原图像减去开运算以后的图像就会是整个图像的灰度均匀,二值化后的图像不会有缺失。 Sobel算子: Prewitt算子: LOG算子: Canny算子:力图在抗噪声干扰和精确定位之间尊求折中方案,主要步骤如下所示: 1、用高斯滤波器平滑图像; 2、用一阶偏导的有限差分来计算梯度的幅值和方向; 3、对梯度幅值进行非极大值抑制; 4、用双阈值算法检测和连接边缘。 Hough变换: 边缘检测:

《数据结构》算法动态演示系统的设计与实现

《数据结构》算法动态 演示系统的设计与实现 朱继红 杜祝平 (计算机工程系) 摘 要 本文主要介绍了计算机辅助教学课件———《数据结构》算法动态 演示系统,详述了算法演示模块的实现技巧和课件应用的特点。 关键词 数据结构,算法,课件,CA I 分类号 TP39117 1 前言 90年代以来,随着多媒体和Internet 网络的出现,计算机教育已步入一个全新的阶段,计算机辅助教学CA I 作为一种先进的教学手段正逐步渗透于各类院校的各个学科。《数据结构》不仅是大学计算机专业的核心课程之一,也是非计算机专业的主要选修课程之一。该课程涉及大量的概念、数据结构和算法,理论性强又较为抽象,尤其是对算法描述的执行过程的理解是难点和重点。在课堂教学上,大量的算法不可能也无法一一详述。我们所制作的《数据结构》教学辅助系统,集数据结构、算法演示和其它信息(如输入提示等)于一屏,采用中文字幕显示,利用可视化图形来动态演示算法的执行过程,对学员深入理解教材内容、掌握基本的数据结构及相应算法的实现过程有很好的帮助作用,同时该系统可用于各种不同层次的教学,便于课上教员的讲解和课下学员的复习、自修。 2 设计思想 课件是教学内容和教学处理两大类信息的有机结合,其目的是按某种学习理论和教学策略将教学中的重点和难点,教学上不容易讲清楚的内容借助计算机演示。所以我们编制的CA I 系统在注重教学先进性、科学性的同时更强调实用性。本课件的开发满足以下原则: (1)内容覆盖面宽 系统应覆盖该课程的主要内容,并结合课程选用教材,用C 语言来描述数据结构的算法。 收稿日期:1998209221 第一作者:女,1966年生,信息工程学院硕士研究生,讲师 第17卷第4期1998年12月 信息工程学院学报Journal of Information Engineering Institute Vol 117No 14Dec.1998

各种排序算法演示--综合排序

课程设计(论文)任务书 学院计算机科学与技术专业2005-1 班 一、课程设计(论文)题目各种排序算法演示 二、课程设计(论文)工作自 2007年 6月 25 日起至 2007年 7月 8日止。 三、课程设计(论文) 地点: 多媒体实验室(5-302,303) 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟练掌握C语言的基本知识和技能; (2)掌握各种排序(直接插入,希尔,冒泡,快速排序,简单选择,堆排序)方法及适用场合,并能在解决实际问题时灵活应用; (3)从空间和时间的角度分析各种排序; (5)培养分析、解决问题的能力;提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)设计一个的菜单将在实现的功能显示出来,并有选择提示; (2)分别实现直接插入,希尔,冒泡,快速排序,简单选择,堆排序算法; (3)通过多种测试数据,对各种排序算法的时间复杂度和空间复杂度进行比较并说明在实际场合的运用。 2)创新要求: 提高算法效率,降低时间复杂度和空间复杂度 3)课程设计论文编写要求 (1)要按照课程设计模板的规格书写课程设计论文 (2)论文包括目录、正文、心得体会、参考文献等 (3)课程设计论文用B5纸统一打印,装订按学校的统一要求完成 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程:40分; (3)完成调试:20分; (4)回答问题:20分。

5)参考文献: (1)严蔚敏,吴伟民.数据结构. 北京:清华大学出版社,2006. (2)严蔚敏、吴伟民、米宁.数据结构题集。北京:清华大学出版社,2006. (3) 谭浩强. C程序设计(第二版)作者:清华大学出版社,2006. 6)课程设计进度安排 内容天数地点 构思及收集资料2图书馆 编程设计与调试5实验室 撰写论文3图书馆、实验室 学生签名: 年月日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)完成调试(20分):优()、良()、中()、一般()、差();(4)翻译能力(20分):优()、良()、中()、一般()、差();(5)回答问题(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

基本的图算法

3. 要求对于邻接矩阵和邻接链表给出从G 到T G 的算法,并计算其复杂度。 对于邻接矩阵问题十分简单,直接求矩阵的转置即可,意味着把行换成列,把列换成行,对每行操作为O(|V|),需要对|V|行操作,时间复杂度为O (|V|^2)。 对于邻接链表,很明显要遍历链表的所有结点来看:如果对于u 结点其指向的结点中有v,则在新的链表中,创建一条从v 的链表指向u 的路径,因此需要遍历所有的链表元素,因此时间复杂度为O (|V|+|E|)。 3. 给出一个多图(多图为包含重复边和自循环边的图)去除冗余边的复杂度为O(V+E)的算法。 遍历邻接链表的所有结点,对于结点u ,如果其链表中还有u ,则去除所有的u ;如果还有重复的v ,则去除除了第一个v 以外的v 结点(这里的标记方法有很多种,可以用个数组)。这样的复杂度应该在O(V+E)。 4. 求解平方图的问题 算法如下:遍历G 的邻接矩阵,对于结点u ,如果存在u 到v 的路径,则在G^2的邻接矩阵u 中加入v,然后再遍历v 结点的链表,如果存在v 到w ,则将w 也加入到G^2的邻接矩阵u 中。 时间复杂度:这样,再遍历u 的时候,如果遍历到了u →v 这条边,那就在看v 的链表,而v 的链表里最多有|V|个结点,因此总的复杂度为O (|V|+|V|·|E|)。 6. 邻接矩阵求通用汇点(入度为|V|-1但是出度为0)的算法 算法如下:从(1,1)开始扫描邻接矩阵,如果(i,j )是0,则下一个扫描(i,j+1);如果(i ,j )是1,则下一个扫描(i+1,j ),当i 或者j 任一方到达|V|时停止。 这样,在最坏的情况下,扫描一行加一列或者一列加一行的结点,一共有2*|V|-1时间复杂度,因此为O(V)。 7. 关联矩阵,说明BB^T 每个元素是什么意思。 其中bij = -1 (如果边j 从结点i 发出) 1(如果边j 进入i 结点) 0(其他) 此处需要分类讨论:要明白B^T 中i 行相当于B 中第i 列。 ①BB^T 对角线上的元素,T B B (i ,i ) = ∑=| E |1 j 2 bij ,这样如果存在一条由i 发出或者进 入i 的边,都会在T B B (i ,i )中加一(因为就算是-1平方之后也是1),因此T B B (i ,i )就是代表由多少条边从i 发出或者进入。 ②BB^T 非对角线元素,T B B (i ,j ) = ∑=| |1 k E jk ik b b ,由公式或者读者自己画矩阵图可以 得出,如果k 边从i 发出从j 进入,或者反过来,bik*bjk 就等于-1,否则就为0。原因是i,j

新旧图幅编号

我国基本比例尺地形图分幅与编号的计算方法 韩丽蓉 (青海大学水电系,青海西宁 810016) 摘要:通过实例探讨了我国基本比例尺地形图分幅与编号的计算方法,此方法可以帮助使用者快速地由某点的经纬度值计算出高斯投影带带号和某比例尺地形图的图幅编号,在测绘工作中具有一定的实用性。 关键词:分幅;编号;六度带;中央子午线经度 中图分类号:K 99 文献标识码:B 文章编号:1006-8996(2006)06-0079-04 1 高斯分带投影 1.1 基本概念 在地理坐标中,经度是以经过英国格林威治天文台的子午面作为起算点(零度),自西向东逆时针至180°为东经,自东向西顺时针从0°至180°为西经,东、西经180°经线是重合的。地图投影是把不可展的 地球椭球体面上的经纬网,按照一定的数学法则转绘到平面上[1,2]。我国的8种国家基本比例尺地形图 (1:1000000~1:5000)中,除了1:1000000万地形图采用国际通用的正轴等角割圆锥投影外,其余7种国家基本比例尺地形图统一采用高斯投影。 高斯投影中限制长度变形的最有效方法是按一定经差将地球椭球面划分成若干投影带,通常投影分为六度带和三度带。分带时既要控制长度变形使其不大于测图误差,又要使带数不致过多以减少换带计算工作。我国1:500000~1:25000的比例尺地形图多采用六度带高斯投影,1:10000~1:5000的地形图采用三度带高斯投影。我国基本比例尺地形图的分幅与编号需要用到某地所在的1:1000000 地形图(经差6° )的中央子午线经度,故需计算该六度带的带号及中央子午线经度。1.2 投影带带号和中央子午线经度的计算方法 1.2.1 六度带 从格林威治零度经线起,每隔经差6°分为一个投影带,自西向东逆时针分带,全球依次编号为1,2, 3,……60,每带中间的子午线称为中央子午线[1,2]。 东半球从经度0°逆时针回算到东、西经180°,投影带号为1~30。假如知道东半球某地区的平均大地经度L 东,则其投影带带号M 东和中央子午线经度L 6东的计算公式为: M 东=[L 东Π6](取整数商)+1(有余数时);L 6东=(6M 东-3)° (东经)西半球投影带从东、西经180°逆时针回算到0°,投影带号为31~60,假如知道西半球某地区的平均大地经度L 西,则其投影带带号M 西和中央子午线经度L 6西的计算公式为: M 西=[(360°-L 西)Π6](取整数商)+1(有余数时)=[(180°-L 西)Π6](取整数商)+1(有余数时)+30;L 6西={360°-(6M 西-3)°}(西经) 1.2.2 三度带 自东经115°子午线起,每隔经差3°自西向东分带,依次编号为1,2,3,……120[1,2] 。 东半球有60个投影带,编号为1~60,假如知道东半球某地区的平均大地经度L 东,其投影带带号N 东和中央子午线经度L 3东的计算公式为: 收稿日期:2006-07-10 作者简介:韩丽蓉(1967—),女,撒拉族,青海循化人,副教授,硕士。第24卷 第6期2006年12月 青海大学学报(自然科学版)Journal of Qinghai University (Nature Science ) Vol 124No 16Dec 12006

数据结构-基本算法演示程序(附源码)

实习报告 实验名称:基本算法演示程序日期:2017年7月7日 姓名:李琛学号:20153204 班级:信1501-2 指导教师:陈娜 1.实验题目 4、Prim 算法输入:无向图(顶点序列,边序列)功能要求:输出最小生成树的各组成边及最小生成树的权值 5、Kruskal 算法输入:无向图(顶点序列,边序列)功能要求:输出最小生成树的各组成边及最小生成树的权值 6、Floyd 算法输入:有向图(顶点序列,有向边序列)功能要求:输出各顶点对间最短路径和路径长度 7、Dijkstra 算法输入:有向图(顶点序列,有向边序列),起始顶点功能要求:输出起始顶点到其它各顶点的最短路径和路径长度 2.需求分析 4、Prim 算法 输入:无向图(顶点序列,边序列) 功能要求:输出最小生成树的各组成边及最小生成树的权值 5、Kruskal 算法 输入:无向图(顶点序列,边序列) 功能要求:输出最小生成树的各组成边及最小生成树的权值 6、Floyd 算法 输入:有向图(顶点序列,有向边序列) 功能要求:输出各顶点对间最短路径和路径长度 7、Dijkstra 算法 输入:有向图(顶点序列,有向边序列),起始顶点 功能要求:输出起始顶点到其它各顶点的最短路径和路径长度 3.概要设计 4、Prim 算法 struct AMGraphp { VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum, arcnum; //图的当前点数和边数 }; //Prim算法辅助结构体 struct close { VerTexType adjvex;

动态排序算法演示软件设计

动态排序算法演示软件设计 南阳理工学院 本科生毕业设计(论文) 学院(系): 软件学院 专业: 软件工程 学生: 胡晓波 指导教师: 张枫 完成日期 2011 年 04 月 南阳理工学院本科生毕业设计(论文) 动态排序算法演示软件设计 ——动态演示的实现 Sorting algorithms dynamic demonstration of software design ——the realization of dynamic demonstration 总计 : 20 页毕业设计(论文) 表格 : 14 个 插图 : 10 幅 南阳理工学院本科毕业设计(论文) 动态排序算法演示软件设计 ——动态演示的实现 Sorting algorithms dynamic demonstration of software design ——the realization of dynamic demonstration 学院(系): 软件学院 专业: 软件工程

学生姓名: 胡晓波 学号: 68107183 指导教师(职称): 张枫(讲师) 评阅教师: 完成日期: 2011-4-1 南阳理工学院 Nanyang Institute of Technology 动态排序算法演示软件设计 动态排序算法演示软件设计 ——动态演示的实现 软件工程胡晓波 [摘要]不管在现实世界还是在软件设计中,排序都是一种非常普遍的应用。排序算法是数据结构这门课程核心内容之一。它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。学习排序算法是为了将实际问题中所涉及到的对象在计算机中对它们进行处理。该演示系统可以通过操作把数据结构中的主要排序常见的排序算法(有冒泡排序、选择排序、直接插入排序、希尔排序、快速排序、归并排序等)表示出来。系统具有两种模式:单步演示,用于教学和认知排序过程;统计模式,可以生成大规模数据验证各种算法的时间性能。并且在单步演示模式下,可以统计数据交换的次数。 [关键词]数据结构;排序算法;动态演示 1 动态排序算法演示软件设计 Sorting algorithms dynamic demonstration of software design

图的两种存储结构及基本算法

一、图的邻接矩阵存储 1.存储表示 #define vexnum 10 typedef struct{ vextype vexs[vexnum]; int arcs[vexnum][vexnum]; }mgraph; 2.建立无向图的邻接矩阵算法 void creat(mgraph *g, int e){ for(i=0;ivexs[i]); for(i=0;iarcs[i][j]=0; for(k=0;karcs[i][j]=1; g->arcs[j][i]=1;} } 3.建立有向图的邻接矩阵算法 void creat(mgraph *g, int e){ for(i=0;ivexs[i]);

for(i=0;iarcs[i][j]=0; for(k=0;karcs[i][j]=w; } } 二、图的邻接表存储 1.邻接表存储表示 #define vexnum 10 typedef struct arcnode{ int adjvex; struct arcnode *nextarc; }Arcnode; typedef struct vnode{ vextype data; Arcnode *firstarc; }Vnode; typedef struct{ Vnode vertices[vexnum]; int vexnum,arcnum;

数据结构课程设计排序算法演示系统

】 各专业全套优秀毕业设计图纸 计算机学院 数据结构课程设计 题目:数据结构排序算法演示系统 班级: 姓名: : 学号: 同组人姓名: 起迄日期: 课程设计地点: 指导教师:

完成日期:2014年12月 目录 \ 一、课程设计的目的 (1) 二、设计内容和要求 (1) 三、数据采取的结构 (1) 四、功能模块详细设计 (1) 详细设计思想 (2) 冒泡排序 (5) 快速排序 (7) 直接插入排序 (9) ~ 希尔排序 (10) 直接选择排序 (12) 堆排序 (14)

归并排序 (17) 五、总结或心得体会 (19) 六、参考文献 (20) 七、附录 (20) ~

一. 设计目的 随着计算机技术的发展,各种排序算法不断的被提出。排序算法在计算机科 学中有非常重要的意义,且应用很广泛。在以后的发展中排序对我们的学习和生 活的影响会逐渐增大,很有必要学习排序知识。此次课程设计一方面使自己掌握 排序的知识,另一方面锻炼一下团队合作开发系统的能力。 二. 设计内容和要求 功能要求: (1)界面友好,易与操作。可采用菜单或其它人机对话方式进行选择。 (2)实现各种内部排序。包括直接插入排序,冒泡排序,直接选择排序,希尔排序,快速排序,堆排序,归并排序。 (3)待排序的元素的关键字为整数或(字符)。可用随机数据和用户输入数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换以3次计)。 (1)演示程序以人机对话的形式进行。每次测试完毕显示各种比较指标值的列表,以便比较各种排序的优劣。 三. 本设计所采用的数据结构 typedef struct { int key; }RecType;

排序算法实现与演示系统

中北大学 数据结构 课程设计说明书 设计目的 本系统是为了实现和比较各种不同排序方法的不同复杂度,而建立的,从不同的角度比较

各算法的优劣,从而使使用者能对个排序方法有更清晰的了解. 2.设计内容和要求 本次设计的内容主要有实现各种排序算法以及比较各种算法。要求主要是要执行对一种数据类型的序列进行所有排序方法的排序计算,并返回序列及各算法的排序指标。 3.本设计所采用的数据结构 本次设计主要采用的数据结构有结构体定义,直接排序,选择排序,归并排序,快速排序,冒泡排序,希尔排序,堆排序等。 4.功能模块详细设计 4.1 详细设计思想 本次设计分主题设计和模块设计两部分。 主体设计方面,本系统的主要数据类型为含有一个关键字的结构体类型,命名为datatype;设置两个全局变量数组,cn和mn,分别用于记录每种排序方法中的各排序元素的比较次数和移动次数(关键字交换以3次计)的总和。 模块设计方面,本系统大致可分为排序模块部分和运行模块部分。排序模块部分分为归并排序模块,快速排序模块,冒泡排序模块,选择排序模块,直接排序模块,希尔排序模块,堆排序模块;运行模块部分分为主函数,自行输入模块,随机模块,输出模块。 以下是各排序算法的核心设计思想:

运行模块个算法如下: 4.2 核心代码 #include #include #include #define MAXNUM 100 typedef struct { int key; } datatype; datatype R[MAXNUM];/*定义类型*/ int cn[MAXNUM],mn[MAXNUM]; void D_InsertSort(datatype R[ ], int n)/*直接排序*/ { int i,j; extern int cn[MAXNUM],mn[MAXNUM]; for(i=2; i<=n; i++) { cn[0]++; if (R[i].key

数据结构演示系统1与3介绍(doc 82页)

数据结构课程设计报告《数据结构(c语言版)》课程设计 题目数据结构演示系统1 和3 学生姓名 学号 指导教师 学院信息科学与工程学院 专业班级计算机类 完成时间七月

czlzdj@https://www.doczj.com/doc/3314226673.html, 目录 第一章项目概述 (3) 1.1 问题的要求分析与描述 (3) 1.2 问题的要求和限制 (3) 第二章概要设计 (4) 第三章详细设计 (8) 3.1系统程序的组成框图 (8) 3.2 程序的流程图 (11) 3.3 算法的源程序 (15) 第四章调试分析 (24) 4.1 调试方法 (24) 4.2 算法时间复杂度 (25) 第五章测试结果 (26) 5.1 正确的输入与输出 (26) 5.2 错误的输入与输出 (32) 第六章课程设计总结 6.1 个人的体会和感想 (41)

附录A:演示系统1源代码有详细注释 (43) 附录B:演示系统2源代码 (60) 参考文献 (82) 第一章项目概述 1.1 问题的描述与分析 本次课程设计,我完成了两个题目,数据结构演示系统1、数据结构演示系统2。 数据结构演示系统1主要有两种数据的存储结构要实现,顺序和链式,每种存储结构都要实现至少四种算法插入、删除、查询、合并。对于串还要实现模式匹配,使用KMP 的快速算法,减小时间复杂度。1、顺序表的插入、删除和合并等基本操作。2、利用插入运算建立链表;实现链表的查找、删除、计数、输出等功能以及有序链表的合并。3、串的模式匹配(包括求next和nextval的值)。 数据结构演示系统 2 涉及了数据结构常用的三种存储结构,顺序、链式、散列,算法主要是查找和排序。1、实现静态查找(包括顺序查找、折半查找和插入查找)和动态查找(包括二叉排序树和二叉平衡树)。2、根据输入的数据实现下列内部排序:①直接插入排序、折半插入排序、表插入排序和希尔排序;②快速排序;③简单选择排序和堆排序;④归并排序;⑤链式基数排序。 1.2 问题的要求和限制 1.2.1我做的界面以用户为主,还兼容了容错能力。首先就是菜单的选择均有容错能力。整形数字的范围是-32768--32767,要求用户输入显示在用户界面上的整形数字(1、2、3、4、…),当用户输入不正确的选项时,会自动提示输入错误,并返回原菜单要求用户从新输入。其次,每一个子菜单同样有相同的容错能力,对于某些子系统,用户必须先建立线性表才能进行操作,若不先建立线性表,程序同样会回到主菜单,并提示用户建立线性表。 1.2.2 由于用户能输入任意个数字进行演示,并且长度由用户规定。系统规定用户输入的长度应该在1—100以内。长度小于1就没有意义了,但也不能太大,输入长度太大,用户会没有时间去输入线性表的元素。在输入数字时,理论上是表的长度不能小于1。如果小于1,则会提示输入错误,菜单自动返回。此外,在进行某些操作,如插入删除时,用户能在任意位置插入且能在任意位置删除,不过位置必须在线性表的范围之内。若超过线性表的现有长度,那么同样会报错。

C数据结构算法演示系统

摘要 数据结构算法演示系统 数据结构在计算机科学中是一门综合性的专业基础课,它不仅设计到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更方便。因此,它是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。在计算机科学中,数据结构不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。 本文充分利用C++ BUILDER的RAD优点,设计并建立了一套数据结构算法的演示系统。讲解了线性表、堆栈和队列、树、图等数据结构的概念,该系统具有操作便捷、形象生动等特点,对于深化对数据结构算法的理解,提高计算机程序设计水平具有很好的促进作用,而且具有一定的实用价值,能有效地改善数据结构算法教学的质量和效率,对于其他类似系统也有很大的借鉴意义。 关键字:数据结构;算法;C++ BUILDER

Abstract Data structure algorithms demonstration system Data structures,is a comprehensive professional foundation courses in computer science, not only to studied computer hardware design (especially coding theory, storage devices and visit methods), and researched computer software in closer relationship, whether translation or operating system, data elements are involved in the allocation of memory. In information retrieval research, data must also consider how to organize in order to identify the data elements and visit more convenient. Therefore, it is a door core curriculum between mathematics, computer hardware and computer software. In computer science, data structure is not only the basis for general programming, but also the design and realization of heavy editing procedures, operating systems, database systems and other systems procedures and the essential foundation for large-scale applications. The full use of the RAD advantage C++ builder design and build a data structure algorithms demonstration system. On the linear tables, Duizhan and Britain, trees, maps, and other data structure concept, the system has operated convenient, vivid image characteristics of the data structure to deepen the understanding of algorithms to improve the level of computer programming in good catalyst, but with some practical value to effectively improve data structure algorithms teaching quality and efficiency For other similar systems. Key words:Data structure;Algorithms;C++ builder

vb课程设计论文-排序演示

Vb课程设计 题目排序演示 专业自动化 学生姓名 学号 指导教师

目录 一、设计任务 (3) 二、总体设计思路 (4) 三、画出程序总体框图 (4) 四、系统的调试 (6) 五、收获体会 (8) 六、源代码 (9) 七、主要参考资料 (23)

一、设计任务 (1)程序启动后,显示主界面。首先单击“产生10个随机数”按钮来产生10个随机数,并显示在10个文本框中;然后选择一种“演示模式”和“排序方式”,其中演示模式可以直接给出排序结果,也可以通过动画动态演示整个排序过程,排序方式可以按从小到大顺序,也可以按从大到小顺序排序。 (2)在主窗口的空白区单击鼠标右键,弹出快捷菜单。从中选择“排序算法”命令,打开对话框,从中选择一种排序方式,单击不同排序方式时,“算法描述”中简要介绍了这种算法。单击“确定”按钮返回到主窗口,主窗口中最上方框架控件的标题文字显示当前所选的排序算法。 (3)设置完毕,单击“开始排序”按钮(此按钮在生成数据之前是不可用的),启动排序过程。若选择了动画方式,红色背景的文本框表示当前正在比较的元素,黄色的代表已排序的元素,2个运动的文本框表示交换过程。在排序过程中可以调节水平滚动条的位置来控制演示过程的速度。排序结束后程序以消息框的形式报告数据交换的次数。可以使用快捷菜单中的“将数据写入文件”命令将排序后的数据保存到“data.txt”中覆盖原有内容。 (4)选择窗口主菜单中的“颜色设置”命令,主窗口扩大,底部显示“颜色设置”框架,可以对“文本背景色”、“文本前景色”、“已排序元素色”和“交换结点色”进行设置。再选择此命令,窗口恢复到原来的大小。

图像拼接算法及实现.doc

图像拼接算法及实现(一) 来源:中国论文下载中心 [ 09-06-03 16:36:00 ] 作者:陈挺编辑:studa090420 论文关键词:图像拼接图像配准图像融合全景图 论文摘要:图像拼接(image mosaic)技术是将一组相互间重叠部分的图像序列进行空间匹配对准,经重采样合成后形成一幅包含各图像序列信息的宽视角场景的、完整的、高清晰的新图像的技术。图像拼接在摄影测量学、计算机视觉、遥感图像处理、医学图像分析、计算机图形学等领域有着广泛的应用价值。一般来说,图像拼接的过程由图像获取,图像配准,图像合成三步骤组成,其中图像配准是整个图像拼接的基础。本文研究了两种图像配准算法:基于特征和基于变换域的图像配准算法。在基于特征的配准算法的基础上,提出一种稳健的基于特征点的配准算法。首先改进Harris角点检测算法,有效提高所提取特征点的速度和精度。然后利用相似测度NCC(normalized cross correlation——归一化互相关),通过用双向最大相关系数匹配的方法提取出初始特征点对,用随机采样法RANSAC(Random Sample Consensus)剔除伪特征点对,实现特征点对的精确匹配。最后用正确的特征点匹配对实现图像的配准。本文提出的算法适应性较强,在重复性纹理、旋转角度比较大等较难自动匹配场合下仍可以准确实现图像配准。 Abstract:Image mosaic is a technology that carries on the spatial matching to a series of image which are overlapped with each other, and finally builds a seamless and high quality image which has high resolution and big eyeshot. Image mosaic has widely applications in the fields of photogrammetry, computer vision, remote sensing image processing, medical image analysis, computer graphic and so on. 。In general, the process of image mosaic by the image acquisition, image registration, image synthesis of three steps, one of image registration are the basis of the entire image mosaic. In this paper, two image registration algorithm: Based on the characteristics and transform domain-based image registration algorithm. In feature-based registration algorithm based on a robust feature-based registration algorithm points. First of all, to improve the Harris corner detection algorithm, effectively improve the extraction of feature points of the speed and accuracy. And the use of a similar measure of NCC (normalized cross correlation - Normalized cross-correlation), through the largest correlation coefficient with two-way matching to extract the feature points out the initial right, using random sampling method RANSAC (Random Sample Consensus) excluding pseudo-feature points right, feature points on the implementation of the exact match. Finally with the correct feature point matching for image registration implementation. In this paper, the algorithm adapted, in the repetitive texture, such as relatively large rotation more difficult to automatically match occasions can still achieve an accurate image registration. Key words: image mosaic, image registration, image fusion, panorama 第一章绪论

相关主题
文本预览
相关文档 最新文档