Re: Срочно нужна помощь с двумя задачками по С++
От: Кодт Россия  
Дата: 30.03.07 09:26
Оценка:
Здравствуйте, z1z, Вы писали:

z1z>Привет всем...у меня Огромная проблемища....нивкакую не получаются задачки...

z1z>помогите пожалуйста разобраться с тем как решать вот эту задачку:
z1z>С помощью динамических переменных реализуйте вещественную матрицу размером 200 x 100. Каждому элементу матрицы присвойте случайное значение из заданного диапазона. Отсортируйте элементы в строках и строки по значению первого элемента. Выдайте на экран первую подматрицу размером 20 x 10.

Тут 3 слоя: алгоритмы, структуры данных и собственно кодирование.

По алгоритмам:

Лобовое решение — это представить матрицу как массив строк, где каждая строка — указатель на массив.
Отсортировать каждую строку независимо.
Сортировка строк сведётся к сортировке укзателей по хитрому предикату (по первому элементу).
Правда, при этом мы совершим кучу лишней работы...

Следующие улучшения: не полностью сортировать каждую строку и массив строк, а брать первые 20 и первые 10 порядковых статистик, соответственно. Оставшиеся хвосты из 180 элементов и 90 строк сортировать необязательно.

Наконец, ещё более продвинутое решение — это в каждой строке найти первую порядковую статистику (т.е. минимальный элемент), затем отсортировать массив строк, и только затем сортировать каждую из избранных строк.

По структурам данных:

Мне кажется, что если писать на С, то удобнее всего хранить матрицу в линейном массиве построчно. Подмассивы представляют строки.
Отдельно взять массив дескрипторов строк (в самом простом виде — указатели на начала строк в этом линейном массиве).
На С++ можно и массив массивов сделать.

По кодированию:

Если пишешь на C++, то в твоём распоряжении — контейнеры и алгоритмы STL.
Тебе потребуются vector для хранения данных, sort или partial_sort для частичной сортировки. Ну и рукописные функции кое-какие.

Если на Си — то qsort.



Ниже — эскиз кода на С++, изрядно задействующий алгоритмы STL. Это тебе планка для общего развития. Что осилишь — всё твоё
// генератор случайных чисел
struct random
{
    double base, delta;
    random(double v1, double v2) : base(v1), delta(v2-v1) {}
    double operator()() const { return base + delta*rand()/RAND_MAX; }
};

// генератор рядов
struct new_row
{
    double* ptr;
    int size;
    new_row(double* p, int s) : ptr(p), size(s) {}
    double* operator()() /*nonconst*/ { double* p = ptr; ptr+=size; return p; }
};

// предикат сортировки строк
struct compare_first_item
{
    bool operator()(double const* row1, double const* row2) const { return *row1 < *row2; }
};

// операция частичной сортировки
struct do_partial_sort
{
    int count, size; // взять count первых элементов из size
    do_partial_sort(int c, int s) : count(c), size(s) {}
    void operator()(double* row) const
    {
        partial_sort(row, row+count, row+size);
    }
};

// операция вывода подстроки
struct do_print
{
    ostream& ostr;
    int count;
    do_print(ostream& os, int c) : ostr(os), count(c) {}
    void operator()(double const* row) const
    {
        copy(row, row+count, ostream_iterator<double>(ostr,"; "));
        ostr << endl;
    }
};

///////////////////////////////////////

// создаём структуры данных
int const X=200, Y=100;

vector<double> data(X*Y);
vector<double*> rows(Y);
generate(rows.begin(), rows.end(), new_row(data.begin(),X)); // заполняем массив строк

// заполняем матрицу мусором
double const vmin=..., vmax=...;
generate(data.begin(), data.end(), random(vmin,vmax));

// сортируем
int const x=20, y=10;

for_each(rows.begin(), rows.end(), do_partial_sort(1,X));
partial_sort(rows.begin(), rows.begin()+y, rows.end());
for_each(rows.begin(), rows.begin()+y, do_partial_sort(x,X));

// выводим
for_each(rows.begin(), rows.begin()+y, do_print(cout,x));
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.