算法实验题目

合集下载

银行家算法模拟实验

银行家算法模拟实验

实验二
课程名称:操作系统
课程类型:必修
实验项目名称:银行家算法
实验题目:采用银行家算法避免死锁
一、实验目的
通过本次实验,使学生掌握死锁的概念和产生死锁的原因和必要条件,预防和避免死锁的方法,死锁的检测与解除。

通过本次实验,使学生加深了对死锁概念的理解和掌握,深刻领会银行家算法的实质及实现过程。

二、实验要求及实验环境
设计一个能动态检查n个资源、m个进程的系统是否安全并且能实施动态分配的程序。

(具体个数可由键盘输入)。

每一个进程可动态、随机提出申请各个资源的数量,如果系统能满足并且分配后系统仍处于安全状态,那么写出一个安全序列,表明系统是安全的;若系统不安全,那么不分配资源。

三、设计思想
1
图1-1主程序的流程图
图1-2初始化算法init()的流程图
图1-3银行家算法allo()的流程图
? 不满足,等待
F
T F 请求超量,
图1-4模拟资源分配算法require ()的流程图
图1-5安全算法()的流程图
2.逻辑设计
用结构体数组表示m个进程,其中包括使用数组形式的线性表表示进程对各个资源需要的总资源数、对各个资源已占用的资源数,还需要的资源数。

3、物理设计
全局变量
int n,m;
struct info//进程信息
{
int claim[50];//最大占用资源数
int allocation[50];//已经占有的资源数
int need[50]; //还需要的资源数
}pro[50];
int available[50];//剩余资源数
int request[50];//需求资源数量。

算法分析与设计-有重复元素的排列问题

算法分析与设计-有重复元素的排列问题

算法设计实验报告题目:有重复元素的排列问题年月日一、实验题目有重复元素的排列问题二、实验目的问题描述:设R={r1,r2,...,rn}是要进行排列的n个元素。

其中元素r1,r2,...,rn可能相同。

试设计一个算法,列出R的所有不同排列。

三、实验内容算法设计:给定n及待排列的n个元素。

计算出这n个元素的所有不同排列。

数据输入:由文件input.txt提供输入数据。

文件的第1行是元素个数n,1<=n<=500。

接下来的1行是待排列的n个元素。

结果输出:将计算出的n个元素的所有不同排列输出到文件output.txt。

文件最后1行中的数是排列总数。

输入文件示例输出文件示例input.txt output.txt4 aaccaacc acacaccacaaccacaccaa6四、实验原理1)aacc四个元素的全排列,我们可以划分为3个元素的全排列,3个划分为2个,到最后只剩下1个元素,就不需要排列。

2)让每一个元素作为打头元素,交换,然后进行递归,再交换。

3)如果该打头元素在前面中已经有过,则忽略这种情况。

五、实验步骤1)实现环境:Microsoft Visual Studio 20102)编写代码,在程序文件夹下建立input.txt,output.txt,输入问题,运行,发现错误不断调试3)实验代码:#include<iostream>#include<stdio.h>#include<string>#include<cstring>#include<algorithm>using namespace std;char a[1000];char b[1000];int main() {freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);int n;scanf("%d",&n);scanf("%s",&a);sort(a,a+n);for(int i=0;i<n;i++){b[n-i-1]=a[i];}for(int i=0;i<n;i++){printf("%c",b[i]);}printf("\n");int t=1;while(strcmp(a,b)){t++;for(int i=0;i<n;i++){printf("%c",a[i]);}printf("\n");next_permutation(a,a+n);} for(int i=0;i<n;i++) {printf("%c",b[i]);}printf("\n");printf("%d",t);return 0;}六、实验结果分析运行结果截图:。

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验报告实验二时间片轮转进程调度算法学号:班级:姓名:【实验题目】: 时间片轮转进程调度算法【实验目的】通过这次实验, 加深对进程概念的理解, 进一步掌握进程状态的转变、进程调度的策略与对系统性能的评价方法。

【实验内容】问题描述:设计程序模拟进程的时间片轮转RR 调度过程。

假设有n 个进程分别在T1, … ,Tn 时刻到达系统, 它们需要的服务时间分别为S1, … ,Sn 。

分别利用不同的时间片大小q, 采用时间片轮转RR 进程调度算法进行调度, 计算每个进程的完成时间, 周转时间和带权周转时间, 并且统计n 个进程的平均周转时间和平均带权周转时间。

程序要求如下:1)进程个数n ;每个进程的到达时间T 1, … ,T n 和服务时间S 1, … ,S n ;输入时间片大小q 。

2)要求时间片轮转法RR 调度进程运行, 计算每个进程的周转时间, 带权周转时间, 并且计算所有进程的平均周转时间, 带权平均周转时间;3)输出: 要求模拟整个调度过程, 输出每个时刻的进程运行状态, 如“时刻3: 进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间, 带权周转时间, 所有进程的平均周转时间, 带权平均周转时间。

实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int ArrivalTime[100];int ServiceTime[100];int PServiceTime[100];int FinishTime[100];int WholeTime[100];double WeightWholeTime[100];double AverageWT,AverageWWT;bool Finished[100];➢2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n, T1, … ,Tn, S1, … ,Sn;时间片大小q;➢按照时间片轮转RR算法进行进程调度, 计算进程的完成时间、周转时间和带权周转时间;➢计算所有进程的平均周转时间和平均带权周转时间;➢按格式输出调度结果。

人工智能实验-k-近邻算法

人工智能实验-k-近邻算法

k-近邻算法一、 实验题目1. kNN 代码实现-AB 分类采用测量不同特征值之间的距离方法进行分类,用所给的函数创建具有两个特征与一个标签类型的数据作 为训练集,编写 classify0 函数对所给的数据进行 AB 分类。

2. k-近邻算法改进约会网站的配对效果k-近邻算法改进约会网站的配对效果通过收集的一些约会网站的数据信息,对匹配对象的归类:不喜欢的人、魅力一般的人、极具魅力的人。

数据中包含了 3 种特征:每年获得的飞行常客里程数、玩视频游戏所耗时间百分比、每周消费的冰淇淋公升数二、 实验代码1. kNN 代码实现-AB 分类kNN from http.client import ImproperConnectionStatefrom numpy import ∗ from collections importCounter import operator def createDataSet():group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])labels = [’A ’, ’A ’, ’B’, ’B’] return group, labelsdef classify0(inX, group, labels, k = 3):res1 = (inX − group)∗∗2 dist =res1[:,0] + res1[:,1] dic = argsort(dist) dic = dic[0:k:1] newdic = [] for i in range (k): newdic.append(labels[dic[i]]) c = Counter(newdic).most_common(1) return c[0][0] tests import kNN group, lables = kNN.createDataSet() print (’分类结果’) print (’[0,0] %c’ %(kNN.classify0([0, 0], group, lables, k = 3))) print (’[0.8,0.7] %c’ %(kNN.classify0([0.8, 0.7], group, lables, k = 3)))2.k-近邻算法改进约会网站的配对效果1 2 3 4 5 67 8 910111213141516171819 1 2 3 4 5import pandas as pdimport kNNfrom sklearn.model_selection import train_test_splitdf = pd.read_table(’datingTestSet2.txt’,sep=’\s+’, names = [’A ’, ’B’, ’C’, ’Y’])# 对特征进行归一化处理df2 = df.iloc[:, :3] df2 =(df2−df2.mean())/df2.std() lable=df.iloc[:,3:4] df2.loc[:, ’Y’] =lable# 对数据集进行测试集和训练集划分,90%作为训练集,10%作为测试集X_train, X_test, Y_train, Y_test = train_test_split(df2.iloc[:, :3], df2.Y, train_size=.90)# 将DataFrame 格式转化为numpy 格式处理 group = X_train.values label =Y_train.values length =len (X_test) X_test.iloc[0:1,:]# res 以储存测试结果res = []# 设置错误正确数count 以计算正确率Tnum = 0 Fnum = 0 for iin range (length):inX = X_test.iloc[i:i+1 , :].values res.append(kNN.classify0(inX,group, label, k = 3)) if (kNN.classify0(inX, group, label, k = 3) ==Y_test.values[i]):Tnum += 1 else :Fnum += 1res1 = pd.DataFrame(data = res, columns=[’TestResult’])Y_test.reset_index(inplace=True,drop=True)res1.loc[:, ’OriginTest’] = Y_testprint (’前20个数据测试结果和原数据比较’) print (’−−−−−−−−−−−−−−−−−−−−−——−−−−’) print (res1.head(20))print (’−−−−−−−−−−−−−−−−−−−−−——−−−−’) print (’正确率%.2f%%’ %(100∗Tnum/(Tnum+Fnum))) 三、 实验结果及分析1. kNN 代码实现-AB 分类分类结果[0, 0] B[0.8, 0.7] A2. k-近邻算法改进约会网站的配对效果1 2 3 45 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2526 27 28 29 3031 32 33 3435363738 1 2 3前20个数据测试结果和原数据比较−−−−−−−−−−−−−−−−−−−−−——−−−TestResult OriginTest0 2 2 1 3 3 2 1 3 3 2 2 4 2 2 5 3 3 6 3 3 7 2 2 8 1 1 9 1 1 10 1 1 11 3 3 12 2 2 13 2 2 14 1 1 15 2 2 16 1 1 17 2 2 18 1 1 19 3 3−−−−−−−−−−−−−−−−−−−−−——−−− 正确率97.00%从实验结果可以看出,通过 k-近邻算法改进后的约会网站的配对效果比较显著,多次随机划分测试集和训练集后发现正确率基本可以达到 90% 以上。

计算机图形学实验Cohen-Sutherland算法

计算机图形学实验Cohen-Sutherland算法

实验5-6一、实验题目请按照图5-32所示,使用对话框输入直线段的起点和终点坐标。

在屏幕客户区左侧区域绘制输入直线段和“窗口”,在屏幕客户区右侧区域绘制“视区”并输出裁剪结果。

这里需要用到窗视变换公式。

请使用Cohen-Sutherland 算法编程实现。

二、实验思想Cohen-Sutherland 直线裁剪算法是最早流行的编码算法。

每条直线的端点都被赋予一组四位二进制代码,称为区域编码(Region Code ,RC),用来标识直线端点相对于窗口边界及其延长线的位置。

假设窗口是标准矩形,由上(y=w yt )、下(y=w yb )、左(x=w xl )、右(x=w xr )四条边组成,如图5-23所示。

延长窗口四条边形成9个区域,如图5-24所示。

这样根据直线的任一端点P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码RC =C 4C 3C 2C 1。

w yb w yt wxr w xl为了保证窗口内直线端点的编码为零,编码规则定义如下:第一位:若端点位于窗口之左侧,即x<w xl,则C1=1,否则C1=0。

第二位:若端点位于窗口之右侧,即x>w xr,则C2=1,否则C2=0。

第三位:若端点位于窗口之下侧,即y<w yb,则C3=1,否则C3=0。

第四位:若端点位于窗口之上侧,即y>w yt,则C4=1,否则C4=0。

裁剪步骤如下:(1)若直线的两个端点的区域编码都为零,即RC1|RC2=0,说明直线两端点都在窗口内,应“简取”之。

(2)若直线的两个端点的区域编码都不为零,即RC1&RC2≠0,即直线位于窗外的同一侧,说明直线的两个端点都在窗口外,应“简弃”之。

(3)若直线既不满足“简取”也不满足“简弃”的条件,直线必然与窗口或窗口边界的延长线相交,需要计算直线与窗口边界的交点。

交点将直线分为两段,其中一段完全位于窗口外,可“简弃”之。

对另一段重复进行上述处理,直至该直线段完全被舍弃或找到完全位于窗口内的直线段为止。

《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告实验序号:07实验项目名称:实验8 贪心算法(一)一、实验题目1.删数问题问题描述:键盘输入一个高精度的正整数N(不超过250 位),去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的非负整数。

编程对给定的N 和k,寻找一种方案使得剩下的数字组成的新数最小。

若输出前有0则舍去2.区间覆盖问题问题描述:设x1,x2,...xn是实轴上的n个点。

用固定长度为k的闭区间覆盖n个点,至少需要多少个这样的固定长度的闭区间?请你设计一个有效的算法解决此问题。

3.会场安排问题问题描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。

设计一个有效的贪心算法进行安排。

(这个问题实际上是著名的图着色问题。

若将每一个活动作为图的一个顶点,不相容活动间用边相连。

使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。

)4.导弹拦截问题问题描述:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。

某天,雷达捕捉到敌国的导弹来袭。

由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

给定导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

二、实验目的(1)通过实现算法,进一步体会具体问题中的贪心选择性质,从而加强对贪心算法找最优解步骤的理解。

(2)掌握通过迭代求最优的程序实现技巧。

(3)体会将具体问题的原始数据预处理后(特别是以某种次序排序后),常能用贪心求最优解的解决问题方法。

三、实验要求(1)写出题1的最优子结构性质、贪心选择性质及相应的子问题。

(2)给出题1的贪心选择性质的证明。

(3)(选做题):写出你的算法的贪心选择性质及相应的子问题,并描述算法思想。

算法实验报告范文

算法实验报告范文

实验题目:K近邻算法(K-Nearest Neighbors, KNN)在鸢尾花数据集上的应用一、实验目的1. 理解K近邻算法的基本原理和实现过程。

2. 掌握K近邻算法在分类问题中的应用。

3. 通过实验验证K近邻算法在鸢尾花数据集上的性能。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 库:NumPy,Matplotlib,Scikit-learn三、实验原理K近邻算法(KNN)是一种基于距离的最近邻分类算法。

其基本思想是:对于待分类的数据点,找到与它距离最近的K个数据点,这K个数据点中多数属于某个类别,则待分类数据点也属于该类别。

K近邻算法的步骤如下:1. 计算待分类数据点与训练集中每个数据点的距离。

2. 找到距离最近的K个数据点。

3. 根据这K个数据点的多数类别,对待分类数据点进行分类。

四、实验数据本次实验使用鸢尾花数据集(Iris dataset),该数据集包含150个样本,每个样本有4个特征(花瓣长度、花瓣宽度、花萼长度、花萼宽度),分为3个类别(setosa,versicolor,virginica)。

五、实验步骤1. 导入所需库和数据集。

```pythonfrom sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import accuracy_scoreimport matplotlib.pyplot as pltimport numpy as np# 加载数据集iris = datasets.load_iris()X = iris.datay = iris.target```2. 数据预处理。

```python# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)```3. 实现K近邻算法。

Removed_算法实验 八皇后问题37

Removed_算法实验 八皇后问题37

姓名:+++ 学号:090610213 班级:0904103实验题目:八皇后问题问题分析:要在8*8的国际象棋棋盘中放8个皇后,是任意两个皇后都不能互相吃掉。

规则:皇后能吃掉同一行、同一列、同一对角线的任意棋子。

解决问题的关键为怎样取到8个位置,判断他们符合要求。

数学模型:每一行中只能取到一个位置,这样问题的解空间就是8个皇后所在的列的序号。

1)通过8重循环从每一行中取得一个位置,检验取到的检验8个位置不在同一列、同一对角线。

2)按深度优先的思想,从第一个皇后开始搜索,确定一个位置后,在搜索第二个皇后的位置……;每前进一步检查是否满足约束条件,不满足时,用continue语句回溯到上一个皇后,继续尝试下一位置;满足约束条件时,开始搜索下一位置,知道找到问题解。

约束条件:不在同一列的表达式xi!=xj不在同一对角线上的约束条件abs(xi-xj)!=abs(i-j)算法策略的选择:蛮力枚举法枚举回溯法程序流程图:算法的时间复杂度的分析:1)采用8重循环时间复杂度为8程序实现:1)void CEightqueDlg::OnButton1(){ //取自不同行的位置count=0;for(que[0]=0;que[0]<8;que[0]++)for(que[1]=0;que[1]<8;que[1]++)for(que[2]=0;que[2]<8;que[2]++)for(que[3]=0;que[3]<8;que[3]++)for(que[4]=0;que[4]<8;que[4]++)for(que[5]=0;que[5]<8;que[5]++)for(que[6]=0;que[6]<8;que[6]++)for(que[7]=0;que[7]<8;que[7]++)Judge();CString str;str.Format("%d",count);MessageBox(str);}void CEightqueDlg::Judge(){ for(int t1=0;t1<8;t1++) //验证是否取自不同的列for(int t2=t1+1;t2<8;t2++) {if(que[t1]==que[t2])return; //存在处于同一列的位置则返}bool flag=false; //验证是否在不同的对角线上for(int j=0;j<7;j++){for(int i=1;i<8-j;i++){ if(que[j]+i==que[i+j]||que[j]-i==que[i+j]){ flag=true; break;}} if(flag)break; }if(!flag){ CString a;a="";for(int k=0;k<8;k++){ a.Format("%d",que[k]);out+=a; } out+=" ";if(out.GetLength()%72==0)out+='\n';GetDlgItem(IDC_STATIC1)->SetWindowText(out); count++; }} 2)void CEight2Dlg::OnCancel(){int a[8]; int count=0CString aa,bb;aa=bb="";for(a[0]=0;a[0]<8;a[0]++)for(a[1]=0;a[1]<8;a[1]++){if(check(a,1)==0) continue;for(a[2]=0;a[2]<8;a[2]++){if(check(a,2)==0) continue;for(a[3]=0;a[3]<8;a[3]++){if(check(a,3)==0) continue;for(a[4]=0;a[4]<8;a[4]++){if(check(a,4)==0) continue;for(a[5]=0;a[5]<8;a[5]++){if(check(a,5)==0) continue;for(a[6]=0;a[6]<8;a[6]++){if(check(a,6)==0) continue;for(a[7]=0;a[7]<8;a[7]++){if(check(a,7)==0) continue;else{for(int i=0;i<8;i++){aa.Format("%d",a[i]);bb+=aa+" ";}m_list.AddString(bb);bb="";count++;}}}}}}}}aa.Format("%d",count);MessageBox("总共有组合数:"+aa);}int CEight2Dlg::check(int a[], int n){ int i;for(i=0;i<n;i++)if((abs(a[i]-a[n])==abs(i-n))||(a[i]==a[n]))return(0);return(1);}结果输出:实验题目:动态规划最大盈利问题分析:5台机器3个工厂,求总利润最大的方案。

A星算法求解8数码问的题目某实验

A星算法求解8数码问的题目某实验

A*算法求解8数码问题实验一、实验目的熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N数码难题,理解求解流程和搜索顺序。

二、实验内容1、八数码问题描述所谓八数码问题起源于一种游戏:在一个3×3的方阵中放入八个数码1、2、3、4、5、6、7、8,其中一个单元格是空的。

将任意摆放的数码盘(城初始状态)逐步摆成某个指定的数码盘的排列(目标状态),如图1所示图1 八数码问题的某个初始状态和目标状态对于以上问题,我们可以把数码的移动等效城空格的移动。

如图1的初始排列,数码7右移等于空格左移。

那么对于每一个排列,可能的一次数码移动最多只有3中,即空格左移、空格右移、空格上移、空格下移。

最少有两种(当空格位于方阵的3个角时)。

所以,问题就转换成如何从初始状态开始,使空格经过最小的移动次数最后排列成目标状态。

2、八数码问题的求解算法2.1 盲目搜索宽度优先搜索算法、深度优先搜索算法2.2 启发式搜索启发式搜索算法的基本思想是:定义一个评价函数f,对当前的搜索状态进行评估,找出一个最有希望的节点来扩展。

先定义下面几个函数的含义:f*(n)=g*(n)+h*(n) (1)式中g*(n)表示从初始节点s到当前节点n的最短路径的耗散值;h*(n)表示从当前节点n到目标节点g的最短路径的耗散值,f*(n)表示从初始节点s经过n到目标节点g的最短路径的耗散值。

评价函数的形式可定义如(2)式所示:f(n)=g(n)+h(n) (2)其中n是被评价的当前节点。

f(n)、g(n)和h(n)分别表示是对f*(n)、g*(n)和h*(n)3个函数值的估计值。

利用评价函数f(n)=g(n)+h(n)来排列OPEN表节点顺序的图搜索算法称为算法A。

在A算法中,如果对所有的x,h(x)<=h*(x) (3)成立,则称好h(x)为h*(x)的下界,它表示某种偏于保守的估计。

采用h*(x)的下界h(x)为启发函数的A算法,称为A*算法。

数学实验题目2 Romberg积分法

数学实验题目2 Romberg积分法

数学实验题目2 Romberg 积分法摘要考虑积分()()b aI f f x dx =⎰欲求其近似值,可以采用如下公式:(复化)梯形公式 110[()()]2n i i i hT f x f x -+==+∑ 2()12b a E h f η-''=- [,]a b η∈ (复化)辛卜生公式 11102[()4()()]6n i i i i hS f x f x f x -++==++∑4(4)()1802b a h E f η-⎛⎫=- ⎪⎝⎭ [,]a b η∈ (复化)柯特斯公式 111042[7()32()12()90n i i i i hC f x f x f x -++==+++∑31432()7()]i i f xf x +++6(6)2()()9454b a h E f η-⎛⎫=- ⎪⎝⎭[,]a b η∈ 这里,梯形公式显得算法简单,具有如下递推关系121021()22n n n i i h T T f x -+==+∑因此,很容易实现从低阶的计算结果推算出高阶的近似值,而只需要花费较少的附加函数计算。

但是,由于梯形公式收敛阶较低,收敛速度缓慢。

所以,如何提高收敛速度,自然是人们极为关心的课题。

为此,记0,k T 为将区间[,]a b 进行2k等份的复化梯形积分结果,1,k T 为将区间[,]a b 进行2k等份的复化辛卜生积分结果,2,k T 为将区间[,]a b 进行2k等份的复化柯特斯积分结果。

根据李查逊(Richardson )外推加速方法,可得到1,11,,0,1,2,40,1,2,41m m k m km k m k T T T m -+-=-⎛⎫=⎪=-⎝⎭可以证明,如果()f x 充分光滑,则有,lim ()m k k T I f →∞= (m 固定),0lim ()m m T I f →∞=这是一个收敛速度更快的一个数值求积公式,我们称为龙贝格积分法。

实验一古典密码算法实验

实验一古典密码算法实验
二、实验设备环境及要求:
运行windows或linux操作系统的PC机,具有gcc(linux)、VC(windows)等C语言编译环境。
3、实验原理
古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。
M yrtg bd oiru jtwb fsl dw uwdu ej ssuaxipv.
Zmvp qlwk zmuptz!
Qruc
10.11.2003
五、实验指导与数据处理:
1.用凯撒密码加密:
解密:
2.使用维吉尼亚密码加密:
使用维吉尼亚密码解密:
对附录1中密文进行解密(密钥为decipher):
Dear doctor:
1.替代密码
替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如:明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。下面我们介绍一种典型的替代密码。
(1)恺撒(caesar)密码,又叫循环移位密码。它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。它的加密过程可以表示为下面的函数:
(2)维吉尼亚(Vigenere)密码Vigenere密码是由法国密码学家Blaisede Vigenere于1858年提出的,它是一种以移位代换为基础的周期代换密码。
称k=(k1,k2,…,km)为长为m的密钥字。密钥量为26m,所以对一个相当小的m值,穷举密钥法进行分析破解也需要很长的时间。若m=5,则密钥空间大小超过1.1*107,手工搜索也不容易。当明文串的长度大于m时,可将明文串按m一组分段,然后再逐段使用密钥字k。

《算法设计与分析》课程实验报告 (算法问题求解基础1)

《算法设计与分析》课程实验报告 (算法问题求解基础1)
s1[i] = s1[i-1] * 10 + pow(10,i-1);
}
int s2[10] = {0,9,189,2889,38889,488889,5888889,68888889,788888889};
int a;
scanf("%d",&a);
int count;
count = 0;
while(a > 0){
题目二:最大间隙
源码:
#include<iostream>
#include<cstdio>
using namespace std;
double a[10000] = {0};
int main(){
int n;
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>a[i];
样例输出:
3.2
二、实验目的
(1)理解算法的概念
(2)理解函数渐近态的概念和表示方法
(3)初步掌握算法时间复杂度的计算方法
三、实验要求
(1)对于每个题目提交实验代码。
(2)根据程序设计测试数据,并记录测试结果,要求边界情况必须测试
(3)使用我们学过的分析方法分析你的算法的时间效率,如果可能,请进行算法的优化,尽量减小算法的时间效率或空间效率。
《算法设计与分析》课程实验报告
实验序号:1 实验项目名称:算法问题求解基础
一、实验题目
题目一:统计数字问题
题目描述
一本书的页码从自然数1开始顺序编码直到自然数n。输的页码按照通常的习惯编排,每个页码都不含有多余的前导数字0.例如,第6页用数字6表示,而不是06或者006等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2...8,9。

《算法设计与分析》递归算法典型例题

《算法设计与分析》递归算法典型例题

算法递归典型例题实验一:递归策略运用练习三、实验项目1.运用递归策略设计算法实现下述题目的求解过程。

题目列表如下:(1)运动会开了N天,一共发出金牌M枚。

第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。

到了第N天刚好还有金牌N枚,到此金牌全部发完。

编程求N和M。

(2)国王分财产。

某国王临终前给儿子们分财产。

他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i 个儿子i份,再加上剩余财产的1/10。

每个儿子都窃窃自喜。

以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。

请用程序回答,老国王共有几个儿子?财产共分成了多少份?源程序:(3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。

问这鱼缸里原有多少条金鱼?(4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?(5)猴子吃桃。

有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?(6)小华读书。

第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少页?(7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。

计算机图形学实验Bresenham算法

计算机图形学实验Bresenham算法
二、实验思想
根据理想直线的斜率k,除垂线外(k=±∞)将直线划分为k>1、0≤k≤1、-1≤k<0和k<-1四种情况。当0≤k≤1时或-1≤k<0时,x方向为主位移方向;当k>1时或k<-1时,y方向为主位移方向。对于|k|=∞的垂线,可以直接画出。
具体算法:
1.确定主位移方向。在主位移方向上每次加1,另一个方向上加不加1,取决于中点误差项。
if(y0>y1)
{
double tx=x0;
double ty=y0;
x0=x1;y0=y1;
x1=tx;
y1=ty;
}
x=x0;y=y0;
d=1-0.5*k;
for(y=y0;y<=y1;y++)
{
dc.SetPixel(ROUND(x),ROUND(y),rgb);
if(d>=0)
{
x++;
d+=1-k;
}
else
d+=1;
}
}
if(k<-1)
{
if(y0<y1)
{
double tx=x0;
double ty=y0;
x0=x1;y0=y1;
x1=tx;
y1=ty;;
for(y=y0;y>y1;y--)
{
dc.SetPixel(ROUND(x),ROUND(y),rgb);
if(d>0)
{
y--;
d-=1+k;
}
else
d-=k;
}
}
if(fabs(x0-x1)<1e-6)
{
if(y0>y1){
double tx=x0;

归纳算法(翻硬币问题)

归纳算法(翻硬币问题)

福建工程学院计算机与信息科学系实验报告○1for(i = 0; i < coins_Number; i++){printf("Step %d:\n",i+1);getchar();count=0;for(j = 0; j < coins_Number; j++){if(j != i && j!=i+1)s[j] = !s[j];printf("%3c", s[j]? '*':'0');if(s[j]) count++;}printf("\n");if(count==coins_Number-2){getchar();printf("Stept %d:\n",i+2);for(j = 0; j < coins_Number; j++)printf("%3c",'0');printf("\n");break;}}当N为奇数时,要进行判断,当正面个数等于N-2时,经过最后一次翻转结束。

刚开始没有进行判断,所以出错。

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <conio.h>int s[1000];/*硬币状态标志,1时硬币是正面,0时硬币是反面*//***************翻硬币过程1(偶数)******************/ int Upturn_process1 (int coins_Number){int i, j;for(i = 0; i < coins_Number; i++){printf("Step %d:\n",i+1);getchar();for(j = 0; j < coins_Number; j++){if(j != i)s[j] = !s[j];printf("%3c", s[j]?'*':'0');}printf("\n");}}/***************翻硬币过程2(奇数)******************/int Upturn_process2 (int coins_Number){int i, j,count;for(i = 0; i < coins_Number; i++){printf("Step %d:\n",i+1);getchar();count=0;for(j = 0; j < coins_Number; j++){if(j != i && j!=i+1)s[j] = !s[j];printf("%3c", s[j]? '*':'0');if(s[j]) count++;}printf("\n");if(count==coins_Number-2){getchar();printf("Stept %d:\n",i+2);for(j = 0; j < coins_Number; j++)printf("%3c",'0');printf("\n");break;}}}int main(){int coins_Number;int j;printf("请输入硬币的个数:\n");scanf("%d",&coins_Number);printf("初始状态:\n");for(j = 0; j < coins_Number; j++){s[j] = 1; //所有硬币初始状态设置,设置正面向上printf("%3c", '*');}printf("\n\n");if (coins_Number%2==0)Upturn_process1 (coins_Number);elseUpturn_process2 (coins_Number);}题目描述:一摞硬币共有m枚,每一枚都是正面朝上。

算法实验1穷举【参考答案】【最新完全版】

算法实验1穷举【参考答案】【最新完全版】

算法分析与设计实验一——穷举算法(黑体,三号)1.穷举简介(小标题:黑体,小四;内容:宋体,五号)穷举法又称列举法,其基本思想是逐一列举问题所涉及的所有情况。

从中寻找满足条件的结果。

适用于数量较小的问题。

2.算法流程或设计思想穷举通常应用循环结构来实现。

在循环体中,应用选择结构实施判断筛选,求得所要求的解。

使用穷举法的关键是要确定正确的穷举的范围。

3.分析算法的时间复杂度4.程序设计中的问题及解决方案5.运行说明(包括实验数据和结果说明)6.主要程序代码(添加程序注释)7.对比解决该问题的其他算法(选作)题目:1.有一堆零件(1000-5000个之间),如果以4个零件为一组进行分组,则多2个零件;如果以7个零件为一组进行分组,则多3个零件;如果以9个零件为一组进行分组,则多5个零件。

编程求解这堆零件总数。

参考答案:#include<stdio.h>void main(){int n,count=0;for(n=1000;n<=5000;n++)if(n%4==2&&n%7==3&&n%9==5){printf("%d ",n);count=count+1;if(count%5==0)printf("\n");}printf("\ncount = %d\n",count);}2.穷举三位数的水仙花数。

水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。

(例如:13 + 53 + 33 = 153)参考答案:/*2. 穷举三位数的水仙花数。

水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。

(例如:13 + 53 + 33 = 153)*/#include <stdio.h>void main(){int a,b,c,d;for(a=100;a<=999;a++){b=a/100;c=a/10-b*10;d=a-b*100-c*10;if(b*b*b+c*c*c+d*d*d==a)printf("%d = %d^3 + %d^3 + %d^3\n",a,b,c,d);}}3.穷举真分数递增序列中的第k项的值。

《算法设计与分析》课程实验报告 (分治法(三))

《算法设计与分析》课程实验报告 (分治法(三))

《算法设计与分析》课程实验报告实验序号:04实验项目名称:实验4 分治法(三)一、实验题目1.邮局选址问题问题描述:在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。

用x 坐标表示东西向,用y坐标表示南北向。

各居民点的位置可以由坐标(x,y)表示。

街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。

居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。

编程任务:给定n 个居民点的位置,编程计算邮局的最佳位置。

2.最大子数组问题问题描述:对给定数组A,寻找A的和最大的非空连续子数组。

3.寻找近似中值问题描述:设A是n个数的序列,如果A中的元素x满足以下条件:小于x的数的个数≥n/4,且大于x的数的个数≥n/4 ,则称x为A的近似中值。

设计算法求出A的一个近似中值。

如果A中不存在近似中值,输出false,否则输出找到的一个近似中值4.循环赛日程表问题描述:设有n=2^k个运动员要进行网球循环赛。

现要设计一个满足以下要求的比赛日程表:每个选手必须与其他n-1个选手各赛一次,每个选手一天只能赛一次,循环赛一共进行n-1天。

二、实验目的(1)进一步理解分治法解决问题的思想及步骤(2)体会分治法解决问题时递归及迭代两种不同程序实现的应用情况之差异(3)熟练掌握分治法的自底向上填表实现(4)将分治法灵活于具体实际问题的解决过程中,重点体会大问题如何分解为子问题及每一个大问题涉及哪些子问题及子问题的表示。

三、实验要求(1)写清算法的设计思想。

(2)用递归或者迭代方法实现你的算法,并分析两种实现的优缺点。

(3)根据你的数据结构设计测试数据,并记录实验结果。

(4)请给出你所设计算法的时间复杂度的分析,如果是递归算法,请写清楚算法执行时间的递推式。

四、实验过程(算法设计思想、源码)1.邮局选址问题(1)算法设计思想根据题目要求,街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 5
3
分治法在数值问题中的应用 ——最近点对问题 最近点对问题
3. 实验要求 1)设计并实现用BF方法求解最近点对问题的算法; 2)设计并实现用DAC方法求解最近点对问题的算法; 3)以上两种算法的输入既可以手动输入,也可以自动生成; 4)算法不仅要输出最近点对的距离,还要输出最近点对的 两个点; 5)对上述两个算法进行时间复杂性分析,并设计实验程序验证 分析结果; 6)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 11
6
动态规划法在图问题中的应用 ——全源最短路径问题 全源最短路径问题
3. 实验要求 (1)实现Floyd算法; (2)算法的输入可以手动输入,也可以自动生成; (3)算法不仅要输出从每个顶点到其他所有顶点之间 的最短路径,还有输出最短路径的长度; (4)设计一个权重为负的图或有向图的例子,对于它, Floyd算法不能输出正确的结果。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 9
5 变治法在排序问题中的应用 ——堆排序 堆排序
3. 实验要求 1)设计与实现堆排序算法; 2)待排序的数据可以手工输入(通常规模比较小,10个数 据左右),用以检测程序的正确性;也可以计算机随机生 成(通常规模比较大,1500-3000个数据左右),用以检 验(用计数法)堆排序算法的时间效率。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 7
4
减治法在组合问题中的应用 ——8枚硬币问题 8
3. 实验要求 1)设计减治算法实现8枚硬币问题; 2)设计实验程序,考察用减治技术设计的算法是否高效; 3)扩展算法,使之能处理n枚硬币中有一枚假币的问题。 4. 实现提示 假设用一个数组B[n]表示硬币,元素B[i]中存放第i枚硬币 的重量,其中n-1个元素的值都是相同的,只有一个元素与 其他元素值不同,则当n=8时即代表8枚硬币问题。由于8枚 硬币问题限制只允许使用天平比较轻重,所以,算法中只 能出现元素相加和比较的语句。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 6
4
减治法在组合问题中的应用 ——8枚硬币问题 8
1. 实验题目 在8枚外观相同的硬币中,有一枚是假币,并且已知假 币与真币的重量不同,但不知道假币与真币相比较轻还是 较重。可以通过一架天平来任意比较两组硬币,设计一个 高效的算法来检测这枚假币。 2.实验目的 2.实验目的 1)深刻理解并掌握减治法的设计思想并理解它与分治法 的区别; 2)提高应用减治法设计算法的技能。 3)理解这样一个观点:建立正角的模型对于问题的求解 是非常重要的。
2)点击操作后进入相应的实验项目或是相应项目的下一级菜单; 3)可以反复执行,直到退出实验。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 2
2 算法分析基础
1. 实验题目 给定一个非负整数n,计算第n个Fibonacci数 2.实验目的 . 1)理解递归算法和迭代算法的设计思想以及递归程序的 调式技术 2)掌握并应用递归算法和迭代算法效率的理论分析(前验分 析)和实际分析(后验分析)方法; 3)理解这样一个观点:不同的算法可以解决相同的问题, 这些算法的解题思路不同,复杂程度不同,效率也不同;
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 3
2 算法分析基础
3. 实验要求 1)使用教材2.5节中介绍的迭代算法Fib(n),找出最大的n,使得 第n个Fibonacci数不超过计算机所能表示的最大整数,并给出具 体的执行时间; 2)对于要求1),使用教材2.5节中介绍的递归算法F(n)进行计算,同 样给出具体的执行时间,并同1)的执行时间进行比较; 3)对于输入同样的非负整数n,比较上述两种算法基本操作的执 行次数; 4)对1)中的迭代算法进行改进,使得改进后的迭代算法其空间 复杂度为Θ(1); 5)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)。
算法实验整体框架的构建
3. 实验要求 1)设计的主菜单可以是图形模式的,也可以是控制台模式的。以控制 台为例,主菜单大致如下:
------------------------- 《算法设计与分析》实验 ------------------------- 1. 算法分析基础——Fibonacci序列问题 2. 分治法在数值问题中的应用——最近点对问题 3. 减治法在组合问题中的应用——8枚硬币问题 4. 变治法在排序问题中的应用——堆排序问题 5. 动态规划法在图问题中的应用——全源最短路径问题 99. 退出本实验 ------------------------- 请输入您所要执行的操作(1,2,3,4,5,99):
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 8
5 变治法在排序问题中的应用 ——堆排序 堆排序
1. 实验题目 用基于变治法的堆排序算法对任意一组给定的数据进 行排序 2.实验目的 . 1)深刻理解并掌握变治法的设计思想; 2)掌握堆的概念以及如何用变治法把任意给定的一组数 据改变成堆; 3)提高应用变治法设计算法的技能。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 4
3
分治法在数值问题中的应用 ——最近点对问题 最近点对问题
1. 实验题目 设p1 = (x1,y1), p2 = (x1, y2), ……, pn= (xn, yn)是平面上n个点 构成的集合S,设计算法找出集合S中距离最近的点对。 2.实验目的 1)提高应用蛮力法设计算法的技能; 2)深刻理解并掌握分治法的设计思想; 3)理解这样一个观点:用蛮力法设计的算法,一般来说, 经过适度的努力后,都可以对其进行改进,以提高算法的 效率。
1
算法实验整体框架的构建
1. 实验题目 算法实验主菜单的设计。 2.实验目的 ⑴ 熟悉实验环境VC++6.0 ; ⑵ 复习C、C++语言以及数据结构课程的相关知识, 实现课程间的平滑过度;
10/29/2010
2006 《Algorithm Design and Analysis》 SCUEC 》
1
1
10/29/2010
2006 《Algorithm Design and Analysis》 SCUEC 》
10
6
动态规划法在图问题中的应用 ——全源最短路径问题 全源最短路径问题
1. 实验题目 给定一个加权连通图(无向的或有向的),要求找出从 每个定点到其他所有定点之间的最短路径以及最短路径的 长度。 2.实验目的 . (1)深刻掌握动态规划法的设计思想并能熟练运用,理 解它与分治法的区别; (2)掌握最优性原理和最优子结构性质; (3)理解这样一个观点:用动态规划方法求解问题的关 键在于确定动态规划函数的递推式。
10/29/2010
2006 《Algorithm Design and Analysis》
相关文档
最新文档