资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

算法与java代码实现 算法与java代码实现的区别

关于各种排列组合java算法实现方法

一 利用二进制状态法求排列组合 此种方法比较容易懂 但是运行效率不高 小数据排列组合可以使用

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了禹王台免费建站欢迎大家使用!

复制代码 代码如下: import java util Arrays;

//利用二进制算法进行全排列 //count : //count :

public class test { public static void main(String[] args) { long start=System currentTimeMillis(); count (); long end=System currentTimeMillis(); System out println(end start); } private static void count (){ int[] num=new int []{ }; for(int i= ;iMath pow( );i++){ String str=Integer toString(i ); int sz=str length(); for(int j= ;j sz;j++){ str=" "+str; } char[] temp=str toCharArray(); Arrays sort(temp); String gl=new String(temp); if(!gl equals(" ")){ continue; } String result=""; for(int m= ;mstr length();m++){ result+=num[Integer parseInt(str charAt(m)+"")]; } System out println(result); } } public static void count (){ int[] num=new int []{ }; int[] ss=new int []{ }; int[] temp=new int[ ]; while(temp[ ] ){ temp[temp length ]++; for(int i=temp length ;i ;i ){ if(temp[i]== ){ temp[i]= ; temp[i ]++; } } int []tt=temp clone(); Arrays sort(tt); if(!Arrays equals(tt ss)){ continue; } String result=""; for(int i= ;inum length;i++){ result+=num[temp[i]]; } System out println(result); } } }

二 用递归的思想来求排列跟组合 代码量比较大

复制代码 代码如下: package practice;

import java util ArrayList; import java util List;

public class Test {

/** * @param args */ public static void main(String[] args) { // TODO Auto generated method stub Object[] tmp={ }; // ArrayListObject[] rs=RandomC(tmp); ArrayListObject[] rs=cmn(tmp ); for(int i= ;irs size();i++) { // System out print(i+"="); for(int j= ;jrs get(i) length;j++) { System out print(rs get(i)[j]+" "); } System out println(); } }

// 求一个数组的任意组合 static ArrayListObject[] RandomC(Object[] source) { ArrayListObject[] result=new ArrayListObject[](); if(source length== ) { result add(source); } else { Object[] psource=new Object[source length ]; for(int i= ;ipsource length;i++) { psource[i]=source[i]; } result=RandomC(psource); int len=result size();//fn组合的长度 result add((new Object[]{source[source length ]})); for(int i= ;ilen;i++) { Object[] tmp=new Object[result get(i) length+ ]; for(int j= ;jtmp length ;j++) { tmp[j]=result get(i)[j]; } tmp[tmp length ]=source[source length ]; result add(tmp); } } return result; } static ArrayListObject[] cmn(Object[] source int n) { ArrayListObject[] result=new ArrayListObject[](); if(n== ) { for(int i= ;isource length;i++) { result add(new Object[]{source[i]}); } } else if(source length==n) { result add(source); } else { Object[] psource=new Object[source length ]; for(int i= ;ipsource length;i++) { psource[i]=source[i]; } result=cmn(psource n); ArrayListObject[] tmp=cmn(psource n ); for(int i= ;itmp size();i++) { Object[] rs=new Object[n]; for(int j= ;jn ;j++) { rs[j]=tmp get(i)[j]; } rs[n ]=source[source length ]; result add(rs); } } return result; }

}

三 利用动态规划的思想求排列和组合

复制代码 代码如下: package Acm; //强大的求组合数 public class MainApp { public static void main(String[] args) { int[] num=new int[]{ }; String str=""; //求 个数的组合个数 // count( str num ); // 求 n个数的组合个数 count ( str num); }

private static void count (int i String str int[] num) { if(i==num length){ System out println(str); return; } count (i+ str num); count (i+ str+num[i]+" " num); }

private static void count(int i String str int[] num int n) { if(n== ){ System out println(str); return; } if(i==num length){ return; } count(i+ str+num[i]+" " num n ); count(i+ str num n); } }

下面是求排列

复制代码 代码如下: lishixinzhi/Article/program/Java/JSP/201311/20148

如何用70行Java代码实现神经网络算法

如何用70行Java代码实现神经网络算法

import java.util.Random;

public class BpDeep{

public double[][] layer;//神经网络各层节点

public double[][] layerErr;//神经网络各节点误差

public double[][][] layer_weight;//各层节点权重

public double[][][] layer_weight_delta;//各层节点权重动量

public double mobp;//动量系数

public double rate;//学习系数

public BpDeep(int[] layernum, double rate, double mobp){

this.mobp = mobp;

this.rate = rate;

layer = new double[layernum.length][];

layerErr = new double[layernum.length][];

layer_weight = new double[layernum.length][][];

layer_weight_delta = new double[layernum.length][][];

Random random = new Random();

for(int l=0;llayernum.length;l++){

layer[l]=new double[layernum[l]];

layerErr[l]=new double[layernum[l]];

if(l+1layernum.length){

layer_weight[l]=new double[layernum[l]+1][layernum[l+1]];

layer_weight_delta[l]=new double[layernum[l]+1][layernum[l+1]];

for(int j=0;jlayernum[l]+1;j++)

for(int i=0;ilayernum[l+1];i++)

layer_weight[l][j][i]=random.nextDouble();//随机初始化权重

}

}

}

//逐层向前计算输出

public double[] computeOut(double[] in){

for(int l=1;llayer.length;l++){

for(int j=0;jlayer[l].length;j++){

double z=layer_weight[l-1][layer[l-1].length][j];

for(int i=0;ilayer[l-1].length;i++){

layer[l-1][i]=l==1?in[i]:layer[l-1][i];

z+=layer_weight[l-1][i][j]*layer[l-1][i];

}

layer[l][j]=1/(1+Math.exp(-z));

}

}

return layer[layer.length-1];

}

//逐层反向计算误差并修改权重

public void updateWeight(double[] tar){

int l=layer.length-1;

for(int j=0;jlayerErr[l].length;j++)

layerErr[l][j]=layer[l][j]*(1-layer[l][j])*(tar[j]-layer[l][j]);

while(l--0){

for(int j=0;jlayerErr[l].length;j++){

double z = 0.0;

for(int i=0;ilayerErr[l+1].length;i++){

z=z+l0?layerErr[l+1][i]*layer_weight[l][j][i]:0;

layer_weight_delta[l][j][i]= mobp*layer_weight_delta[l][j][i]+rate*layerErr[l+1][i]*layer[l][j];//隐含层动量调整

layer_weight[l][j][i]+=layer_weight_delta[l][j][i];//隐含层权重调整

if(j==layerErr[l].length-1){

layer_weight_delta[l][j+1][i]= mobp*layer_weight_delta[l][j+1][i]+rate*layerErr[l+1][i];//截距动量调整

layer_weight[l][j+1][i]+=layer_weight_delta[l][j+1][i];//截距权重调整

}

}

layerErr[l][j]=z*layer[l][j]*(1-layer[l][j]);//记录误差

}

}

}

public void train(double[] in, double[] tar){

double[] out = computeOut(in);

updateWeight(tar);

}

}

学习算法与写代码有什么关系?如何学习Java代码?

1、再好的算法最终的目的都是要实现,所以学习算法是最好至少用一种擅长的语言实现它(即编写相应的代码),算法只是一种思想,思想要付诸与实现需要借助代码。当然如果数学很好也可以纯在理论方面研究算法,也很有前途的,不过要比实现难得多。

2、学习java代码最好是先选一本很薄的书通读,了解基本概念。在读别人的代码,不会的地方在回头看书,只一次找一本详细一点的书。之后就是自己写了,学一些经典的算法或者案例亲自写一个工程或者项目。

JAVA 实现算法

package huda.laogao.ON_20121216;

import java.util.*;

public class GetEquation {

ArrayListInteger params = null;// 进行加减的数,长度设为n

int result = 0;// 结果

public GetEquation(ArrayListInteger params, int result) {

this.params = params;

this.result = result;

}

public void run() {

int size = params.size();

if (size == 1) {

if (params.get(0) == result)

System.out.println(result + "=" + result);

else

System.out.println("Invalid");

return;

}

int[][] matrix = getMatrix(size - 1);

int m = matrix.length;// 行数

int count = 0;// 记录符合结果的组合数

for (int i = 0; i m; i++) {

int now = params.get(0);// 进行加减的结果,初始为第一个值

// 从第二个数开始进行加或减,加的话就相当于该数乘上1,然后加到结果上,

// 减的就相当于该数乘上-1,然后加到结果上

for (int j = 1; j size; j++) {

now += matrix[i][j - 1] * params.get(j);

}

// System.out.println(now);

// 判断结果

if (now == result) {

count++;// 组合数加1

System.out.print(params.get(0));

for (int j = 1; j size; j++) {

if (matrix[i][j - 1] == 1)

System.out.print("+" + params.get(j));

else

System.out.print("-" + params.get(j));

}// for j

System.out.println("=" + result);

}// if

}// for i

if (count == 0)

System.out.println("Invalid");

}

public int[][] getMatrix(int n) {

int m = (int) Math.pow(2, n);

int matrix[][] = new int[m][n];

for (int i = 0; i n; i++) {

int num = (int) Math.pow(2, i + 1);

// 总共分 2^(i+1)块,如i=0,即该矩阵的第一列,可分为2块,上一块取1,下一块取-1

int size = (int) Math.pow(2, n - i - 1);

// 每块的大小为2^(n-i-1),如n=3,i=0,每块的大小为4,即前4个为1,后4个为-1

int flag = 1;// 先为+

for (int j = 0; j num; j++) {

for (int k = 0; k size; k++) {

matrix[k + j * size][i] = flag;

}

flag *= -1;

}

}

return matrix;

}

public void print(int[][] matrix) {

for (int i = 0; i matrix.length; i++) {

for (int j = 0; j matrix[i].length; j++) {

System.out.print(matrix[i][j] + "\t");

}

System.out.println();

}

}

public static void main(String args[]) {

ArrayListInteger params = new ArrayListInteger();

params.add(1);

params.add(2);

params.add(3);

params.add(4);

int result = 10;

GetEquation ge = new GetEquation(params, result);

ge.run();

}

}

运行结果为:1+2+3+4=10

注:难点为获取加减矩阵,可辅助print()函数帮助理解

望采纳


分享名称:算法与java代码实现 算法与java代码实现的区别
网站路径:http://www.cdkjz.cn/article/ddosdhc.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220