我有两个容器:一个二维NxN矩阵和一个1维阵列,它是转换后的1D"版本"矩阵的(对于5x5数组,我将有一个具有相同值的25个元素数组)。我想实现一个查询函数,它将2D坐标作为参数,但将在等效的1D数组上工作。
为了保持算法效率严格非二次,我想只访问数组而不是矩阵。
我已经检查了其他问题,但他们都谈到通过嵌套for循环将整个矩阵转换为数组。我不想这样做,因为这需要两次运行。相反,我希望通过查询函数/方法对给定坐标进行转换。换句话说,对于给定数量的N列/行:
transpose(int i, int j) {
int result;
result = i * N + j;
return result;
}
这是我使用的公式,但它不正确。例如,如果我想访问{5,5}位置的元素,结果将是5 * 5 + 5 = 30,这大于25(这将是5x5矩阵的元素总数)。
提前致谢。
答案 0 :(得分:2)
如果您有<div class="center-block">
<div class="btn-group">
<label class="btn btn-success vertical-align" ng-model="checkModel.left" btn-checkbox>1</label>
<label class="btn btn-success vertical-align" ng-model="checkModel.middle" btn-checkbox>2
<span class="hidden-xs">and</span> Best <span class="hidden-xs">and all</span></label>
<label class="btn btn-success vertical-align" ng-model="checkModel.left" btn-checkbox>3</label>
<label class="btn btn-success vertical-align" ng-model="checkModel.middle" btn-checkbox>4</label>
<label class="btn btn-success vertical-align" ng-model="checkModel.left" btn-checkbox>5</label>
</div>
</div>
数组和2d
数组具有相同的元素,那么以下内容将为真
1d
我从你的帖子中假设你已经从2d中创建了一个1d数组。
注意 2d[i][j]=1d[i*number_of_columns+j]
和i
是索引和记忆索引从j
开始
编辑:如果您要访问0
处的元素(作为最后一个元素),则表示您的数组的顺序为[5][5]
而不是6 by 6
。因此,您的1d数组将具有{{ 1}}元素,而不是5 by 5
。
答案 1 :(得分:1)
您可以使用deepToString()
方法将2D数组输出到String。这样可以更轻松地执行sort()
等操作。
答案 2 :(得分:0)
假设声明的int mat2d[m][n];
包含m
行和n
列,您可以将其转换为
int * mat1d = new int[m * n];
int k = 0;
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++i)
mat1d[k++] = mat2d[i][j];
答案 3 :(得分:0)
如果您只想在1D和2D坐标之间进行转换,请自行完成并从中创建函数:
const int width = 10;
// from 1D coordinate to 2D coordinate
int coord_1d = 25;
int coord_x = coord_1d % width;
int coord_y = coord_1d / width;
// from 2D coordinate to 1D coordinate
coord_1d = coord_x + coord_y * width;
答案 4 :(得分:0)
你的问题很混乱,你说你不想要嵌套循环,这里只是一个循环转换
int[][] a={
{1,2,3,4,5,6},
{4,5,6,7,8,9},
{7,8,9,1,2,3},
{1,2,3,4,5,6}
};
int[]b=new int[a.length*a[0].length];
int x=0;
for(int i=0, j=0;i<a.length&&j<a[0].length;i=(j==a[0].length-1?i+1:i),j=(j+1)%a[0].length)
b[x++]=a[i][j];
System.out.println(Arrays.toString(b));
如果您希望转换基于坐标,通过将for循环中的i
和j
值更改为此类坐标,您只能将数组转换为矩阵的子集