Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从随机维数组中查找值的索引 intgetindex(inta[],int大小,int值) { int指数=0; while(索引_C_Algorithm_Math - Fatal编程技术网

C 从随机维数组中查找值的索引 intgetindex(inta[],int大小,int值) { int指数=0; while(索引

C 从随机维数组中查找值的索引 intgetindex(inta[],int大小,int值) { int指数=0; while(索引,c,algorithm,math,C,Algorithm,Math,下面是一个返回数组中某个值的索引的方法。我想有一个方法,可以对任何维度执行此操作。我怎样才能使它具有普遍性?或者甚至可能吗?您始终可以传递一个指针,指向多维数组的第一个元素以及其中所有元素的数量,即每个维度中大小的乘积。从这里开始,算法就像在一维数组中一样 数组中的元素(也是多维数组中的元素)保证在内存中是连续的 返回值将是单个索引;函数将不知道维度的数量及其大小。调用者必须从找到的元素的“平面”整体索引中重建数组维度中的每个索引;e、 g.对于int-arr[2][5],返回值8将对应于元素a

下面是一个返回数组中某个值的索引的方法。我想有一个方法,可以对任何维度执行此操作。我怎样才能使它具有普遍性?或者甚至可能吗?

您始终可以传递一个指针,指向多维数组的第一个元素以及其中所有元素的数量,即每个维度中大小的乘积。从这里开始,算法就像在一维数组中一样

数组中的元素(也是多维数组中的元素)保证在内存中是连续的

返回值将是单个索引;函数将不知道维度的数量及其大小。调用者必须从找到的元素的“平面”整体索引中重建数组维度中的每个索引;e、 g.对于
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;
}