【问题标题】:number pattern detection in multidimensional array in cc中多维数组中的数字模式检测
【发布时间】:2022-10-06 16:52:00
【问题描述】:

假设我想开发一种模式匹配算法。

输入文件包含\'pattern\' 的尺寸\'模式\' 矩阵本身。

接下来它包含\'match\' 的尺寸\'匹配\' 矩阵本身。

这些矩阵的维度理论上可以范围为无穷.

然而,目标是有一种算法可以做到这一点,当模式维度 < 匹配维度

为了简单起见,让我们说 match_dimensions_max =1000000x1000000

\'match\' 和 \'pattern\' 矩阵两者都只包含0 和 1.

从文件加载到程序以绘制图片的典型简单输入:

\'pattern\' 数组大小:2 X 2

\'pattern\' 数组的内容

|0|1|
|0|0|
-----

\'match\' 数组大小:3 x 5

\'match\' 数组的内容

|0|1|0|1|0|
|0|0|0|0|0|
|1|0|0|0|1|
-----------

在这里,我只需要将 \'pattern\' 数组中的 0 个零匹配到 \'match\' 数组。

|0| |
|0|0|

这是我应该匹配的,1 对正匹配没有意义。 如果你匹配它,你会看到它有四个匹配项

    2x|0|1|       
      |0|0|
    and
    2x|0|0|
      |0|0|

什么是检查这个的有效算法? 对于这个 \'pattern\' 和 \'match\' 数组,我的输出应该是 4

  • 匹配数组 [和模式数组] 中可以包含哪些值?您只显示 0/1。数据是布尔值吗?或者,匹配单元格可以有(例如)0,1,2,3,4,5,...,1000 吗?您使用什么类型的单元格(例如charint 等)?数组维度的限制是什么?模式数组为 2x2。它可以有多大?更重要的是,匹配数组的限制是多少?目前,它是 3x5,但最大/典型值是多少?它的行长(列数)是否可以为 1000000?行值按顺序存储(最有效)。请编辑您的问题(与 cmets 相比)。
  • 因为它只有 0 和 1。这就是为什么
  • 从文件中加载列和行。模式矩阵应小于匹配矩阵。 0 和 1 的矩阵也从文件中加载。没有最大典型数。它是从文件中加载的,无论它是什么。
  • 从文件加载输入应该足以让真正的程序员理解。因此,数据块实际上是输入文件(相对于抽象数组表示)。 “真正的”程序员会编辑问题以提供所要求的答案,因为问题本身并不完整。你想要“高效”。数组值指示是否可以使用位掩码。阵列大小决定了对于大型阵列的更有效算法是否超过了增加的复杂性和设置时间。我问了类型。如果值可能是 1,000,000,000,000,那么我们需要long long
  • 这是真的,它将是long long,但我想说的是让我们忘记这一点,现在想想int。如果您的int 解决方案有效,则long long 可以稍后替换int。这不是一个大的变化,它不会阻止你解决模式匹配的真正问题。

标签: c algorithm


【解决方案1】:
#include "headers/main.h"

int search_arctic_find_match(char **search_image,int search_row,int search_col,
               char **arctic_image,int arctic_row,int arctic_col){
    
    assert(
        search_image != NULL      &&       \
        arctic_image != NULL      &&       \
        search_row < arctic_row   &&       \
        search_col < arctic_col            \
    );

    /* A VARIABLE THAT KEEPS COUNT OF NUMBER OF MATCHES */
    int count = 0;

    /* THESE TWO LOOPS TRAVERSES MATCHABLE BLOCKS OF ARCTIC IMAGE */
    for(int i=0;i+search_row-1<arctic_row;i++) {
        for(int j=0;j+search_col-1<arctic_col;j++) {

            /* SEARCH ROW AND COLUMN INDEX ARE USED TO ITERATE SEARCH IMAGE */
            int search_row_idx = 0;
            int search_col_idx = 0;

            /* FLAG THAT DEFAULTS AT MATCHED AND EQUALS NOT_MATCHED WHEN A DISCREPANCY IS FOUND */
            int flag = MATCHED;

            
            for(int m = i;m < i+search_row;m++) {
                for(int n=j;n< j+search_col;n++) {

                    if(search_image[search_row_idx][search_col_idx]=='0' && arctic_image[m][n]!=search_image[search_row_idx][search_col_idx]) { 
                        /* IF THE CONDITION IS SATISFIED THEN SET THE FLAG = NOT_MATCHED */
                        flag = NOT_MATCHED;
                        /* AT NOT MATCHED BREAK THE LOOP. NO NEED TO CHECK FURTHER */
                        break;
                    }

                    /* INCREMENT SEARCH COLUMN INDEX */ 
                    search_col_idx++;
                }
                /* RESET SEARCH COLUMN INDEX TO 0 */    
                search_col_idx=0;
                /* INCREMENT SEARCH ROW INDEX */
                search_row_idx++;
            }
            /* RESET SEARCH ROW INDEX TO 0 */
            search_row_idx=0;
            /* IF FLAG UNCHANGED INCREMENT COUNT  */
            if(flag==MATCHED) {
                count++;
            }       
        }   
    }
    /* RETURNS NUMBER OF MATCHES  */        
    return count;   
}

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 2015-04-25
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多