算法实践篇-2的n次方方正相乘普通方法,递归方法以及strassen方法

幂函数2^n算法(蛮力迭代版)、(优化递归版) 问题描述:              在禁止超过1位的位移运算的前提下,对任意非负整数n,计算2^n // 在禁止超过1位的位移运算的前提下,对任意非负整数n,计算2^n #include int main() { int n = 5; int pow = 1; //将累积器初始化为1 while (0 < n--) { pow <<= 1; //O(1)将累积 阅读详情

发布一个k8s部署视频:https://edu.youkuaiyun.com/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.youkuaiyun.com/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.youkuaiyun.com/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件
————————————————------------------------------------------------------------------------------------------------------------------

 

package com.sort.divid;

/**
 * 矩阵乘法
 * @author Administrator
 *a,b为n*n矩阵,并且n=2^n
 */
public class StrassenMatrixMultipliy {

	public static void main(String[] args) {
		int[][]a=new int[][]{
				{1,2,3,4},
				{5,6,7,8},
				{9,10,11,12},
				{13,14,15,16}
		};
		int[][]b=new int[][]{
				{1,3,5,7},
				{2,4,6,8},
				{11,13,15,17},
				{12,14,16,18}
		};
		
		int[][] result1=ordernaryMultipy(a,b);
		System.out.println("resule1:ordernaryMultipy");
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a.length;j++){
				System.out.print(result1[i][j]+"  ");
			}
			System.out.println();
		}
		System.out.println("resule2:recruciveMultipy");
		int[][]result2=recruciveMultipy(a,b ,new int[][]{
				{0,0},
				{0,a.length-1},
				{a.length-1,0},
				{a.length-1,a.length-1}
		},new int[][]{
				{0,0},
				{0,a.length-1},
				{a.length-1,0},
				{a.length-1,a.length-1}
		},a.length);
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a.length;j++){
				System.out.print(result2[i][j]+"  ");
			}
			System.out.println();
		}
		System.out.println("resule3:strassenMultipy");

	}
	
	private static int[][] strassenMultipy(int[][]a,int[][]b){
		int [][] c=new int[a.length][a.length];
		
		return c;
	}
	
	private static int[][] ordernaryMultipy(int [][] a,int[][]b){
		int n=a.length;
		int [][] c=new int[n][n];
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				for(int k=0;k<n;k++){
					c[i][k]+=a[i][j]*b[j][k];
				}
			}
		}
		return c;
	}
	
	private static int[][] recruciveMultipy(int [][]a,int[][]b,int[][] indexA,int[][]indexB,int size){
		int [][] c=new int[size][size];
		if(indexA[0][0]-indexA[3][0]==0){
			c[indexA[0][0]][indexB[0][1]]=a[indexA[0][0]][indexA[0][1]]*b[indexB[0][0]][indexB[0][1]];
		}else{
			int n=size;
			int[][] indexA11=new int[4][2];
			indexA11[0][0]=indexA[0][0];
			indexA11[0][1]=indexA[0][1];
			indexA11[1][0]=indexA[1][0];
			indexA11[1][1]=(indexA[1][1]+indexA[0][1])/2;
			indexA11[2][0]=(indexA[2][0]+indexA[0][0])/2;
			indexA11[2][1]=indexA[2][1];
			indexA11[3][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA11[3][1]=(indexA[3][1]+indexA[0][1])/2;
			
			int [][]indexA12=new int[4][2];
			indexA12[0][0]=indexA[0][0];
			indexA12[0][1]=(indexA[1][1]+indexA[0][1])/2+1;
			indexA12[1][0]=indexA[1][0];
			indexA12[1][1]=indexA[1][1];
			indexA12[2][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA12[2][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA12[3][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA12[3][1]=indexA[3][1];
			
			int [][] indexA21=new int[4][2];
			indexA21[0][0]=(indexA[2][0]+indexA[0][0])/2+1;
			indexA21[0][1]=indexA[0][1];
			indexA21[1][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA21[1][1]=(indexA[3][1]+indexA[0][0])/2;
			indexA21[2][0]=indexA[2][0];
			indexA21[2][1]=indexA[2][1];
			indexA21[3][0]=indexA[3][0];
			indexA21[3][1]=(indexA[3][1]+indexA[0][0])/2;
			
			int[][]indexA22=new int[4][2];
			indexA22[0][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA22[0][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA22[1][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA22[1][1]=indexA[3][1];
			indexA22[2][0]=indexA[3][0];
			indexA22[2][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA22[3][0]=indexA[3][0];
			indexA22[3][1]=indexA[3][1];
			
			int[][]indexB11=new int[4][2];
			indexB11[0][0]=indexB[0][0];
			indexB11[0][1]=indexB[0][1];
			indexB11[1][0]=indexB[1][0];
			indexB11[1][1]=(indexB[1][1]+indexB[0][1])/2;
			indexB11[2][0]=(indexB[2][0]+indexB[0][0])/2;
			indexB11[2][1]=indexB[2][1];
			indexB11[3][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB11[3][1]=(indexB[3][1]+indexB[0][1])/2;
			
			int[][]indexB12=new int[4][2];
			indexB12[0][0]=indexB[0][0];
			indexB12[0][1]=(indexB[1][1]+indexB[0][1])/2+1;
			indexB12[1][0]=indexB[1][0];
			indexB12[1][1]=indexB[1][1];
			indexB12[2][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB12[2][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB12[3][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB12[3][1]=indexB[3][1];
			
			int[][]indexB21=new int[4][2];
			indexB21[0][0]=(indexB[2][0]+indexB[0][0])/2+1;
			indexB21[0][1]=indexB[0][1];
			indexB21[1][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB21[1][1]=(indexB[3][1]+indexB[0][0])/2;
			indexB21[2][0]=indexB[2][0];
			indexB21[2][1]=indexB[2][1];
			indexB21[3][0]=indexB[3][0];
			indexB21[3][1]=(indexB[3][1]+indexB[0][0])/2;
			
			int[][]indexB22=new int[4][2];
			indexB22[0][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB22[0][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB22[1][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB22[1][1]=indexB[3][1];
			indexB22[2][0]=indexB[3][0];
			indexB22[2][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB22[3][0]=indexB[3][0];
			indexB22[3][1]=indexB[3][1];
			
			int [][]c11x=recruciveMultipy(a,b,indexA11,indexB11,size);
			int [][]c11y=recruciveMultipy(a,b,indexA12,indexB21,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c11x[i][j]+c11y[i][j];
				}
			}
			int[][]c12x=recruciveMultipy(a,b,indexA11,indexB12,size);
			int[][]c12y=recruciveMultipy(a,b,indexA12,indexB22,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c12x[i][j]+c12y[i][j];
				}
			}
			int[][]c21x=recruciveMultipy(a,b,indexA21,indexB11,size);
			int[][]c21y=recruciveMultipy(a,b,indexA22,indexB21,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c21x[i][j]+c21y[i][j];
				}
			}
			int[][]c22x=recruciveMultipy(a,b,indexA21,indexB12,size);
			int[][]c22y=recruciveMultipy(a,b,indexA22,indexB22,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c22x[i][j]+c22y[i][j];
				}
			}
		}
		return c;
	}

}

Strassen方法待续。

 

package com.sort.divid;

/**
 * 矩阵乘法
 * @author Administrator
 *a,b为n*n矩阵,并且n=2^n
 */
public class StrassenMatrixMultipliy {

	public static void main(String[] args) {
		int[][]a=new int[][]{
				{1,2,3,4},
				{5,6,7,8},
				{9,10,11,12},
				{13,14,15,16}
		};
		int[][]b=new int[][]{
				{1,3,5,7},
				{2,4,6,8},
				{11,13,15,17},
				{12,14,16,18}
		};
		
		int[][] result1=ordernaryMultipy(a,b);
		System.out.println("resule1:ordernaryMultipy");
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a.length;j++){
				System.out.print(result1[i][j]+"  ");
			}
			System.out.println();
		}
		System.out.println("resule2:recruciveMultipy");
		int[][]result2=recruciveMultipy(a,b ,new int[][]{
				{0,0},
				{0,a.length-1},
				{a.length-1,0},
				{a.length-1,a.length-1}
		},new int[][]{
				{0,0},
				{0,a.length-1},
				{a.length-1,0},
				{a.length-1,a.length-1}
		},a.length);
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a.length;j++){
				System.out.print(result2[i][j]+"  ");
			}
			System.out.println();
		}
		System.out.println("resule3:strassenMultipy");
		
		int[][]result3=strassenMultipy(a,b ,new int[][]{
				{0,0},
				{0,a.length-1},
				{a.length-1,0},
				{a.length-1,a.length-1}
		},new int[][]{
				{0,0},
				{0,a.length-1},
				{a.length-1,0},
				{a.length-1,a.length-1}
		},a.length);
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a.length;j++){
				System.out.print(result3[i][j]+"  ");
			}
			System.out.println();
		}

	}
	
	private static int[][] strassenMultipy(int[][]a,int[][]b,int[][] indexA,int[][]indexB,int size){
		int [][] c=new int[size][size];
		if(indexA[0][0]-indexA[3][0]==0){
			c[indexA[0][0]][indexB[0][1]]=a[indexA[0][0]][indexA[0][1]]*b[indexB[0][0]][indexB[0][1]];
		}else{
			int[][] indexA11=new int[4][2];
			indexA11[0][0]=indexA[0][0];
			indexA11[0][1]=indexA[0][1];
			indexA11[1][0]=indexA[1][0];
			indexA11[1][1]=(indexA[1][1]+indexA[0][1])/2;
			indexA11[2][0]=(indexA[2][0]+indexA[0][0])/2;
			indexA11[2][1]=indexA[2][1];
			indexA11[3][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA11[3][1]=(indexA[3][1]+indexA[0][1])/2;
			
			int [][]indexA12=new int[4][2];
			indexA12[0][0]=indexA[0][0];
			indexA12[0][1]=(indexA[1][1]+indexA[0][1])/2+1;
			indexA12[1][0]=indexA[1][0];
			indexA12[1][1]=indexA[1][1];
			indexA12[2][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA12[2][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA12[3][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA12[3][1]=indexA[3][1];
			
			int [][] indexA21=new int[4][2];
			indexA21[0][0]=(indexA[2][0]+indexA[0][0])/2+1;
			indexA21[0][1]=indexA[0][1];
			indexA21[1][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA21[1][1]=(indexA[3][1]+indexA[0][0])/2;
			indexA21[2][0]=indexA[2][0];
			indexA21[2][1]=indexA[2][1];
			indexA21[3][0]=indexA[3][0];
			indexA21[3][1]=(indexA[3][1]+indexA[0][0])/2;
			
			int[][]indexA22=new int[4][2];
			indexA22[0][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA22[0][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA22[1][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA22[1][1]=indexA[3][1];
			indexA22[2][0]=indexA[3][0];
			indexA22[2][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA22[3][0]=indexA[3][0];
			indexA22[3][1]=indexA[3][1];
			
			int[][]indexB11=new int[4][2];
			indexB11[0][0]=indexB[0][0];
			indexB11[0][1]=indexB[0][1];
			indexB11[1][0]=indexB[1][0];
			indexB11[1][1]=(indexB[1][1]+indexB[0][1])/2;
			indexB11[2][0]=(indexB[2][0]+indexB[0][0])/2;
			indexB11[2][1]=indexB[2][1];
			indexB11[3][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB11[3][1]=(indexB[3][1]+indexB[0][1])/2;
			
			int[][]indexB12=new int[4][2];
			indexB12[0][0]=indexB[0][0];
			indexB12[0][1]=(indexB[1][1]+indexB[0][1])/2+1;
			indexB12[1][0]=indexB[1][0];
			indexB12[1][1]=indexB[1][1];
			indexB12[2][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB12[2][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB12[3][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB12[3][1]=indexB[3][1];
			
			int[][]indexB21=new int[4][2];
			indexB21[0][0]=(indexB[2][0]+indexB[0][0])/2+1;
			indexB21[0][1]=indexB[0][1];
			indexB21[1][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB21[1][1]=(indexB[3][1]+indexB[0][0])/2;
			indexB21[2][0]=indexB[2][0];
			indexB21[2][1]=indexB[2][1];
			indexB21[3][0]=indexB[3][0];
			indexB21[3][1]=(indexB[3][1]+indexB[0][0])/2;
			
			int[][]indexB22=new int[4][2];
			indexB22[0][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB22[0][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB22[1][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB22[1][1]=indexB[3][1];
			indexB22[2][0]=indexB[3][0];
			indexB22[2][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB22[3][0]=indexB[3][0];
			indexB22[3][1]=indexB[3][1];
			
			int n=size;
			int [][] p1=new int[size][size];
			int [][]p1a=strassenMultipy(a,b,indexA11,indexB12,size);
			int [][]p1b=strassenMultipy(a,b,indexA11,indexB22,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					p1[i][j]+=p1a[i][j]-p1b[i][j];
				}
			}
			
			int [][] p2=new int[size][size];
			int [][]p2a=strassenMultipy(a,b,indexA11,indexB22,size);
			int [][]p2b=strassenMultipy(a,b,indexA12,indexB22,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					p2[i][j]+=p2a[i][j]+p2b[i][j];
				}
			}
			
			int [][] p3=new int[size][size];
			int [][]p3a=strassenMultipy(a,b,indexA21,indexB11,size);
			int [][]p3b=strassenMultipy(a,b,indexA22,indexB11,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					p3[i][j]+=p3a[i][j]+p3b[i][j];
				}
			}
			
			int [][] p4=new int[size][size];
			int [][]p4a=strassenMultipy(a,b,indexA22,indexB21,size);
			int [][]p4b=strassenMultipy(a,b,indexA22,indexB11,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					p4[i][j]+=p4a[i][j]-p4b[i][j];
				}
			}
			
			int [][] p5=new int[size][size];
			int [][]p5a=strassenMultipy(a,b,indexA11,indexB11,size);
			int [][]p5b=strassenMultipy(a,b,indexA11,indexB22,size);
			int [][]p5c=strassenMultipy(a,b,indexA22,indexB11,size);
			int [][]p5d=strassenMultipy(a,b,indexA22,indexB22,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					p5[i][j]+=p5a[i][j]+p5b[i][j]+p5c[i][j]+p5d[i][j];
				}
			}
			
			int [][] p6=new int[size][size];
			int [][]p6a=strassenMultipy(a,b,indexA12,indexB21,size);
			int [][]p6b=strassenMultipy(a,b,indexA12,indexB22,size);
			int [][]p6c=strassenMultipy(a,b,indexA22,indexB21,size);
			int [][]p6d=strassenMultipy(a,b,indexA22,indexB22,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					p6[i][j]+=p6a[i][j]+p6b[i][j]-p6c[i][j]-p6d[i][j];
				}
			}
			
			int [][] p7=new int[size][size];
			int [][]p7a=strassenMultipy(a,b,indexA11,indexB11,size);
			int [][]p7b=strassenMultipy(a,b,indexA11,indexB12,size);
			int [][]p7c=strassenMultipy(a,b,indexA21,indexB11,size);
			int [][]p7d=strassenMultipy(a,b,indexA21,indexB12,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					p7[i][j]+=p7a[i][j]+p7b[i][j]-p7c[i][j]-p7d[i][j];
				}
			}
			
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=p5[i][j]+p4[i][j]-p2[i][j]+p6[i][j]+p1[i][j]+p2[i][j]+p3[i][j]+p4[i][j]+p5[i][j]+p1[i][j]-p3[i][j]-p7[i][j];
					
				}
			}
			
		}
		return c;
	}
	
	private static int[][] ordernaryMultipy(int [][] a,int[][]b){
		int n=a.length;
		int [][] c=new int[n][n];
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				for(int k=0;k<n;k++){
					c[i][k]+=a[i][j]*b[j][k];
				}
			}
		}
		return c;
	}
	
	private static int[][] recruciveMultipy(int [][]a,int[][]b,int[][] indexA,int[][]indexB,int size){
		int [][] c=new int[size][size];
		if(indexA[0][0]-indexA[3][0]==0){
			c[indexA[0][0]][indexB[0][1]]=a[indexA[0][0]][indexA[0][1]]*b[indexB[0][0]][indexB[0][1]];
		}else{
			int n=size;
			int[][] indexA11=new int[4][2];
			indexA11[0][0]=indexA[0][0];
			indexA11[0][1]=indexA[0][1];
			indexA11[1][0]=indexA[1][0];
			indexA11[1][1]=(indexA[1][1]+indexA[0][1])/2;
			indexA11[2][0]=(indexA[2][0]+indexA[0][0])/2;
			indexA11[2][1]=indexA[2][1];
			indexA11[3][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA11[3][1]=(indexA[3][1]+indexA[0][1])/2;
			
			int [][]indexA12=new int[4][2];
			indexA12[0][0]=indexA[0][0];
			indexA12[0][1]=(indexA[1][1]+indexA[0][1])/2+1;
			indexA12[1][0]=indexA[1][0];
			indexA12[1][1]=indexA[1][1];
			indexA12[2][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA12[2][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA12[3][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA12[3][1]=indexA[3][1];
			
			int [][] indexA21=new int[4][2];
			indexA21[0][0]=(indexA[2][0]+indexA[0][0])/2+1;
			indexA21[0][1]=indexA[0][1];
			indexA21[1][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA21[1][1]=(indexA[3][1]+indexA[0][0])/2;
			indexA21[2][0]=indexA[2][0];
			indexA21[2][1]=indexA[2][1];
			indexA21[3][0]=indexA[3][0];
			indexA21[3][1]=(indexA[3][1]+indexA[0][0])/2;
			
			int[][]indexA22=new int[4][2];
			indexA22[0][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA22[0][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA22[1][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA22[1][1]=indexA[3][1];
			indexA22[2][0]=indexA[3][0];
			indexA22[2][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA22[3][0]=indexA[3][0];
			indexA22[3][1]=indexA[3][1];
			
			int[][]indexB11=new int[4][2];
			indexB11[0][0]=indexB[0][0];
			indexB11[0][1]=indexB[0][1];
			indexB11[1][0]=indexB[1][0];
			indexB11[1][1]=(indexB[1][1]+indexB[0][1])/2;
			indexB11[2][0]=(indexB[2][0]+indexB[0][0])/2;
			indexB11[2][1]=indexB[2][1];
			indexB11[3][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB11[3][1]=(indexB[3][1]+indexB[0][1])/2;
			
			int[][]indexB12=new int[4][2];
			indexB12[0][0]=indexB[0][0];
			indexB12[0][1]=(indexB[1][1]+indexB[0][1])/2+1;
			indexB12[1][0]=indexB[1][0];
			indexB12[1][1]=indexB[1][1];
			indexB12[2][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB12[2][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB12[3][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB12[3][1]=indexB[3][1];
			
			int[][]indexB21=new int[4][2];
			indexB21[0][0]=(indexB[2][0]+indexB[0][0])/2+1;
			indexB21[0][1]=indexB[0][1];
			indexB21[1][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB21[1][1]=(indexB[3][1]+indexB[0][0])/2;
			indexB21[2][0]=indexB[2][0];
			indexB21[2][1]=indexB[2][1];
			indexB21[3][0]=indexB[3][0];
			indexB21[3][1]=(indexB[3][1]+indexB[0][0])/2;
			
			int[][]indexB22=new int[4][2];
			indexB22[0][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB22[0][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB22[1][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB22[1][1]=indexB[3][1];
			indexB22[2][0]=indexB[3][0];
			indexB22[2][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB22[3][0]=indexB[3][0];
			indexB22[3][1]=indexB[3][1];
			
			int [][]c11x=recruciveMultipy(a,b,indexA11,indexB11,size);
			int [][]c11y=recruciveMultipy(a,b,indexA12,indexB21,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c11x[i][j]+c11y[i][j];
				}
			}
			int[][]c12x=recruciveMultipy(a,b,indexA11,indexB12,size);
			int[][]c12y=recruciveMultipy(a,b,indexA12,indexB22,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c12x[i][j]+c12y[i][j];
				}
			}
			int[][]c21x=recruciveMultipy(a,b,indexA21,indexB11,size);
			int[][]c21y=recruciveMultipy(a,b,indexA22,indexB21,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c21x[i][j]+c21y[i][j];
				}
			}
			int[][]c22x=recruciveMultipy(a,b,indexA21,indexB12,size);
			int[][]c22y=recruciveMultipy(a,b,indexA22,indexB22,size);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c22x[i][j]+c22y[i][j];
				}
			}
		}
		return c;
	}

}

 

 

 

 

 

矩阵乘法优化:从高斯消元到Strassen与Winograd算法 在计算机科学中,乘法操作因其硬件实现复杂和高精度计算下的平方级时间复杂度,常被视为性能瓶颈。为了提升计算效率,减少乘法次数成为算法优化的核心课题。其原理在于通过数学变换和预处理,用廉价的加法或内存访问替代昂贵的乘法,从而降低整体计算复杂度。这一思想在高斯消元法中体现为通过行缩放避免重复除法计算;在Strassen算法中,则通过递归分治将矩阵乘法的复杂度从O(n³)降至O(n^2.807),实现了用加法换乘法的突破;而Winograd算法进一步优化了加法次数,提升了数值稳定性。这些技术在高性能计算、深度学习( 阅读详情

相关推荐

矩阵乘法的strassen算法(C++实现)

一般情况下矩阵乘法需要三个for循环,时间复杂度为O(n^3),现在我们将矩阵分块如图:( 来自MIT算法导论 ) 一般算法需要八次乘法 r = a * e + b * g ; s = a * f + b * h ; t = c * e + d * g; u = c * f + d * h; strassen将其变成7次乘法,因为大家都知道乘法比加减法消耗更多,所有时间复杂更高! strassen的处理是: 令: p1 = a * ( f - h ) p2 = ( a + b ) * h p3 = ( c +d ) * e p4 = d * ( g - e ) p5 = ( a + d ) * ( e + h ) p6 = ( b - d ) * ( g + h ) p7 = ( a - c ) * ( e + f ) 那么我们可以知道: r = p5 + p4 + p6 - p2 s = p1 + p2 t = p3 + p4 u = p5 + p1 - p3 - p7

【递归】高效率求2的n次幂

思路:使用翻一番的技巧。 比如,2的9次 则 1 * 2 = 2;2 * 2 = 4;4 * 4 =16;16 * 16=。。。; 指数:1-----------2-----------4------------8--------------- 对应代码: 能翻倍的情况下 //能翻 while((ex<<1)<n) { //翻 res = res * res; ...

alovelypeach的博客 2465

矩阵乘法问题实现(用的是strenssen算法,可直接运行)

矩阵乘法问题strenssen算法实现,用的是C语言,希望大家多多支持~~~~~~~~~~~真心希望能解决您的问题

递归 专题(判断一个数 是否 2的N次方,位运算 实现 加法)

本文讨论了递归算法的适用场景,指出当循环改进复杂度过高而效率提升有限时,应优先选择递归。通过两个实例展示了递归的应用:(1)判断一个数是否为2的N次方,使用位运算和递归计算对数;(2)利用位运算和递归实现两个整数的加法运算,通过异或和进位操作完成递归相加。展示了递归在特定问题中的简洁实现优势。

Hongwei_1990的博客 877

Strassen矩阵相乘算法,C++实现,可运行

算法作业题目,用Strassen算法求矩阵相乘问题,C++源代码,可运行

算法实践:2的幂次方表示(递归)

2的幂次方表示 描述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjnOLAKd-1583034303750)(C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\image-20200301114236455.png)] 输入 一个正整数n(n≤20000)。 输出 一行,符合约定的n的0,2表示(在表示中不能有空格)。 样例 137 2(2(2)+2+2(0))+2(2+2(0))+2(0) 难度 中等,递归求解 解法 研究事例可知,先将输入数据137按指数从大到小分为2(7)+2(3)

矩阵相乘的strassen算法_矩阵乘法的Strassen算法

目录一、矩阵相乘二、矩阵相乘的朴素算法三、Strassen其人及其算法四、Strassen的理想五、附Strassen的一种代码实现六、参考一、矩阵相乘矩阵相乘,是指一个m*n的矩阵和一个n*k的矩阵相乘而得到一个m*k矩阵的一种运算。矩阵相乘可用于线性变换和矩阵分解[1]。二、矩阵相乘的朴素算法矩阵相乘的一般步骤是第一个矩阵的第i行*第二个矩阵的第j列,得到第三个矩阵的第i行第j列元素因此其素朴...

weixin_39992199的博客 904

图像去雨:超详细手把手写 pytorch 实现代码(带注释)

占个坑,过几天来写

书山有路,学海无涯! 1万+

Strassen矩阵乘法算法

算法设计的一道上机题,挺有意思的,在网上一通乱抄终于差不多完成了,主要看的是[这篇文章],(https://blog.youkuaiyun.com/gqkly/article/details/48913879?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164682444316780274167092%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&am.

m0_51250458的博客 2680

开源libmodbus编译为32位和64位动态库

libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。

lemontree1945的博客 1923

案例分析|一篇文章带你看懂养鸡场智慧管理系统

养鸡场智慧管理系统是为了满足现代化养鸡业对精细化管理的需求而设计的一款专业软件。随着科技的发展和农业产业的升级,传统的手工记录和管理方式已无法满足高效、准确和实时的数据跟踪需求。本软件旨在通过集成各种功能模块,帮助养鸡场主实现从鸡苗孵化、饲养管理、饲料控制到销售结算等全链条的智能化操作。该系统的核心目标是提升养鸡场的运营效率和盈利能力,通过自动化数据处理,减少人工误差,节省时间和精力。例如,孵化报表和记录模块可以帮助管理者实时监控孵化过程,及时调整策略;

muyu2980的专栏 930

《算法导论》-分治策略,矩阵相乘Strassen算法(伪代码,Java)

如果要计算上述矩阵,最简单的通用方法是通过三个循环也就是复杂度为O(n^3).而Strassen算法的特点是适用于比较大的矩阵,通过递归划分,再用上述公式解决,创建10个n/2小矩阵,递归计算7个矩阵。

qq_44242804的博客 1855

GEOSHIELD:分布式CPS的拜占庭容错与安全防护技术

分布式系统在关键基础设施(如轨道交通、智能电网)中面临网络延迟和恶意节点的双重挑战。拜占庭容错(BFT)技术通过算法保证系统在存在故障节点时仍能达成一致,是保障系统安全的核心机制。GEOSHIELD创新性地结合概率化网络延迟测量和TGS动态信任评分,实现了不依赖可信硬件的拜占庭 resilience。该技术通过建立节点行为的信用档案,动态识别恶意行为,在保证安全性的同时最大化系统可用性。实验证明,即使在自适应攻击策略下,GEOSHIELD仍能保持系统95.6%的正常运行时间,为CPS系统提供了可靠的安全防护

weixin_31766003的博客 348

普通的矩阵乘法和Strassen矩阵乘法算法的比较 代码是C++实现

flyfish

二分掌柜的 1543

麦当劳app之sign逆向分析

摘要:本文分析了麦当劳APP请求参数sign的逆向过程。通过抓包发现32位sign参数疑似MD5加密,使用frida-trace工具跟踪CC_MD5函数验证其为标准MD5算法。加密参数包含时间戳、token、版本号等固定和动态字段,拼接后经MD5加密生成sign。文章提供了JS和Python两种实现方案,包含完整的请求头参数和加密逻辑,最终成功获取API响应数据。该研究仅用于逆向技术学习,展示了移动应用常见加密参数的逆向分析方法。

佛系更新... 2444

十.镜头知识之畸变问题

对于理想光学系统,在一对共轭的物像平面上,像的放大率是一个常数。但是对于实际的光学系统,当视场较大或很大时,像的放大率就要随视场而异,这样就会使像相对于物体失去相似性。这种使像变形的成像缺陷称为畸变。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2127

《算法导论》学习(四)---- 矩阵乘法的Strassen(斯特拉森)算法

矩阵乘法可以采用分治的策略。这里提供了两个分治策略的解决n∗nn*nn∗n矩阵之间乘法的算法1.矩阵乘法的普通递归方法2.矩阵乘法的Strassen(斯特拉森)方法但是着两个方法的缺点是只能是两个n∗nn*nn∗n矩阵的乘法,同时n必须为2的幂之后也对这两个算法进行了时间复杂度上的分析。......

weixin_52042488的博客 5959

基于STM32的录音机设计(STM32F103+VS1053B)

本项目设计并实现了一款基于STM32微控制器的便携式录音机。该录音机采用STM32F103C8T6作为主控芯片,结合VS1053B音频编解码模块、SD卡存储、OLED显示屏以及按键模块,提供了手动录音、自动录音和录音回放等多种功能。

1万+

Strassen矩阵乘法——C++

基于分治法的矩阵快速乘法---C++实现

stu_kk的博客 2097

分布式协作方案:OpenClaw多节点部署与设备互联

主从架构或对等架构服务发现与注册机制负载均衡策略选择分布式任务队列优先级调度失败重试机制WebSocket实时通信数据同步引擎冲突解决策略健康检查机制故障自动转移数据复制与恢复通过分布式部署,OpenClaw可以支撑更大规模的业务场景,提供更稳定可靠的AI助手服务。在下一篇文章中,我们将深入探讨安全与权限管理的精细化策略。

gaoxiang_120的专栏 371

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C语言n阶strassen矩阵乘法,算法重拾之路strassen矩阵乘法

出处:http://blog.youkuaiyun.com/lttree第一章:分治与递归STRASSEN矩阵乘法算法描述:矩阵乘法是线性代数中最常见的问题之一,它在数值计算中有广泛的应用。设A 和 B 是两个n × n矩阵,它们的乘积AB同样是一个n×n矩阵。A和B的乘积矩阵C 中的元素cij定义为:按照这个定义来看,计算A 与 B 矩阵乘法,至少需要 n 次乘法 与 n-1 次加法,所以可以知道,求矩阵C...

weixin_29387991的博客 1552

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

编程问题:Strassen矩阵乘法

但 Strassen 提出了一个解决方案,我们不需要 8 次递归调用,而只需 7 次调用和一些额外的加法和减法运算即可完成。为什么 Strassen 矩阵算法比普通矩阵乘法更好以及如何使用 Strassen 矩阵乘法算法将两个矩阵相乘?一般来说,Strassen(施特拉森)方法在实际应用中并不优选,原因如下。因此,该算法的主要思想是使用分而治之的技术 -Strassen(施特拉森) 乘法的伪代码。上述策略是基本的O(N^3)策略。我们的新矩阵 C 的新象限。使用主定理的时间复杂度。Python代码实现。

新华编程特战队 662

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

斯特拉森(Strassen)算法

斯特拉森算法简介 先套用一下百度百科: 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 C语言描述 #include <stdio.h> #include<malloc.h> int MUL( int** MatrixA, int** MatrixB, int** MatrixResult, int MatrixSize ); int SUB(int** MatrixA, int** MatrixB, int** MatrixResult, int MatrixS

weixin_43736127的博客 1万+

python矩阵乘法分治算法_第四章 分治策略 4.2 矩阵乘法的Strassen算法

packagechap04_Divide_And_Conquer;import static org.junit.Assert.*;importjava.util.Arrays;importorg.junit.Test;/*** 矩阵相乘的算法**@authorxiaojintao**/public classMatrixOperation {/*** 普通的矩阵相乘算法,c=a*b。其中,a、b...

weixin_39550172的博客 270

Strassen方法

n*n的矩阵A和B相乘得到C,n是2的幂; 普通的分治算法,将A、B和C分解为12个n/2 * n/2的矩阵,进行相乘,需要八次n/2 * n/2矩阵相乘 总时间T(n) =θ(1) + 8T(n/2) + θ(n^2),T(1) = θ(1)  总时间T(n) = θ(n^3),与直接计算相同 Strassen方法:通过技巧,将子矩阵的计算转化为仅需要七次n/2

huangwwu11的专栏 538
上一篇: 算法实践篇-求最大子数组
下一篇: 算法实践篇-堆排序
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值