如何找到多维数组的模式?

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 &lt; 3 * 3; i++) v[i] = a[i % 3][i / 3]; @NoobCoder 不需要任何数学运算的更通用的解决方案是k = 0; for(i=0;i&lt;rows;i++) for(j=0;j&lt;cols;j++) v[k++] = a[i][j]; @NoobCoder 我已经更新了非矩形矩阵的答案。 @user3386109 for (i = 0; i &lt; rows * cols; i++) v[i] = a[i % rows][i / rows]; 也适用于一般情况,但初学者可能更容易理解您的方法。 如果以后不需要矩阵a,可以跳过二维到一维的转换,将代码中的v替换为a。之所以可以这样做,是因为多维数组连续存储在内存中,请参阅this 讨论。在这种情况下,基本上,在多维数组中查找模式与在简单数组中查找模式相同。

以上是关于如何找到多维数组的模式?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的多维数组长度

在 Swift 中通过计数从多维数组中找到最大的数组

如何有效地找到 NumPy 中平滑多维数组的局部最小值?

如何从 PHP 中的多维关联数组中删除项目

如何反转多维数组中的重复值

如何从 mySQL 和 PHP 检索结果为多维数组?