![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Представление двухмерного массива в виде динамического списка [D7, XP]
теркин © (2012-03-22 19:43:00)Объясните пожалуйста, как можно представить двухмерный массив в виде динамического списка, так чтобы к списку можно было обращаться по индексам.
Anatoly Podgoretsky (2012-03-23 07:59:00) [21]
> В памяти массив любой размерности все равно расположен как
> одномерный.
Кроме динамических
теркин (2012-03-22 23:56:00) [22]
> имеет смысл еще экономить в 2 раза на размещении.
Да именно за эту экономию и идет натуральная война. Размерность матриц главных циклов 450х2500. Необходимо находить произведение этой матрицы на себя транспонированную, на каждом шаге итерационного процесса. По смыслу это произведение равносильно нахождению пересечения двух множеств ребер для двух циклов. На прямом произведении через циклы for программа тратит много времени, пришлось искать пересечения, работать стала на много быстрее. Сейчас найденные пересечения буду сохранять в массиве, правда за счет память, но итераций требуется много, сходимость метода медленная, поэтому думаю игра стоит свеч. Кстати любопытная матрица попалась, верхняя релаксация сходится медленней чем нижняя.
Jeer (2012-03-22 23:19:00) [23]Для диагонально-симметричных матриц (особенно большого размера) имеет смысл еще экономить в 2 раза на размещении.
Sha (2012-03-22 23:14:00) [24]конечно
теркин (2012-03-22 23:11:00) [25]
> естественно, при этом ты имеешь право обращаться
> только к тем a[i,j], у которых 0<=j<=i
или изменить само обращение if j>i then B[j*(j+1) div 2 +i]
Sha (2012-03-22 22:58:00) [26]Выражение i*(i+1) div 2 + j для неотрицательных чисел
быстрее будет вычислить как i*(i+1) shr 1 + j
Jeer (2012-03-22 22:58:00) [27]"Вся тупость еще впереди, не забывай об этом" (С) Jeer
теркин (2012-03-22 22:55:00) [28]Огромное спасибо ребята. Правду говорят -"Все гениальное -ПРОСТО". И как сразу не додумался использовать Div. Мне бы наверно чукчи сказали "Тупой ты однако".
Sha (2012-03-22 22:51:00) [29]естественно, при этом ты имеешь право обращаться
только к тем a[i,j], у которых 0<=j<=i
Sha (2012-03-22 22:44:00) [30]да
a[0,0] <--> b[0]
a[1,0] <--> b[1]
a[1,1] <--> b[2]
a[2,0] <--> b[3]
a[2,1] <--> b[4]
a[2,2] <--> b[5]
a[3,0] <--> b[6]
...
Jeer (2012-03-22 22:43:00) [31]Чисто для демонстрации твоего случая:
Size := Rows*Cols;
SetLength(arXY, Rows, Cols);
// Заполнение двумерного массива
for row := 0 to Rows-1 do
for col := 0 to Cols-1 do
arXY[row,col] := Cols*row + col;
// Заполнение двумерного, как одномерного
for idx := 0 to (Rows*Cols-1) do begin
row := idx div Rows;
col := idx - row*Cols;
arXY[row, col] := idx;
end;
теркин (2012-03-22 22:26:00) [32]Господин Sha
> вместо A[i,j] обращайся к B[i*(i+1) div 2 + j]
это решение уже с учетом симметрии?
Sha (2012-03-22 21:40:00) [33]> теркин © (22.03.12 20:29) [2]
1. вместо двумерного A создай одномерный B
2. вместо A[i,j] обращайся к B[i*(i+1) div 2 + j]
теркин (2012-03-22 21:40:00) [34]Или иными словами если написать функция при использовании индексов ну например
function F(i,j:integer): TrebroList;
begin
result:= List.TrebroList.items[i*N+j];
end;
где N размерность, то получим нужный элемент по двойному индексу?
Германн (2012-03-22 21:32:00) [35]
> Желательно представить этот массив в виде одномерного списка,
> но так чтобы при необходимости элементы этого списка можно
> было получить по двойному индексу.
Ну и в чем проблема? В памяти массив любой размерности все равно расположен как одномерный.
теркин (2012-03-22 20:43:00) [36]Желательно представить этот массив в виде одномерного списка, но так чтобы при необходимости элементы этого списка можно было получить по двойному индексу.
Jeer (2012-03-22 20:37:00) [37]Тем более непонятно - при чем тут обращение к элементам и компактное хранение ?
Вам надо компактное хранение или обращение к двумерному, как к одномерному ?
теркин (2012-03-22 20:29:00) [38]Возможно вопрос задан не корректно. Есть динамический список объектов, к которому надо обратится по индексам. изначально массив объявлен как
UnitRebro:array of array of TrebroList;
У массива есть особенность он симметричен относительно главной диагонали, и получается так что значения повторяются и его размер можно сократить почти в два раза.
begin...end (2012-03-22 19:51:00) [39]Ваш вопрос не совсем ясен. Вы о динамических массивах?
var
A: array of array of Integer; // двумерный динамический массив
I, J: Integer;
begin
// A - массив из двух массивов, каждый из которых содержит 10 элементов
// Выделение памяти
SetLength(A, 2, 10);
// Заполнение массива
for I := Low(A) to High(A) do
for J := Low(A[I]) to High(A[I]) do
A[I, J] := I + J
end