《计算机算法设计与分析》课程设计Word文档格式.docx

上传人:b****1 文档编号:13286829 上传时间:2022-10-09 格式:DOCX 页数:18 大小:370.46KB
下载 相关 举报
《计算机算法设计与分析》课程设计Word文档格式.docx_第1页
第1页 / 共18页
《计算机算法设计与分析》课程设计Word文档格式.docx_第2页
第2页 / 共18页
《计算机算法设计与分析》课程设计Word文档格式.docx_第3页
第3页 / 共18页
《计算机算法设计与分析》课程设计Word文档格式.docx_第4页
第4页 / 共18页
《计算机算法设计与分析》课程设计Word文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

《计算机算法设计与分析》课程设计Word文档格式.docx

《《计算机算法设计与分析》课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《《计算机算法设计与分析》课程设计Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

《计算机算法设计与分析》课程设计Word文档格式.docx

(3)以自底向上的方式计算出最优值;

(4)根据计算最优值时得到的信息,构造一个最优解。

●回溯法—图的着色

回溯法的基本思想是确定了解空间的组织结构后,回溯法就是从开始节点(根结点)出发,以深度优先的方式搜索整个解空间。

这个开始节点就成为一个活结点,同时也成为当前的扩展结点。

在当前的扩展结点处,搜索向纵深方向移至一个新结点。

这个新结点就成为一个新的或节点,并成为当前扩展结点。

如果在当前的扩展结点处不能再向纵深方向移动,则当前的扩展结点就成为死结点。

换句话说,这个节点,这个结点不再是一个活结点。

此时,应往回(回溯)移动至最近一个活结点处,并使这个活结点成为当前的扩展结点。

回溯法即以这种工作方式递归的在解空间中搜索,直到找到所要求的解或解空间中以无活结点为止。

四、详细设计与实现:

●分治法—快速排序

快速排序是基于分治策略的另一个排序算法。

其基本思想是,对于输入的子数组

按以下三个步骤进行排序:

(1)、分解(divide)以元素

为基准元素将

划分为三段

和,

使得

中任何一个元素都小于

,而

中任何一个元素大于等于

,下标

在划分过程中确定。

(2)、递归求解(conquer)通过递归调用快速排序算法分别对

进行排序。

(3)、合并(merge)由于

的排序都是在原位置进行的,所以不必进行任何合并操作就已经排好序了。

算法实现题:

现将数列{2321344565768646303989202384738545940}进行快速排序。

源程序如下:

#include<

iostream>

usingnamespacestd;

#definesize20

intpartition(intdata[],intp,intr)

{

intn=data[p],i=p+1,j=r,temp;

//将<

n的元素交换到左边区域

//将>

n的元素交换到右边区域

while(true)

{

while(data[i]<

n)++i;

while(data[j]>

n)--j;

if(i>

=j)

break;

temp=data[i];

data[i]=data[j];

data[j]=temp;

}

data[p]=data[j];

data[j]=n;

returnj;

}

voidquick_sort(intdata[],intp,intr)

{if(p>

=r)

return;

intq=partition(data,p,r);

quick_sort(data,p,q-1);

//对左半段排序

quick_sort(data,q+1,r);

//对右半段排序

}

intmain()

inti,n,data[size];

printf("

请输入要排列的数目(<

=20):

"

);

scanf("

%d"

&

n);

请输入要排列的数列:

\n"

for(i=0;

i<

n;

++i)

scanf("

data[i]);

quick_sort(data,0,n-1);

排列后的数列为:

printf("

%d"

data[i]);

printf("

return0;

运行结果如下:

图1

●动态规划—最优二叉搜索树

1、最优二叉搜索树问题描述和分析:

是有序集,且

,表示有序集S的二叉搜索树利用二叉树的结点存储有序集中的元素。

它具有下述性质:

存储于每个结点中的元素x大于其左子树中任一结点所存储的元素,小于其右子树中任一结点所存储的元素。

二叉树的叶结点是形如

的开区间,在表示S的二叉搜索树中搜索元素x,返回的结果有两种情况:

(1)在二叉搜索树的内结点中找到

(2)在二叉搜索树的叶结点中确定

设在第

(1)中情形中找到元素

的概率为

在第

(2)种情形中确定

其中约定

显然有:

称为集合S的存取概率分布。

在表示S的二叉搜索树T中,设存储元素

的结点深度为

叶结点

,则:

表示在二叉搜索树T中进行一次搜索所需要的平均比较次数,p又成为二叉搜索树T的平均路长。

在一般情况下,不同的二叉搜索树的平均路长是不相同的。

最优二叉搜索树问题是对于有序集S及其存取概率分布

,在所有表示有序集S的二叉搜索树中找到一棵具有最小平均路长的二叉搜索树。

2、最优子结构性质:

二叉搜索树T的一棵含有结点

和叶结点

的子树可以看作是有序集

关于全集合

的一棵二叉搜索树,其存取概率为以下的条件概率:

式中,

是有序集

关于存取概率

的一棵最优二叉搜索树,其平均路长为

的根结点存储元素

其左右子树

的平均路长分别为

由于

中结点深度是它们在

中的结点深度减1,故有:

是关于集合

的一棵二叉搜索树,故

,则用

替换

可得到平均路长比

更小的二叉搜索树。

这与

是最优二叉搜索树矛盾。

是一棵最优二叉搜索树。

同理可证

也是一棵最优二叉搜索树。

因此最优二叉搜索树问题具有最优子结构性质。

3、递归计算最优值:

最优二叉搜索树

的平均路长为

,则所求的最优值为

由最优二叉搜索树问题的最优子结构性质可建立计算

的递归式如下:

初始时,

,则

为所求的最优值。

计算

的递归式为:

据此,可设计出解最优二叉搜索树问题的动态规划算法。

算法实现题:

给出标识符集{1,2,3}={do,if,stop}存取概率,若b1=0.4b2=0.2b3=0.05a0=0.2a1=0.05a2=0.05a3=0.05构造一棵最优二叉搜索树

#include<

voidOptimalBinarySearchTree(floata[],floatb[],intn,floatm[][20],ints[][20],floatw[][20])

{//求解最优值的方法

inti,r,k;

floatt;

=n;

i++){

w[i+1][i]=a[i];

//搜索不到的点,最优解为0

m[i+1][i]=0;

}

for(r=0;

r<

r++)

for(i=1;

=n-r;

intj=i+r;

//左子树为空

w[i][j]=w[i][j-1]+a[j]+b[j];

m[i][j]=m[i+1][j];

s[i][j]=i;

for(k=i+1;

k<

=j;

k++){

t=m[i][k-1]+m[k+1][j];

if(t<

m[i][j])

{//以k为根节点,左子树不为空

m[i][j]=t;

s[i][j]=k;

m[i][j]+=w[i][j];

}

i++)

for(intj=1;

j<

j++)

cout<

<

s["

]["

]="

s[i][j]<

endl;

voidprint(inti,intj,ints[][20],intS[])//递归输出结果

{

if(j>

=i){

intk=s[i][j];

("

;

print(i,k-1,s,S);

)"

"

S[k]<

print(k+1,j,s,S);

intmain()

{//主函数

intn,i;

floata[20],b[20],m[20][20],w[20][20];

ints[20][20],S[20];

请输入有序集元素的个数n:

cin>

>

请输入有序集各元素的值S[i](一共"

n<

个):

S[i];

请输入概率数组a的各元素的值a[i](一共"

n+1<

a[i];

请输入概率数组b的各元素的值b[i](一共"

b[i];

OptimalBinarySearchTree(a,b,n,m,s,w);

最优值即平均步长为:

m[1][n]<

图2

1、图的m着色问题描述:

给定无向连通图G和m种不同的颜色。

用这些颜色为图G的各顶点着色,每个顶点着一种颜色。

是否有一种着色法使G中每条边的2个顶点着不同颜色。

这个问题是图的m可着色判定问题。

若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。

求一个图的色数m的问题称为图的m可着色优化问题。

2、算法设计:

一般连通图的可着色法问题并不仅限于平面图。

给定图

和m种颜色,如果这个图不是m可着色,则给出否定答案;

如果这个图是m可着色的,找出所有不同的着色方法

下面根据回朔法的递归描述框架

设计图的m着色算法。

用图的邻接矩阵a表示无向量连通图

属于图

的边集E,则

,否则

整数1,2,…,m用来表示m种不同颜色。

顶点

所有颜色用

表示,数组

是问

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1