На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Эффективный доступ к элементам дин.2мерного массива
    Всем хай! Сходу к делу!

    Для условия мне нужно привести малый кусочек кода на С++(буквально 5 строк), его поймет даже 4рех летний ребенок):
    ExpandedWrap disabled
      class Dyn_Matr
      {
      private:
          double** data;      
          int n;          
          int m;
      };


    и в задании просят реализовать эффективный вариант индексирования, чтобы можно было присваивать объект[i][j] = значение
    --------------------------------------------------------
    это задание одно из сложнейших считается, хм...

    я вот совсем не выкупаю следующее: по дефалту и так ведь можно обращаться по индексам к данным массива, динамическая память выделяет последовательные участки памяти, поиск по дефалту мгновенный. Что здесь можно эффективнее еще придумать??

    ладно бы была разряженная матрица (аля данные в Excel), так ведь нет, все элементы массива всегда заполняются и пр.
    Что-то здесь нечисто!

    Подскажите, к чему стремится здесь, в чем может заключаться эффективизация доступа индексного?

    P.S. не думаю, что описание класса для динамической матрицы ошибочно, по-другому не бывает ведь)

    Добавлено
    еще такая была мысль: может фишка в том, чтобы обращаться именно через индексы через объект напрямую, минуя обращение к полю data, т е так:
    ExpandedWrap disabled
      m[2][4] = 5

    а, не
    ExpandedWrap disabled
      m->data[2][4] = 5


    но ведь С++ не допускает перегрузку двойных скобок [][], а только одинарных []
    не знаю, может мысль неправильная совсем и надо в раздел С++ идти
      Возможно, имеется ввиду хранение массива не по строкам, а целиком одним непрерывным куском памяти. Реализовать его можно по-разному
      1) Вычисляем индекс напрямую
      ExpandedWrap disabled
        double *data; // Одномерный, а не двумерный массив,
        data = new double[n * m];
        data[i * m + j] = 42; // Обращение к элементу [i][j]

      2) Вместо смещений используем массив указателей на указатель:
      ExpandedWrap disabled
        double *main_data = new double[n * m]; // Сами данные массива
        double **row_data = new double*[n];
        for(int i = i; i < n; ++i) row_data[i] = main_data + i * m;
        row_data[i][j] = 42; // Индексируем как обычно
         
        // В деструкторе не забыть удалить оба буфера
        delete[] row_data;
        delete[] main_data;


      Добавлено
      Цитата FasterHarder @
      но ведь С++ не допускает перегрузку двойных скобок [][], а только одинарных []

      Есть два варианта
      1) Юзай для индексации operator().
      2) Пусть operator [] возвращает какой-нибудь Column, у которого тоже есть operator[].
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0266 ]   [ 15 queries used ]   [ Generated: 19.04.24, 14:59 GMT ]