如何找到多维数组的模式?
Posted
技术标签:
【中文标题】如何找到多维数组的模式?【英文标题】:How to find mode of a multidimensional array? 【发布时间】:2020-07-25 03:56:58 【问题描述】:如果我有一个多维数组,比如a[i][j]
,那么找到数组元素模式最合理的方法是什么?
【问题讨论】:
“模式”-> 模数是什么意思?或类型?和 C 还是 C++? 转换为一维数组。种类。计数。 多维数组不就是一维数组的集合吗?查找单个数组的模式并将它们存储在向量中。该向量中的最大值可以作为众数。 【参考方案1】:要找到矩阵的值的模式:首先,您需要将二维数组转换为一维数组;第二,对数组的值进行排序;然后,确定数组中出现频率较高(连续)的值:
#include <stdio.h>
#include <stdlib.h>
static int sort(const void* xx, const void* yy)
int x = *((int*)xx);
int y = *((int*)yy);
if (x < y)
return -1;
if (x > y)
return +1;
return 0;
int main(void)
int i, freq, max_freq, mode;
int a[4][3] = 1, 4, 5 , 3, 2, 4 , 5, 5, 2 , 4, 4, 2 ;
int v[4 * 3];
// 1. Convert 2D to 1D
for (i = 0; i < 4 * 3; i++)
v[i] = a[i % 4][i / 4];
// 2. Sort the array
qsort(v, 4 * 3, sizeof(int), sort);
for (i = 1, freq = 1, max_freq = 0; i < 4 * 3; i++)
if (v[i - 1] == v[i])
// 3. If consecutive values are equal,
// increment by 1 the frequency of the value
freq++;
if (freq > max_freq)
// 3. If the value has a higher frequency than
// the saved one, save the current value.
max_freq = freq;
mode = v[i];
else
// 3. Since it is a new value, restart the frequency count.
freq = 1;
printf("Mode %d\n", mode);
return 0;
这会返回:
Mode 4
【讨论】:
这也适用于矩形矩阵吗?// 1. Convert 2D to 1D for (i = 0; i < 3 * 3; i++) v[i] = a[i % 3][i / 3];
@NoobCoder 不需要任何数学运算的更通用的解决方案是k = 0; for(i=0;i<rows;i++) for(j=0;j<cols;j++) v[k++] = a[i][j];
@NoobCoder 我已经更新了非矩形矩阵的答案。
@user3386109 for (i = 0; i < rows * cols; i++) v[i] = a[i % rows][i / rows];
也适用于一般情况,但初学者可能更容易理解您的方法。
如果以后不需要矩阵a
,可以跳过二维到一维的转换,将代码中的v
替换为a
。之所以可以这样做,是因为多维数组连续存储在内存中,请参阅this 讨论。在这种情况下,基本上,在多维数组中查找模式与在简单数组中查找模式相同。以上是关于如何找到多维数组的模式?的主要内容,如果未能解决你的问题,请参考以下文章