Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Быстрые алгоритмы операций с массивами [D7]


Страницы:   1 2 3

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]


> В чем разница?

В том что ты чего то скрываешь. Создай пустой проект, скопируй минимально необходимый проблемный код, убедись в наличии проблемы и ЛИШЬ ПОТОМ задавай вопрос и приводи код.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо