![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Быстрые алгоритмы операций с массивами [D7]
cls © (2012-12-02 12:36:00)Товарищи, подскажите пожалуйста, есть ли быстрые алгоритмы для операций с массивами для сравнения элементов и дальнейших арифметических операций с ними (по условию). Все что я нашел, касается только разных сортировок. А, например, для преобразования элементов массива заданным образом остается только последовательный перебор всех элементов. При объеме в сотни элементов - это быстро, считанные секунды, а если сотня тысяч - уже долго (счет на минуты, иногда десятки минут). Есть ли способ ускорить такие операции, м.б. описано в какой-нибудь литературе?
Очень Злой (2012-12-03 22:16:00) [1]
> Товарищи, подскажите пожалуйста, есть ли быстрые алгоритмы
> для операций с массивами для сравнения элементов и дальнейших
> арифметических операций с ними (по условию). Все что я нашел,
> касается только разных сортировок. А, например, для преобразования
> элементов массива заданным образом остается только последовательный
> перебор всех элементов.
ИМХО "быстрые" алгоритмы существуют для тех операций, где используется много проходов по масиву, и которые и существуют для того, чтобы уменьшить кол-во обращений к каждому из элементов массива, а если Вы собираетесь произвести какие-то операции над содержимым ячеек, где каждая ячейка используется 1 раз (для извлечения ее значения и возможно последующей записи нового значения), то таких каких-либы "быстрых" алгоритмов для этого по определению не может существовать.
Изредка такие операции можно немного ускорить, но это уже с помощью реализации. например если array of byte нужно проксорить с одним и тем же числом, то возможно быстрее будет брать из массива значения не побайтно, а например сразу по 4 байта в integer.
Хотя не зная реальной задачи - навряд-ли можно что-то сказать по сабжевому поводу...
Sapersky (2012-12-03 20:32:00) [2]Мой телепатор говорит - там вывод для отладки в визуальный компонент, что-то вроде Memo1.Lines.Add...
Авоськ (2012-12-03 18:25:00) [3]
> Palladin (02.12.12 23:11) [39]
>
> А еще мастера.
Разве ты не слышал байку про то, как жена одного физика попросила этого самого физика ветку у дерева в саду спилить, мешавшую ей?
Slym (2012-12-03 08:38:00) [4]в итоге все упрется в
SetLength(Data,Length(Data)+1);
Data[Length(Data)-1]:=P;
:)
Palladin (2012-12-02 23:11:00) [5]Вопрошатель решает конкретную задачу, что бы получить за нее конкретные деньги, а вы до сих пор не помогли ему их получить. Задаете глупые вопросы и рассказываете про сферические циклы в вакууме. А еще мастера.
Styx (2012-12-02 20:02:00) [6]
> конечно надо бы видеть, что происходит внутри у них
Коли код "снаружи" такой, как привёл ТС - значит, искать тормоза остаётся только как раз там...
RWolf (2012-12-02 18:58:00) [7]то есть 20мс, не двести — это я уже пробовал вставлять в структуру массивы данных для замедления копирования и забыл их убрать.
RWolf (2012-12-02 18:54:00) [8]
> [34]
ну хорошо, 200 мсек на i3, до 10 минут всё равно ой как далеко.
DVM (2012-12-02 18:51:00) [9]
> Styx (02.12.12 18:45) [34]
> Дык вроде разобрались:
>
Вряд ли из-за этого, ну что там, две функции, у каждой по два параметра, конечно надо бы видеть, что происходит внутри у них, но замедлить на десятки минут то, что должно выполняться 10 мс это надо постараться.
Styx (2012-12-02 18:45:00) [10]
> RWolf © (02.12.12 18:23) [33]
> ну почему, я бы, например, с удовольствием посмотрел, как
> удалось тривиальный код ненамеренно замедлить
Дык вроде разобрались:
> icWasya (02.12.12 16:57) [28]
> Фишка наверное в этом
> property Data[IndexOf: integer]:TPointRecord read GetItem
> write PutItem;
> а это не массив, а индексированное свойство.
RWolf (2012-12-02 18:23:00) [11]ну почему, я бы, например, с удовольствием посмотрел, как удалось тривиальный код ненамеренно замедлить как минимум в миллион раз — тоже своего рода достижение.
cls (2012-12-02 18:05:00) [12]Мой код никому, кроме меня, не нужен, со всеми недостатками. Так что извините за беспокойство.
Юрий Зотов (2012-12-02 17:14:00) [13]
> cls (02.12.12 16:41) [27]
Если Вы читаете все, то должны были прочитать и [24]. И понять, что нужен не весь, а только минимальный проблемный код. И как его получить, там тоже написано.
Вы же вместо него приводите объявление класса и НИ ОДНОЙ строчки исполнимого кода. А тот исполнимый код, что Вы уже показывали, никаких проблем со скоростью не имеет. В результате нужной информации снова нет и снова ничего сказать нельзя.
Сделайте уже, наконец, то, что нужно было сделать сразу - покажите тот кусок РЕАЛЬНОГО кода, который ДЕЙСТВИТЕЛЬНО вызывает проблему. И РЕАЛЬНЫЕ объявления ВСЕХ переменных которые в этом куске участвуют.
Авоськ (2012-12-02 17:01:00) [14]
> Anatoly Podgoretsky (02.12.12 16:59) [29]
еще как нужен. попробуй сделать медленно, я намедни устал нопы вставлять.
Anatoly Podgoretsky (2012-12-02 16:59:00) [15]Автор боится за код, украдут и выдадут за свой.
Но кому он нужен такой медленный.
icWasya (2012-12-02 16:57:00) [16]Фишка наверное в этом
property Data[IndexOf: integer]:TPointRecord read GetItem write PutItem;
а это не массив, а индексированное свойство.
cls (2012-12-02 16:41:00) [17]
> Styx
В записи ровно столько, сколько написано
> Юрий Зотов
Я читаю все, что пишут все участники дискуссии, даже плоские шуточки, и ничего не скрываю. Весь код приводить нереально, поэтому я и привожу его в сокращенном виде. Вам поможет, если я приведу описание класса полностью:
//-------------------- Запись для одной точки ----------------------------------
TPointRecord = record
X: double; // координаты X
Y: double; // Y
Z: single; // параметр
NClass: integer;// номер класса после классификации
end;
//-------------------- TDataClass ----------------------------------------------
TGridSize = record //размер грида
nX: integer; // кол-во профилей (столбцов матрицы)
nY: integer; // кол-во пикетов (строк матрицы)
end;
TValueRecord = record //пара значений "минимум-максимум"
LoVal: double; //минимум
HiVal: double; //максимум
end;
TDataClass = class
private
FName: string;
FChecked: boolean;
FGridSize: TGridSize;
FXSize: TValueRecord;
FYSize: TValueRecord;
FZSize: TValueRecord;
FRotation: double;
FBlank: double;
FData: array of TPointRecord;
FFileName: TFileName;
protected
procedure PutItem(AIndex: integer; AValue: TPointRecord);
function GetItem(AIndex: integer): TPointRecord;
procedure SetName(AName: string);
procedure SetState(AState: boolean);
procedure SetGridSize(AGridSize: TGridSize);
procedure SetXSize(AValueRecord: TValueRecord);
procedure SetYSize(AValueRecord: TValueRecord);
procedure SetZSize(AValueRecord: TValueRecord);
function GetStepX: double;
function GetStepY: double;
procedure SetRotation(ARotation: double);
procedure SetBlank(ABlank: double);
function GetItemCount: integer;
function GetNumberNoEmpty: integer;
function CalcMidArifm: extended;
function CalcDispersy: extended;
function CalcStDeviation: extended;
procedure SetFileName(AFileName: TFileName);
function CalcIntStergess: double;
function CalcIntSqrtRootN: double;
public
//SignClass: array of String;
constructor Create(ASize: integer);
procedure ReadGrid(AFileName: TFileName);
procedure WriteGrid(AFileName: TFileNAme; AOption: TOption);
function CalcHistogram(AInterval: TInterval): THistogramArray;
function ShowInfo: TStrings;
property Name: string read FName write SetName;
property Checked: boolean read FChecked write SetState;
property GridSize: TGridSize read FGridSize write SetGridSize;
property XSize: TValueRecord read FXSize write SetXSize;
property YSize: TValueRecord read FYSize write SetYSize;
property ZSize: TValueRecord read FZSize write SetZSize;
property StepX: double read GetStepX;
property StepY: double read GetStepY;
property Rotation: double read FRotation write SetRotation;
property Blank: double read FBlank write SetBlank;
property Data[IndexOf: integer]:TPointRecord read GetItem write PutItem;
property Count: integer read GetItemCount;
property MidArifm: extended read CalcMidArifm;
property Dispersy: extended read CalcDispersy;
property StDeviation: extended read CalcStDeviation;
property FileName: TFileName read FFileName write SetFileName;
property IntStergess: double read CalcIntStergess;
property IntSqrtRootN: double read CalcIntSqrtRootN;
end;
и далее, со всеми методами, и прочая, и прочая...
Я лишь выделил проблему
Styx (2012-12-02 15:38:00) [18]Телепатор подсказывает, что, кроме перечисленных полей, в записи есть ещё что-то, и его столько, что всё время уходит на копирование туда-обратно...
Юрий Зотов (2012-12-02 15:25:00) [19]
> cls (02.12.12 15:06) [23]
> Не было бы проблемы - не спрашивал бы.
Код, который Вы показываете, не самый лучший, но никаких проблем со скоростью в нем нет - о чем уже не раз говорилось.
Значит, Вы показываете не тот код. Возникает вопрос - почему?
Одно из двух - либо не читаете того, что Вам пишут, либо нарочно.
DVM (2012-12-02 15:08:00) [20]
> cls (02.12.12 14:49) [22]
> В чем разница?
В том что ты чего то скрываешь. Создай пустой проект, скопируй минимально необходимый проблемный код, убедись в наличии проблемы и ЛИШЬ ПОТОМ задавай вопрос и приводи код.