`

数据结构应用回顾之杨氏矩阵

 
阅读更多

Young氏矩阵

   一个m*n的Young氏矩阵是一个m*n的矩阵,其中每一行的数据都从左到右排序,每一列的数据都从上到下排序。Young氏矩阵中会有一些∞数据项,表示不存在的元素。Young氏矩阵可以存放m*n个有限的数。常见Young氏矩阵的相关操作包括:

1、向一个不满的Young氏矩阵中插入一个元素x,并保持Young氏矩阵的性质

2、根据一个数组,构建一个m*n的Young氏矩阵

3、移除Young氏矩阵中最小的元素,并保持Young氏矩阵的性质

4、判断Young氏矩阵为空或满

5、使用n*n的Young氏矩阵来对n^2个数进行排序,运行时间复杂度为O(n^3)

6、在O(m+n)的时间复杂度内,找出Young氏矩阵中等于x的所有坐标

 

 

package com.fangming.dataStructure.BiTree;

public class YoungMatrix {

	public static void main(String[] args) {
		int[][] youngMatrix = createYoungMatrix(new int[] { 7, 2, 1, 4, 7, 8,
				9, 0, 3, 2, 1, 3, 5, 7, 8, 9 }, 4, 4);
		//removeMin(youngMatrix,4,4,0, 0);
		//removeMin(youngMatrix);
		//print(youngMatrix);
		//sort(youngMatrix);
		findAllDataNoRecurtion(youngMatrix,7);
	}
	
	//非递归方式移除最小的值
	public static void removeMin(int [][] youngMatrix){
		youngMatrix[0][0] = Integer.MAX_VALUE;
		YoungMatrixityDown(youngMatrix,0,0);
	}
	
	//杨氏矩阵的排序输出
	public static void sort(int [][] youngMatrix){
		while(youngMatrix[0][0] != Integer.MAX_VALUE) {
			System.out.print(youngMatrix[0][0] + ",");
			removeMin(youngMatrix);
		}
	}
	
	public static void findData(int [][] youngMatrix,int x){
		findData(youngMatrix,youngMatrix.length-1,0 ,x );
	}
	
	public static void findDataNoRecurtion(int [][] youngMatrix,int x){
		int i = youngMatrix.length-1;
		int j = 0;
		while(i >= 0 && j < youngMatrix[0].length ){
			if (youngMatrix[i][j] == x){
				System.out.println( "(" + i + "," + j + ")");
				return;
			}else if (x < youngMatrix[i][j]){
				i--;
			}else {
				j++;
			}
		}
	}
	
	public static void findAllDataNoRecurtion(int [][] youngMatrix,int x){
		int i = youngMatrix.length-1;
		int j = 0;
		while(i >= 0 && j < youngMatrix[0].length ){
			if (youngMatrix[i][j] == x){
				System.out.println( "(" + i + "," + j + ")");
				//往回找
				for(int k = i-1 ; k >=0 ; --k ){
					if (youngMatrix[k][j] == x){
						System.out.println( "(" + k + "," + j + ")");
					}
				}
				j++;
			}else if (x < youngMatrix[i][j]){
				i--;
			}else {
				j++;
			}
		}
	}
	
	//找出杨氏矩阵中存在的元素x,并输出x,y坐标
	public static void findData(int [][] youngMatrix,int m,int n ,int x){
		if (m >= 0 && n <youngMatrix.length){
			if (youngMatrix[m][n] == x){
				System.out.println( "(" + m + "," + n + ")");
				return;
			}else if (x < youngMatrix[m][n] ){
				findData(youngMatrix,m-1,n,x);
			}else {
				findData(youngMatrix,m,n + 1,x);
			}
		}
	}
	
	// 递归方式移除最小的值
	public static void removeMin(int[][] youngMatrix,int m,int n, int x, int y) {
		if (y + 1 < n && x+1 < m
				&& youngMatrix[x][y + 1] < youngMatrix[x + 1][y]) {
			youngMatrix[x][y] = youngMatrix[x][y + 1];
			removeMin(youngMatrix, m,n,x, y + 1);
		} else if (y + 1 < youngMatrix[0].length && x+1 < youngMatrix.length
				&& youngMatrix[x][y + 1] >= youngMatrix[x + 1][y]) {
			youngMatrix[x][y] = youngMatrix[x + 1][y];
			removeMin(youngMatrix,m,n, x + 1, y);
		} 
		if (x + 1 >= m) {
			for (int j = y; j < n - 1; ++j) {
				if (youngMatrix[x][j] != Integer.MAX_VALUE) {
					youngMatrix[x][j] = youngMatrix[x][j + 1];
				}
			}
			youngMatrix[x][n - 1] = Integer.MAX_VALUE;
		} 
		if (y + 1 >= n ) {
			for (int j = x; j < m - 1; ++j) {
				if (youngMatrix[j][y] != Integer.MAX_VALUE) {
					youngMatrix[j][y] = youngMatrix[j + 1][y];
				}
			}
			youngMatrix[m - 1][y] = Integer.MAX_VALUE;
		}
	}

	// 维持杨氏矩阵的性质
	public static void YoungMatrixityDown(int[][] data, int x, int y) {
		int smallestX = x;
		int smallestY = y;
		// 横坐标
		if (y + 1 < data[0].length && data[x][y + 1] < data[x][y]) {
			smallestY = y + 1;
			smallestX = x;
		}
		// 纵坐标
		if (x + 1 < data.length && data[x + 1][y] < data[smallestX][smallestY]) {
			smallestX = x + 1;
			smallestY = y;
		}
		if (x != smallestX || y != smallestY) {
			int temp = data[x][y];
			data[x][y] = data[smallestX][smallestY];
			data[smallestX][smallestY] = temp;
			YoungMatrixityDown(data, smallestX, smallestY);
		}
	}

	// 维持杨氏矩阵的性质
	public static void YoungMatrixityUp(int[][] data, int x, int y) {
		int smallestX = x;
		int smallestY = y;
		// 横坐标
		if (y - 1 >= 0 && data[x][y - 1] > data[x][y]) {
			smallestY = y - 1;
			smallestX = x;
		}
		// 纵坐标
		if (x - 1 >= 0 && data[x - 1][y] > data[smallestX][smallestY]) {
			smallestX = x - 1;
			smallestY = y;
		}
		if (x != smallestX || y != smallestY) {
			int temp = data[x][y];
			data[x][y] = data[smallestX][smallestY];
			data[smallestX][smallestY] = temp;
			YoungMatrixityUp(data, smallestX, smallestY);
		}
	}

	// 根据数组生成杨氏矩阵
	public static int[][] createYoungMatrix(int[] data, int m, int n) {
		int[][] result = new int[m][n];
		int length = data.length;
		assert length <= m * n;
		//init 
		for (int i = 0; i < m; ++i) {
			for (int j = 0; j < n; ++j) {
				result[i][j] = Integer.MAX_VALUE;
			}
		}
		for (int i = 0; i < m; ++i) {
			for (int j = 0; j < n; ++j) {
				if (i * n + j < length) {
					result[i][j] = data[i * n + j];
				}
				YoungMatrixityUp(result, i, j);
			}
		}
		print(result);
		return result;
	}

	private static void print(int[][] data) {
		int m = data.length;
		int n = data[0].length;
		for (int i = 0; i < m; ++i) {
			for (int j = 0; j < n; ++j) {
				System.out.print(data[i][j]);
				System.out.print(" ");
			}
			System.out.println("");
		}
	}
}

 

 

 

 

分享到:
评论

相关推荐

    ACM必会-杨氏矩阵题解分析.zip

    ACM必会-杨氏矩阵题解分析.zip 是一个压缩文件,包含了关于杨氏矩阵问题的详细题解和代码实现。该资源旨在帮助参加ACM竞赛的选手更好地理解杨氏矩阵问题,并提供相应的解决方案和代码示例。 内容概要: 该压缩文件...

    python实现杨氏矩阵查找

    本文实例为大家分享了python实现杨氏矩阵查找的具体代码,供大家参考,具体内容如下 问题描述: 在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数...

    金属丝杨氏模量实验的数据处理.pdf

    杨氏模量的定义为单位横截面上所受的力(应力)与单位长度上的伸长量(应变)之比值。实验中,当铁丝两端施加外力时,铁丝会发生形变,测量其伸长量和对应的应力,就可以计算出杨氏模量。 实验仪器包括三脚底座、...

    杨氏矩阵查找的JS代码

    杨氏矩阵查找是一种在二维矩阵中查找特定数值的算法,其特点是将数字按照螺旋状顺序存储在矩阵中。这种查找方法适用于对角线方向上的数值查找,尤其在矩阵较大时,能够提供一定的优化。在给出的JS代码中,实现了一个...

    动态法测量杨氏模量实验的数据处理.pdf

    "动态法测量杨氏模量实验的数据处理" 在材料科学领域中,杨氏模量是一个重要的力学参数,用于描述固体材料的弹性性质。测量杨氏模量有多种方法,包括静态法、动态法和波传播法等,其中动态法适用于各种脆性材料的...

    杨氏模量实验报告数据.doc

    通过杨氏模量实验报告数据,我们可以掌握杨氏模量的测定方法和原理,并了解杨氏模量在材料科学中的应用。实验结果表明,杨氏模量是材料的重要物理量,对材料的机械性能有着重要的影响。 杨氏模量实验报告数据是大学...

    物理应用基于matlab全矩阵数据TFM成像【含Matlab源码 1940期】.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,尽我所能,为你服务; 1、代码压缩包内容 主函数:copper_wire_example.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若...

    复合层压材料性能[杨氏模量、刚度矩阵、强度和失效准则应用]_python_代码_下载

    使用纤维和基体或给定的数据来定义复合层,然后铺设层压板。 使用经典层压理论计算每一层的应力和应变分布。 选择合适的失效标准来检查给定负载下层压板的强度。 显示准确的计算结果信息,显示应力应变分布图;显示...

    共振法测量金属杨氏模量的数据处理.pdf

    通过上述实验原理和结果分析,我们可以了解到共振法在测量金属杨氏模量方面的具体应用,以及Matlab在实验数据处理中的重要作用。同时,这些知识点也为材料力学性质的研究提供了基础支持,对于现代工业经济和信息化中...

    Origin软件在杨氏模量实验数据处理中的应用.pdf

    杨氏模量是评估材料力学性质的关键参数,在工程技术应用中占据重要地位。杨氏模量的测量方法多样,包括但不限于拉伸法、干涉条纹法和动态法等,这些方法通常结合了力学和光学的知识。随着科技的发展,测量精度越来越...

    COMSOL模型+matlab外部函数与参数化扫描应用案例+随机杨氏模量对结构内应力影响

    *【重要:请更改Fe_sigma值,以产生分布,默认是零】*在结构力学中,常常假定材料是均质的,单一域内使用相同材料属性来做相应的结构分析。然而,实际材料很难做到完全均质。在这个案例中,将考察对一个平板简单拉伸...

    用弯曲法测杨氏模量实验报告

    实验报告——用弯曲法测杨氏模量 实验目的: 1. 掌握长度测量的基本技巧,学习如何使用游标卡尺和千分尺等工具。 2. 熟悉霍尔位置传感器的工作原理和特性。 3. 利用弯曲法测量铁的杨氏模量。 4. 学习数据处理方法,...

    动态杨氏模量数据处理

    大学物理实验杨氏模量的处理数据模板。。。。

    复合材料刚度矩阵计算,计算单元刚度矩阵,matlab

    在复合材料领域,刚度矩阵是理解材料性能和结构响应的关键。这个MATLAB程序提供了计算各向异性复合材料刚度矩阵的功能,对于学习和研究复合材料的初学者来说,这是一个非常实用的工具。各向异性是指材料的力学性能在...

    Origin在共振法测量固体材料的杨氏模量实验数据处理中的应用.pdf

    Origin 在共振法测量固体材料的杨氏模量实验数据处理中的应用 在共振法测量固体材料的杨氏模量实验中,数据处理是非常重要的一步骤。Origin 软件的应用可以使数据处理变得更加简洁、高效和精确。本文将介绍 Origin ...

    静态拉伸法测定金属丝杨氏模量实验的最佳条件与数据处理

    ### 静态拉伸法测定金属丝杨氏模量实验的最佳条件与数据处理 #### 知识点一:静态拉伸法与杨氏模量测量原理 静态拉伸法是一种常用的物理实验方法,用于测定材料的杨氏模量(Young's modulus),即衡量材料在弹性...

    杨氏弹性模量数据处理

    杨氏弹性模量数据处理,处理杨氏弹性模量的工具,一个小程序

    空间四面体单元刚度矩阵的Matlab向量化集成.pdf

    总结来说,这篇文章的核心知识点涉及空间四面体单元的应用、刚度矩阵的计算、向量化编程的实现方法,以及Matlab编程在结构分析中的应用。通过这些知识点,研究人员和工程师可以设计出更加高效的计算框架,对复杂的...

    基于声卡和Matlab的数据采集系统在杨氏模量测量中的应用.pdf

    标题和描述中提到的知识点主要涉及声卡和Matlab软件在数据采集系统中的应用,特别是这种系统在物理实验中测量杨氏模量的应用。杨氏模量是材料力学性能的一个重要参数,它表征了材料抵抗形变的能力。为了详细阐述这些...

Global site tag (gtag.js) - Google Analytics