C 从随机维数组中查找值的索引 intgetindex(inta[],int大小,int值) { int指数=0; while(索引
下面是一个返回数组中某个值的索引的方法。我想有一个方法,可以对任何维度执行此操作。我怎样才能使它具有普遍性?或者甚至可能吗?您始终可以传递一个指针,指向多维数组的第一个元素以及其中所有元素的数量,即每个维度中大小的乘积。从这里开始,算法就像在一维数组中一样 数组中的元素(也是多维数组中的元素)保证在内存中是连续的 返回值将是单个索引;函数将不知道维度的数量及其大小。调用者必须从找到的元素的“平面”整体索引中重建数组维度中的每个索引;e、 g.对于C 从随机维数组中查找值的索引 intgetindex(inta[],int大小,int值) { int指数=0; while(索引,c,algorithm,math,C,Algorithm,Math,下面是一个返回数组中某个值的索引的方法。我想有一个方法,可以对任何维度执行此操作。我怎样才能使它具有普遍性?或者甚至可能吗?您始终可以传递一个指针,指向多维数组的第一个元素以及其中所有元素的数量,即每个维度中大小的乘积。从这里开始,算法就像在一维数组中一样 数组中的元素(也是多维数组中的元素)保证在内存中是连续的 返回值将是单个索引;函数将不知道维度的数量及其大小。调用者必须从找到的元素的“平面”整体索引中重建数组维度中的每个索引;e、 g.对于int-arr[2][5],返回值8将对应于元素a
int-arr[2][5]
,返回值8将对应于元素arr[1][2]
。“平面”索引和多维索引元组之间的关系(当然)是双射的
int getIndex(int a[], int size, int value)
{
int index = 0;
while (index < size && a[index] != value)
{
++index;
}
return (index == size ? -1 : index);
}
数组只不过是连续存储在内存中的一组元素(适用于任何维度)。这意味着您只能将第一个元素传递给函数,当然要跟踪数组大小。这样,您就可以只通过一个循环遍历所有元素,而不依赖于数组维度 填充多维数组的示例:
$ gcc -Wall -o multi-arr multi-arr.c && ./multi-arr
found a 1 at [1][2]
int矩阵[50][100];
int*iptr=NULL;
int i=0;
//将第一个矩阵设置为:
//第0行:0、1、2、…、99
//第1行:100、110、120、…、199
// ...
iptr=&(矩阵[0][0]);
对于(i=0;i<50*100;i++)
{
*iptr=i;
iptr++;
}
为什么不直接返回所需元素的地址
int matrix[50][100];
int *iptr = NULL;
int i = 0;
// sets first matrix to:
// row 0: 0, 1, 2, ..., 99
// row 1: 100, 110, 120, ..., 199
// ...
iptr = &(matrix[0][0]);
for(i=0; i < 50*100; i++)
{
*iptr = i;
iptr++;
}
int*getIndex(int a[],int size,int value)
{
对于(int i=0;i
您可以拥有任何想要的多维数组,这不再重要。通用版。可以使用任意数量的维度运行。将一维数组视为多维空间,以便可以以不同的方式查看相同的内存区域 完整的例子可以找到 输出: dim1[10] dim1[1]dim2[4] dim1[2]dim2[1]dim3[0]
dim1[1]dim2[0]dim3[1]dim4[0]你能说得更清楚些吗?你可以将任何大小的数组传递给这个方法,只要你将大小更改为大小类型,那么“维度”是什么意思?你想在
整数数组[10][10]
中找到索引i
和j
“对于任何数量的维度”不是“对于任何维度”我认为int[][]矩阵=new int[50][100];
可能是C#语法。我来自C#world,我的坏:)只是一个小缺陷:如果值位于索引0,那么您仍将打印“未找到”"!+1为简单起见。但是,我建议您检查索引!=-1
因为否则你可能会得到Daan指出的错误结果。@Dennis von Eich请检查我的答案以获得更一般的解决方案。
int matrix[50][100];
int *iptr = NULL;
int i = 0;
// sets first matrix to:
// row 0: 0, 1, 2, ..., 99
// row 1: 100, 110, 120, ..., 199
// ...
iptr = &(matrix[0][0]);
for(i=0; i < 50*100; i++)
{
*iptr = i;
iptr++;
}
int *getIndex(int a[], int size, int value)
{
for (int i = 0; i < size; ++i) {
if (a[i] == value) {
return (a + i);
}
}
return (NULL);
}
#include <stdio.h>
#include <stdint.h>
int get_idx(int a[], uint32_t dims[], uint32_t dims_n, int value)
{
size_t size;
size_t index = 0, n;
if (dims[0] < 1) return -1;
size = 1;
n = dims_n;
while (n)
size *= dims[--n];
if (dims_n > size) return -1;
while (index < size && a[index] != value)
{
++index;
}
if (index == size)
return -1;
n = 0;
while (n < dims_n)
{
size /= dims[n];
dims[n] = index / size;
index = index % size;
++n;
}
return 0;
}
int
main(void) {
int res;
uint32_t dims[5];
int a[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
dims[0] = 12;
res = get_idx(a, dims, 1, 10);
if (res == -1) goto fail;
printf("dim1 [%u]\n", dims[0]);
dims[0] = 2;
dims[1] = 6;
res = get_idx(a, dims, 2, 10);
if (res == -1) goto fail;
printf("dim1 [%u] dim2 [%u]\n", dims[0], dims[1]);
dims[0] = 3;
dims[1] = 2;
dims[2] = 2;
res = get_idx(a, dims, 3, 10);
if (res == -1) goto fail;
printf("dim1 [%u] dim2 [%u] dim3 [%u]\n", dims[0], dims[1], dims[2]);
dims[0] = 2;
dims[1] = 2;
dims[2] = 2;
dims[3] = 2;
res = get_idx(a, dims, 4, 10);
if (res == -1) goto fail;
printf("dim1 [%u] dim2 [%u] dim3 [%u] dim4 [%u]\n",
dims[0], dims[1], dims[2], dims[3]);
return 0;
fail:
printf("Not found\n");
return -1;
}