从随机维数组

时间:2016-02-25 09:31:15

标签: c algorithm math

int getIndex(int a[], int size, int value)
{
    int index = 0;

    while (index < size && a[index] != value)
    {
        ++index;
    }

    return (index == size ? -1 : index);
}

这是一个返回数组内值的索引的方法。我希望有一个方法可以为任何维度执行此操作。我怎样才能让它变得普及?或者甚至可能吗?

4 个答案:

答案 0 :(得分:1)

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

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

返回值是单个索引;该功能不知道尺寸的数量和尺寸。调用者必须从&#34; flat&#34;重新构建每个数组维度中的索引。找到元素的整体指数;例如对于int arr[2][5],返回值8将对应于元素arr[1][2]。 &#34; flat&#34;之间的关系索引和多维索引元组(当然)是双射的。

#include<stdio.h>

#define DIM1 2
#define DIM2 5

int arr[DIM1][DIM2]; // zero-initialized

 // note: for a paramater, int a[] means int *a
int getIndex(int a[], int size, int value)
{
    int index = 0;

    while (index < size && a[index] != value)
    {
        ++index;
    }

    return (index == size ? -1 : index);
}

int main() 
{
    arr[1][2] = 1;

    int index = getIndex(arr[0], DIM1*DIM2, 1);

    if(index >= 0)
    {
        int dim1 = index/DIM2;
        int dim2 = index%DIM2; // modulo resp. remainder

        printf("found a 1 at [%d][%d]\n", dim1, dim2);
    }
    else
    {
        printf("Could not find 1 in arr\n");
    }
    return 0;
}

示例会话:

$ gcc -Wall -o multi-arr multi-arr.c && ./multi-arr
found a 1 at [1][2]

答案 1 :(得分:1)

通用版本。可以使用任意数量的维度运行。将一维数组视为多维空间,以便以不同的方式查看相同的内存区域。

可以找到完整示例here

#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;
}

输出:

dim1 [10]

dim1 [1] dim2 [4]

dim1 [2] dim2 [1] dim3 [0]

dim1 [1] dim2 [0] dim3 [1] dim4 [0]

答案 2 :(得分:0)

数组只不过是连续存储在内存中的一堆元素(适用于任何维度)。这意味着您只能将第一个元素传递给函数,同时保持跟踪数组大小。这样,您可以只通过一个循环迭代所有元素,而不依赖于数组维度

填写多维数组的示例:

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++;  
}

答案 3 :(得分:0)

为什么不直接返回所需元素的地址?

int *getIndex(int a[], int size, int value)
{
  for (int i = 0; i < size; ++i) {
    if (a[i] == value) {
      return (a + i);
    }
  }
  return (NULL);
}

你可以拥有你想要的任何多维数组阵列,它不再重要。