Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2012, 15:14   #1
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию Зачем нужны многомерные массивы?

Думаю справедливый вопрос, поскольку, для примера, простое суммирование элементов одномерного массива в цикле иммитирующем цикл, необходимый для перебора элементов многомерного массива, оказывается быстрее.

Чем такая ссылка M[J*k+I*j+i] сложнее вот такой M[i,j,k]?
(I - длина первой меры, J - длина второй меры)
Вложения
Тип файла: rar 2Dvs1D.rar (165.5 Кб, 15 просмотров)
Sёker вне форума Ответить с цитированием
Старый 12.05.2012, 15:16   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Sёker

простое суммирование элементов одномерного массива в цикле иммитирующем цикл, необходимый для перебора элементов многомерного массива, оказывается быстрее.

быстрее оно может быть только в этой эротической пародии на компилятор, а в нормальных - монопениссуально.
Rififi вне форума Ответить с цитированием
Старый 12.05.2012, 15:37   #3
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
Sёker
быстрее оно может быть только в этой эротической пародии на компилятор, а в нормальных - монопениссуально.
Чё. Это как?
Sёker вне форума Ответить с цитированием
Старый 12.05.2012, 15:50   #4
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
оказывается быстрее.
Докажите это! Мне очень интересно!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 12.05.2012, 15:55   #5
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
Докажите это! Мне очень интересно!
Гляньте во вложении. Там пример для двумерного массива.
Sёker вне форума Ответить с цитированием
Старый 12.05.2012, 16:14   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Все зависит от компилятора, оптимизатора и аллокатора памяти.

Нормальные компиляторы из M[i,j,k] давно делают M[J*k+I*j+i], просто потому что так удобнее работать процу...

По теме: Зачем нужны? Для удобства себя любимого человека, чтоб не городить M[J*k+I*j+i], а просто писать M[i,j,k] и все остальное оставить компилятору.
p51x вне форума Ответить с цитированием
Старый 12.05.2012, 18:12   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Sёker Посмотреть сообщение
Думаю справедливый вопрос, поскольку, для примера, простое суммирование элементов одномерного массива в цикле иммитирующем цикл, необходимый для перебора элементов многомерного массива, оказывается быстрее.

Чем такая ссылка M[J*k+I*j+i] сложнее вот такой M[i,j,k]?
(I - длина первой меры, J - длина второй меры)
Ну, во-первых, в архив не заглядывал, а здесь у Вас явно неправильно записано.
Правильно так:
M[k + MaxK*j + MaxK*MaxJ*i] для M[i, j, k]
может, из-за этого и скорость отличается, т.к. делаете разную работу.

Кстати, полезно знать, что скорость обработки массива существенным образом зависит от порядка перебора индексов. И эта разница может составлять более 10 раз.

Ну и, самое главное, MaxK*j + MaxK*MaxJ*i любой вменяемый как программист, так и оптимизатор вынесет за пределы цикла.

Ну а вообще, многомерные массивы - это элемент удобства. И размерность должна отражать структуру данных. Например, если мы рассматриваем плоскость, разбитую на квадраты, удобно пользоваться двумерным массивом, объем на кубы - трехмерным и т.п.

Последний раз редактировалось s-andriano; 12.05.2012 в 18:16.
s-andriano вне форума Ответить с цитированием
Старый 12.05.2012, 20:43   #8
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Ну, во-первых, в архив не заглядывал, а здесь у Вас явно неправильно записано.
Правильно так:
M[k + MaxK*j + MaxK*MaxJ*i] для M[i, j, k]
может, из-за этого и скорость отличается, т.к. делаете разную работу.

Кстати, полезно знать, что скорость обработки массива существенным образом зависит от порядка перебора индексов. И эта разница может составлять более 10 раз.

Ну и, самое главное, MaxK*j + MaxK*MaxJ*i любой вменяемый как программист, так и оптимизатор вынесет за пределы цикла.

Ну а вообще, многомерные массивы - это элемент удобства. И размерность должна отражать структуру данных. Например, если мы рассматриваем плоскость, разбитую на квадраты, удобно пользоваться двумерным массивом, объем на кубы - трехмерным и т.п.
Спасибо, что поправили. Но пример в архиве для двумерной структуры данных. И скорость действительно при суммировании элементов одномерного массива, оказывается выше.


Вообще всем ответившим спасибо. И пардонте, я как скромный любитель, борзеть больше не буду. Буду разбираться, что с компилятором.
Sёker вне форума Ответить с цитированием
Старый 12.05.2012, 21:25   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Sёker Посмотреть сообщение
Спасибо, что поправили. Но пример в архиве для двумерной структуры данных. И скорость действительно при суммировании элементов одномерного массива, оказывается выше.
Самого главного то Вы и не заметили.
Посмотрел Ваш код - он действительно перебирает индексы в разном порядке - отсюда и разница в скорости.
s-andriano вне форума Ответить с цитированием
Старый 13.05.2012, 07:24   #10
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Самого главного то Вы и не заметили.
Посмотрел Ваш код - он действительно перебирает индексы в разном порядке - отсюда и разница в скорости.
Тут не понял. Вроде построчно перебирает j - счёт по столбцу, i - счёт по строке, H - длина строки, L - длина столбца:
j:=0, i:=0,1,...,H-1,
j:=1, i:=0,1,...,H-1,
...
j:=L-1, i:=0,1,...,L-1.
Как тогда правильно?
Sёker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зачем нужны классы Sylar9 Общие вопросы C/C++ 5 15.03.2012 11:38
Многомерные массивы! GoogleDOt PHP 6 15.09.2011 09:33
Зачем нужны блок-схемы? fs444 Общие вопросы по программированию, компьютерный форум 31 27.01.2010 04:11
Зачем нужны операторы << и >> fs444 Общие вопросы C/C++ 3 23.12.2009 08:07
Многомерные массивы DDP Помощь студентам 1 19.12.2009 19:37