行列の中で最大の2次元の行列(要素と最大)を求めます

4456 ワード

一、問題の説明
タイトル35.1つのマトリックスの中で最大の2次元マトリックス(要素と最大)を求めます
例えば:1 2 0 3 4 2 4 4 5 1 1 5 3 0の中で最大は:4 5 5 3要求:(1)アルゴリズムを書く;(2)分析時間の複雑さ;(3)Cでキーコードを書く
 
二、アルゴリズム分析
この問題を解決する方法は簡単です.可能なすべての2 Dマトリクス要素の和を計算し、その中で最大を選択すればいいです.
詳細:元のマトリクスのデータをoriginal_に保存array[][中
1.オリジンを巡るarray,i番目の列とi+1番目の列の値を加算し,別の2次元配列new_に保存するarrayのi列目
2.new_を巡るarray,i行目とi+1行目の値を加算し,new_に値を保存するarrayのi行目でnew_arrayにはすべての2 Dマトリクスの要素と
3.new_を巡るarrayは,最大値とそれに対応する行列を探し出し,要素と最大の2次元行列を得ることができる.
このアルゴリズムの時間的複雑さと空間的複雑さはいずれもO(mn)であり,m行n列の元の対戦に対して
 
三、ソースコード
#include <stdio.h>
#include <stdlib.h>

void display_array(int **array, int row, int col);
void max_2order_sqare(int **array, int row, int col, int max_sub_array[2][2]);
void **malloc_array(int row, int col, int size);

void max_2order_sqare(int **array, int row, int col, int max_sub_array[2][2])
{
    int result_row, result_col;//               
	int **new_array = (int **)malloc_array(row,col-1,sizeof(int));//        ,row col-1 
    int i, j;
	int max;//          
    
	//             :     i   i+1    ,   new_array  i  , new_array      
    for(i = 0; i < row; i ++)
    {
        for(j = 0; j < col - 1; j ++)
        {
			new_array[i][j] = *((int *)array + i*col +j) + *((int *)array + i*col +j + 1);
			//                ,      array[i][j]           
        }
    }
    
	//             [0][0]--[1][1]
    max = new_array[0][0] + new_array[1][0];
    result_row = 0;
    result_col = 0;
    
	/*
	** new_array        :new_array  i   i+1    ,   new_array  i  , new_array       
    **           ,   new_array               ,                
	*/
	for(i = 0; i < row - 1; i ++)
    {
        for(j = 0; j < col - 1; j ++)
        {
            new_array[i][j] = new_array[i][j] + new_array[i+1][j];
            if(new_array[i][j] > max)
            {
                max = new_array[i][j];
                result_row = i;
                result_col = j;
            }
        }
    }
	
	//display_array((int **)new_array,2,4);
	display_array((int **)(&new_array[0][0]),row-1,col-1);//            

	//              ,       max_sub_array 
	max_sub_array[0][0] = *((int *)array + result_row*col + result_col);
	max_sub_array[0][1] = *((int *)array + result_row*col + result_col + 1);
	max_sub_array[1][0] = *((int *)array + (result_row + 1)* col + result_col);
	max_sub_array[1][1] = *((int *)array + (result_row + 1)* col + result_col + 1);

	free(new_array);//         ,     !!!
}

/*
**  :         ,                    ,           
**  :       (                ),          
**  : 
*/
void display_array(int **array, int row, int col)
{
    int i, j;

    printf("Here is this %d * %d array's numbers:
",row,col); for(i = 0; i < row; i ++) { for(j = 0; j < col; j ++) { printf(" %d",*((int *)array + i*col +j));// array[i][j] } printf("
"); } } /* ** : , : , , col ** : 、 、 ** : , , array[i][j] */ void **malloc_array(int row, int col, int size) { int j; int indexSize; void **array = NULL; char *dataStart = NULL; indexSize = col * sizeof(void *);// :col array = (void **)malloc(indexSize + size * row * col);// + dataStart = (char *)array + indexSize; for(j = 0; j < row; j ++) { array[j] = dataStart + size * col * j; } return array; } int main() { int max_sub_array[2][2] = {0}; //2 2 : int original_array[3][5] = {{1,2,0,3,4},{2,3,4,5,1},{1,1,5,3,0}};// : display_array((int **)original_array,3,5);// max_2order_sqare((int **)original_array,3,5,max_sub_array);// , max_sub_array display_array((int **)max_sub_array,2,2);// return 0; } /* */

四、まとめ
この問題は簡単だと思っていたが,アルゴリズムは簡単だったが,コードを書くときに二次元配列とポインタに悩まされた.動的に2 D配列を作成するのではなく、固定次元の2 D配列を使用すると簡単です.ポインタ式C言語の難点も分かるが、2次元配列がポインタと一緒になるとは思わなかった.
主な困難は2つあり、1つは2次元配列の要素を出力するサブ関数を書くときに、2次元配列を渡すときに常に2次元の大きさを固定する必要があることを発見したが、そうすれば、このサブ関数の意味は本当に小さすぎる.だから、配列ポインタを渡して、行と列に渡してほしいです.そうすれば、この関数は使いやすいです.ネット上で1篇の文章を探して、2次元のポインタでこの問題を解決して、自分でもよく分からないで、一応このように使って、後で更に深く研究します.もう一つの問題は2次元配列を動的に作成することであり,ネット上で見つけた方法でもあるが,原理は確かに分からないので,後で検討しよう.