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