Страница 1 из 1

Упорядочить столбцы матрицы по неубыванию характеристик.

Добавлено: 30 мар 2014, 20:52
manichka2009
Дана целочисленная матрица A(M,N). Характеристикой j –го столбца матрицы назовем значение элемента, который встречается максимальное число раз в j–ом столбце. Если таких элементов в строке несколько, то взять наименьший из них. Упорядочить столбцы матрицы по неубыванию характеристик. В программе предусмотреть динамическое выделение памяти.

У меня есть написанный код к этой задаче, только в ней не выделена динамическая память.

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand( time( NULL ) );
    int a[100][100], b[100][2], N, M, i, j, t, k;
    printf("M= ");
    scanf("%d", &M);
    printf("N= ");
    scanf("%d", &N);
    printf("Ishodn matr:\n");
    for(i=0; i<M; i++)
    {
        for(j=0; j<N; j++)
        {
            a[i][j]=rand()%7;
            printf("%2d", a[i][j]);
        }
        printf("\n");
    }
    for(j=0; j<N; j++)
    {
        b[j][0]=a[0][j];
        b[j][1]=1;
        for(i=0; i<M; i++)
        {
            t=0;
            for(k=0; k<M; k++)
                if(a[i][j]==a[k][j])
                    t++;
            if(t>b[j][1] || (t==b[j][1] && b[j][0]>a[i][j]))
            {
                b[j][1]=t; b[j][0]=a[i][j];
            }
        }
    }
    for(j=0; j<N-1; j++)
    {
        t=j;
        for(i=j; i<N; i++)
            if(b[i][0]<b[t][0])
                t=i;
        for(i=0; i<M; i++)
        {
            k=a[i][j];
            a[i][j]=a[i][t];
            a[i][t]=k;
        }
        k=b[j][0]; b[j][0]=b[t][0]; b[t][0]=k;
    }
    printf("Preobr matr:\n");
    for(i=0; i<M; i++)
    {
        for(j=0; j<N; j++)
            printf("%2d", a[i][j]);
        printf("\n");
    }
    return 0;
}

Re: Упорядочить столбцы матрицы по неубыванию характеристик.

Добавлено: 31 мар 2014, 17:11
Romeo
Если мы будем менять вот такое выделеление памяти на стеке:

Код: Выделить всё

int arr[N][M];
на динамическое выделение памяти, то это будет выглядеть следующим образом:

Код: Выделить всё

int** arr = new int * [N];
for (int i = 0; i < N; ++i)
   arr[i] = new int [M];
В таком случае следует не забыть удалить динамески выделенную память перед завершением программы:

Код: Выделить всё

for (int i = 0; i < N; ++i)
   delete [] arr[i];
delete [] arr;

Re: Упорядочить столбцы матрицы по неубыванию характеристик.

Добавлено: 03 апр 2014, 16:47
somewhere
А все таки не очень хорошо реализован двумерный массив. По хорошему это должен быть один дескриптор памяти для одного адресного простанства N*M элементов. А здесь получается N + 1 дескриптор. Обращение к элементам такого массива будет медленным, особенно, если обработка будет выполнятся по столбцам.

Re: Упорядочить столбцы матрицы по неубыванию характеристик.

Добавлено: 03 апр 2014, 19:20
Romeo
Вопрос был в том, как динамически создать двумерный массив, и я на него ответил.

Действительно, никто не мешает линеаризиваровать матрицу в одномерный массив N*M элементов. Единственное, что необходимо, это помнить о преобразовании индексов: [j] <==> i*M + j. Такой подход хорош для статичных данных. Он и память экономит, и время выделения памяти. Однако, есть задачи, на которых он будет показывать неудовлетворительные результаты. Например, для обмена двух строк матрицы в первом случае достаточно обменять поинтеры на строки матрицы, а во втором случае придётся произвести deep copy данных в цикле. Если же нам необходимо, чтобы наш двумерный массив умел менять размеры отдельных(!) строк, то его линеаризация и вовсе будет крайне затратна и неудобна.

Все эти детали, а так же множество других ещё неупомянутых здесь, несомненно важны, но не следует о них думать, когда только начал изучать синтаксис своего первого языка и пишешь свой первый Hello World.