演示算法
还真敢要,别说5分了,5块钱也没人帮你做,自己想办法吧,懒鬼
‘贰’ 题目1:一个简单的算法演示程序(JAVA语言实现)
1. 选择一个算法(提供选择见下),利用各种方法(图形、动画等)演示算法的演示过程。
2. 可以进行手动演示,也可以自动步进式演示。
3. 允许用户设置算法的各个输入参数,以及自动步进式演示中的时间间隔。
4. 不同的算法输入要求见下。
界面要求:
1. 尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。
2. 如果无法实现图形界面,则在命令行方式下也需要提供菜单,方便用户操作。
其他要求:
1. 标识符命名遵循Windows命名规范。
2. 能够注意各种异常处理,注重提高程序运行效率。
提交内容:
1. 全部源代码。
2. 软件设计和使用说明书(UML类图;实现的功能、主要技术;使用帮助文档)
参考算法:
1. 最小生成树算法:Prim算法、Kruskal算法。允许以下方式输入一个图形:绘制图形、输入邻接矩阵、输入边及其关联的顶点。要求在图形方式下进行演示算法执行步骤。
2. 单源最短路算法:Dijkstra算法。允许以下方式输入一个图形:绘制图形、输入邻接矩阵、输入边及其关联的顶点。要求在图形方式下进行演示算法执行步骤。
3. 最优编码算法:Huffman编码算法。允许用户输入一段英文文字,或者打开一个txt文档(英文内容),据此文档内容进行编码。要求动态列出每个字符的出现概率统计结果以及对应编码。
4. 其他可供演示的具有一定难度的算法,如关键路径问题、有向图的极大连通分支等。
‘叁’ 数据结构 6.8 中序线索链表遍历算法演示
希赛教育计算机专业考研专业课辅导招生
希赛教育计算机专业考研专业课辅导视频
希赛教育计算机考研专业课在线测试系统
void InOrderTraverse_Thr(BiThrTree Thead void (*Visit)(ElemType e)){ // Thead 指向中序线索链表中的头结点 头结点的左指针 Lchild // 指向二叉树的根结点 头结点的右线索 Rchild 指向中序遍历 // 访问的最后一个结点 本算法对此二叉树进行中序遍历 对 // 树中每个数据元素调用函数 Visit 进行访问操作 p = Thead >Lchild; // p 指向二叉树的根结点 while (p!= Thead) {// 空树或遍历结束时 p==Thead while (p >LTag==Link) p = p >Lchild; Visit(p >data); // 访问其左子树为空的结点 while (p >RTag==Thread && p >Rchild!=Thread) { p = p >rchild; Visit(p >data);// 访问 右线索 所指后继结点 } // while p = p >Rchild; // p 进至其右子树根 } // while} // InOrderTraverse_Thr
算法的执行过程如动画所示
lishixin/Article/program/sjjg/201311/22592
‘肆’ Java算法演示系统
//哈哈,我做了一种排序的GUI演示
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SortX extends JFrame{
private JLabel[]n;
private JButton start;
private JTextField in;
public SortX(){
this.getContentPane().setLayout(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(488,200);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setAlwaysOnTop(true);
start = new JButton("start sort");
JLabel l = new JLabel("输入10组内数字:");
l.setBounds(10,18,120,20);
add(l);
in=new JTextField("10,212,7,456,33,2,55,6,50,97");
in.setBounds(118,18,256,20);
add(in);
start.setBounds(380,18,88,20);
add(start);
start.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){sort();}});
n=new JLabel[10];
for(int i=0; i<n.length; i++){
n[i]=new JLabel();
n[i].setFont(new Font("",Font.BOLD,14));
n[i].setForeground(Color.gray);
n[i].setHorizontalAlignment(JLabel.CENTER);
add(n[i]);
}
}
private void sort(){
setTitle("排序演示");
try{
String src = in.getText();
src=src.replaceAll("[^0-9,]","");
String[] sp = src.split(",");
final int[] v = new int[sp.length];
int left=0,w=40,offx=0,offy=95;
for(int i=0; i<n.length;i++)n[i].setText(null);
for(int i=0; i<sp.length; i++){
n[i].setText(sp[i]);
v[i] = Integer.valueOf(sp[i]);
n[i].setSize(w,20);
n[i].setLocation((left+=w)+offx,offy);
}
new Thread(){
public void run(){
start.setEnabled(false);
s(500);
try{
for(int i=0; i<n.length-1; i++){
if(v[i]>v[i+1]){
JLabel l=n[i];
n[i]=n[i+1];
n[i+1]=l;
n[i].setForeground(Color.blue);
for(int k=0; k<7; k++){
n[i].setVisible(k%2==0);
s(123);
}
swap(n[i],n[i+1]);
n[i].setForeground(Color.gray);
v[i]+=v[i+1];
v[i+1]=v[i]-v[i+1];
v[i]-=v[i+1];
i-=i==0?1:2;
}
}
}catch(Exception e){}
start.setEnabled(true);
}
private void swap(JLabel a, JLabel b) {
JLabel t = a;
a=b;
b=t;
Point pa=a.getLocation();
Point pb=b.getLocation();
int x1,x2,y1,y2;
x1=pa.x;
x2=pb.x;
y1=pa.y;
y2=pb.y;
int delay=10;
while(x1<(x1+x2)/2){
a.setLocation(++x1,y1++);
b.setLocation(--x2,y2--);
s(delay);
}
while(x1<pb.x){
a.setLocation(++x1,y1--);
b.setLocation(--x2,y2++);
s(delay);
}
a.setLocation(pb);
b.setLocation(pa);
}
private void s(int i) {
try {
sleep(i);
} catch (Exception e) {}
}
}.start();
}catch(Exception e){e.printStackTrace();setTitle("请检查输入的数据,只能输入10组哦");}
}
public static void main(String[] args) {
new SortX().setVisible(true);
}
}
‘伍’ RSA加密算法简易演示
RSA算法安全性本质是三大数学困难问题之一也就是大数分解问题,因为目前尚没有一种有效的方法可以在短时间内分解两个大素数的乘积。验证步骤如上面所说的,原理书上有,具体程序实现简单讲一下
判断质数,这是基本水平,可以穷举也可以建表,按自己喜好
这一步是计算两个大素数乘积没什么好说的
判断两个数互质,一般采用欧几里得算法,辗转相除直到得到gcd(e1,m)=1。当然你也可以穷举公因数一直到sqrt(min{e1,m})
计算乘法逆元是依靠广义欧几里得算法,乘法逆元的意思是形如a*a1 ≡ 1(mod m)这样的(因为这里的群的乘法定义就是数学乘法),a和a1互为彼此模m的逆元,记作a1=a^-1 mod m,只有gcd(a,m)=1时才有唯一解否则无解。
计算方法是广义欧几里得除法,设r0=m,r1=a,s0=1,s1=0,t0=0,t1=1;
计算ai=[r(i-1)/ri],r(i+1)=r(i-1)-airi,s(i+1)=s(i-1)-aisi,t(i+1)=t(i-1)-aiti,直到ri=0
举例如a=7,m=13,计算a^-1 mod m:
a1=[13/7]=1,r2=r0-a1r1=6,s2=s0-a1s1=1,t2=t0-a1t1=-1;
a2=[7/6]=1,r3=r1-a2r2=1,s3=s1-a2s2=-1,t3=t1-a2t2=2;
a3=[6/1]=6,r4=r2-a3r3=0.
取s=s3=-1,t=t3=2,则有7*2-1*13=1,故a^-1mod m=t=2。
把上面的方法写成C++算法应该很简单
5和6都是计算同余没什么好说的,记得要用到a^e≡b^e(mod m)化简
要毕业了还搞不懂逆元有点拙计啊,回去好好看看离散数学吧
‘陆’ 数组倒序动态演示的算法
倒序数组的算法 倒序数组的算法(C# 版),代码如下: view sourceprint?01#region 倒序数组 02 03 static void SwapNumArray() 04 { 05 //int[] items = new int[] { 31, -41, 59, 26, -53, 58, 97, -93, -23, 84 }; 06 07 //int[] items = new int[] { 31, -41,59 }; 08 int[] items = new int[] { 31, -41, 59, 26 ,53}; 09 10 int middleIndex = 0; 11 12 bool isDouble = true; 13 if (items.Length % 2 == 0) 14 { 15 //偶数 16 middleIndex = items.Length / 2 - 1; 17 } 18 else19 { 20 isDouble = false; 21 middleIndex = items.Length / 2; 22 } 23 int loopCount = isDouble == true ? middleIndex : (middleIndex - 1); 24 int temp = 0; 25 for (int i = 0; i <= loopCount; i++) 26 { 27 //交换items[i]和items[items.Length -1 -i] 28 temp = items[items.Length - 1 - i]; 29 items[items.Length - 1 - i] = items[i]; 30 items[i] = temp; 31 } 32 foreach (int item in items) 33 { 34 Console.Write(item + ","); 35 } 36 Console.ReadKey(); 37 } 38 39 #endregion