Форум «Всё о Паскале» _ Теоретические вопросы _ Реализация динамических матриц
Автор: sheka 13.04.2011 3:14
Цитата
...чтобы работать с динамическими матрицами, проще всего представить матрицу, как массив векторов...
http://volvo71.narod.ru/faq_folder/dyn_arr.htm А как работать с ними если сделать "сложнее" (если объявить размерность через запятую). Вопрос тупой - прошу такой же ответ, т.к. задача стоит сортировать трехмерный массив и замерить время, а если использовать представление трехмерного массива как массив матриц, то показатели должны исказиться, что недопустимо.
Автор: volvo 13.04.2011 3:32
Цитата
если использовать представление трехмерного массива как массив матриц, то показатели должны исказиться, что недопустимо.
Показатели должны исказиться относительно чего, можно узнать?
Что значит,
Цитата
(если объявить размерность через запятую).
? Как ты хочешь объявлять массивы, покажи...
Автор: sheka 13.04.2011 4:34
Время. Все дело во времени.
Вот как-то так: type ta = array[1..1 .. maxint div sizeof(TType),1 .. maxint div sizeof(TType)] :TType;
Цель курсача: сравнивание времени сортировки вектора, трехмерного массива разной формы. Суммарное количество элементов одинаковое.
Брр... скорее всего, я не тот вопрос задал. Вот "гвоздь программы": На сколько я понимаЛ, обращение к элементу массива a^[1] должно было быть дольше чем b[1], но вот эта программка на миллионе проверок выдает результаты одинаковые, то чуть больше в одну сторону, то в другую. Так ли это на самом деле?
Код(Показать/Скрыть)
uses Dos; uses Dos;
type pa = ^Ta; ta = array[1..maxint div sizeof(integer)] of integer; tb = array[1..1] of integer; tc = array[1..1, 1..1] of integer;
var a: pa; b: tb; c: tc;
i,j: longint; x: integer; start: longint;
const n = 30000;
type TTime = record {Тип для зберігання часу} Hours, {години} Minutes, {хвилини} Seconds, {секунди} HSeconds: Word {соті долі секунди} end;
var StartTime,FinishTime: TTime;
function ResTime(const STime, FTime: TTime): Longint; {Визначає різницю між часом закінчення і часом старту алгоритму} begin ResTime := 360000*(FTime.Hours - STime.Hours )+ {часы} 6000*(FTime.Minutes - STime.Minutes)+ {минуты} 100*(FTime.Seconds - STime.Seconds)+ {секунды} (FTime.HSeconds - STime.HSeconds) {сотые секунды} end;
begin GetMem(a,1*sizeof(integer)); a^[1] := 1; with StartTime do GetTime(Hours,Minutes,Seconds,HSeconds); for i:=-n to n do for j:=-n to n do x := a^[1]; with FinishTime do GetTime(Hours,Minutes,Seconds,HSeconds); writeln(ResTime(StartTime, FinishTime)); FreeMem(a,1*sizeof(integer));
b[1] := 1; with StartTime do GetTime(Hours,Minutes,Seconds,HSeconds); for i:=-n to n do for j:=-n to n do x := b[1]; with FinishTime do GetTime(Hours,Minutes,Seconds,HSeconds); writeln(ResTime(StartTime, FinishTime));
c[1,1] := 1; with StartTime do GetTime(Hours,Minutes,Seconds,HSeconds); for i:=-n to n do for j:=-n to n do x := c[1,1]; with FinishTime do GetTime(Hours,Minutes,Seconds,HSeconds); writeln(ResTime(StartTime, FinishTime)); readln; end.
Вааще ниче не шарю: выводит такие результаты: 1921 2304 2288 Все наоборот.. FPC, win7. из под ДосБокса, к сожалению, не могу попробовать, чтобы принудительно уменьшить скорость процессора, поэтому брал количеством.
Автор: Lapp 13.04.2011 6:51
Разница во времени вряд ли велика и будет зависеть от оптимизации.
Цитата(sheka @ 13.04.2011 1:34)
Вааще ниче не шарю: выводит такие результаты: 1921 2304 2288 Все наоборот.. FPC, win7. из под ДосБокса, к сожалению, не могу попробовать, чтобы принудительно уменьшить скорость процессора, поэтому брал количеством.
А ты вообще обращаешь внимание на параметры компиляции? Вот результаты на моем компе. 1. Без оптимизации, с Range Check 872 844 844
2. С оптимизацией, с Range Check 391 272 262
3. С оптимизацией, без Range Check 262 261 260
А DosBox может существенно портить картину..
Автор: sheka 14.04.2011 0:25
ДосБокс - для того, чтобы можно было посчитать время для массива 40*40*n (какое n - еще пока не придумал), но размер не очень большой.
Значит вы считаете, что скорость многоразового выполнения вот этого (того, что написано в каждой строчке) многоразово a[i,j,k] многоразово a[i][j][k] многоразово a^[i]^[j]^[k] однократно b := a^[i], а потом многоразово b^[j]^[k] однократно с := a^[i]^[j], а потом многоразово с^[k] будет одинаковой, т.е. разницей можно пренебречь даже для довольно малых размеров массива?
Ваше мнение очень важно, т.к. еще раз повторюсь, что цель курсача: сравнивание времени сортировки вектора, трехмерного массива разной формы. Суммарное количество элементов одинаковое и если изменение времени будет как раз из-за того что я использовал как-то по разному обращение к элементам - это не хорошо.
Автор: volvo 14.04.2011 0:57
Разницей во времени обращения можно пренебречь в данном случае. В Release-сборке различия несущественны. Другое дело - что, когда ты начнешь решать свою задачу, может быть не тот результат который есть сейчас. Сейчас ты тестируешь скорость обращения к одному (причем первому) элементу массива. Как только начнется обращение к разным элементам - картина может чуть-чуть поменяться. Но не сильно, не беспокойся, я сделал несколько прогонов, отличия - в 3-5 единиц. Это, опять же, несущественно.
Можешь проверить не время 1 млн. обращений, а количество тактов на каждое (одно) обращение: http://volvo71.narod.ru/time_count.htm#time_rdtsc лежит функция. Тоже, после нескольких прогонов, увидишь, что средние значения примерно равны.
Цитата
еще раз повторюсь, что цель курсача: сравнивание времени сортировки вектора, трехмерного массива разной формы. Суммарное количество элементов одинаковое и если изменение времени будет как раз из-за того что я использовал как-то по разному обращение к элементам - это не хорошо.
Я еще раз не понимаю, почему надо использовать разные способы обращения к элементам? Не умеешь создавать динамический трехмерный массив? http://forum.sources.ru/index.php?showtopic=51192&view=findpost&p=2677514 . Создал массив A[1..2,1..3,1..5], массив B[1..5,1..1,1..6], и массив С[1..3,1..10,1..1]. Все три - динамические, у всех общее число элементов = 30, у всех одинаковый метод доступа. И сравнивай время сортировки...
Автор: Lapp 14.04.2011 3:37
Цитата(sheka @ 13.04.2011 21:25)
ДосБокс - для того, чтобы можно было посчитать время для массива 40*40*n (какое n - еще пока не придумал), но размер не очень большой.
ДосБокс в качестве замедлителя?.. Это в корне неверный подход. Ты не знаешь, что в нем происходит. Используй многогратные проходы.
И вообще, подобные исследования на современных процах с многоуровневым многомегабайтным кешем и в многозадачной системе - дело непростое. Плюс - проц наверняка 64-битный, в про систему ты не обмолвился.. Да тут параметров для учета больше, чем звезд на небе (well, в городе)). Сначала надо бы понять, что ты хочешь и поставить задачу точнее (учтя влияния всех компонент).
Автор: sheka 14.04.2011 4:13
Цитата
Не умеешь создавать динамический трехмерный массив?
C этим проблем нет.
Цитата
Я еще раз не понимаю, почему надо использовать разные способы обращения к элементам? .... Все три - динамические, у всех общее число элементов = 30, у всех одинаковый метод доступа. И сравнивай время сортировки...
Так и буду делать, но вдруг там что-то придумаю, а так делать окажется нельзя.
Цитата
ДосБокс в качестве замедлителя?.. Это в корне неверный подход. Ты не знаешь, что в нем происходит. Используй многогратные проходы.
Это уже не мне решать
Цитата
Сначала надо бы понять, что ты хочешь и поставить задачу точнее (учтя влияния всех компонент).
ы.. тут ответ однозначный - Сдать А если серьезно, то задача очень простая(если не вникать в подробности ): Упорядочить отдельно каждое сечение трехмерного массива А [p, m, n] насквозь по колонкам по неубыванию. Проход по сечению разными вариантами.
А вот тут моя больная фантазия бы наделала кучу процедур, передавала бы туда сечение итд итп, где-бы и применялись
Цитата
разные способы обращения к элементам
. Но к счастью так делать нельзя и все надо писать слитным текстом. Так же если использовать дин. массив, то думал, что обращение к элементам будет существенно искажать результат.
Автор: Lapp 14.04.2011 4:24
Цитата(sheka @ 14.04.2011 1:13)
ы.. тут ответ однозначный - Сдать
желаю успеха.. я больше в эт тему не глядец..
Автор: sheka 16.04.2011 5:30
Цитата
ы.. тут ответ однозначный - Сдать А если серьезно
Цитата
желаю успеха.. я больше в эт тему не глядец..
Плох тот студент, который не желает сдать.
Автор: Lapp 16.04.2011 10:17
Цитата(sheka @ 16.04.2011 2:30)
Плох тот студент, который не желает сдать.
Саш, я все понимаю и не хочу выгядеть ханжой (конечно, сдавай!), но и ты пойми: когда я не вижу способа посоветовать, исходя из разумных соображений, я лучше не буду советовать совсем (иначе я скорее помешаю, чем помогу).