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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2013, 18:31   #1
maxsept
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 14
Сообщение Перебор

создаёться большое кол-во объектов, порядка 10^6
все они забиваются в один массив
Код:
map: array of PStruct;
Код:
PStruct = record 
 x,y,z:smallint;
end;
для добавления нового объекта нужно условие что координаты не совпадают ни с одним другим

то есть процедура примерно такая :

Код:
procedure Map.add(_type: Byte; x, y, z: SmallInt);
var
  i:Integer;
begin
    for i:=0 to objectCount-1 do
      if (_map[i].getx=x) and (_map[i].getY=y) and (_map[i].getZ=z) then
        exit;
  inc(objectCount);
  SetLength(_map,objectCount);
  _map[objectCount-1]:=Object.Create(_type,x,y,z);
end;
всё бы ничего но когда объектов уже порядка 10к начинает заметно возростать время создание нового
как можна все ето дело оптимизировать ?

Последний раз редактировалось maxsept; 28.02.2013 в 18:35.
maxsept вне форума Ответить с цитированием
Старый 28.02.2013, 18:47   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Первое что приходит в голову, вынести поиск в отдельный поток.

Можно попробовать еще такой вариант: хранить данные в отсортированном виде, и для нахождения повторяющегося элемента использовать бинарный поиск. Но тут еще все продумать нужно. Прирост в скорости должен быть. Однако, появится новая проблема. Добавление элемента в отсортированный массив.
kangreon вне форума Ответить с цитированием
Старый 28.02.2013, 18:49   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Чтобы не зависеть от количества итераций при поиске дубликатов значений, можно записывать значения x, y и z в базу данных с составным по этим полям индексом.
Время выборки при поиске дубликатов, практически, не будет зависеть от количества объектов.
Для этого годятся СУБД: Firebird, MS SQL Server, PostgriSQL, Oracle, ...
Прик вне форума Ответить с цитированием
Старый 28.02.2013, 19:03   #4
maxsept
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 14
По умолчанию

Всем спасиб, вобщем проблема была не совсем в этом, код жутко тормозила команда SetLength
сначала считаю кол-во объектов которое буду создавать потом пользуюсь 1 раз командой SetLength, 20k объетков от 8000мс(до) до 30мс(после)...
maxsept вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа перебора вариантов (изменить перебор цифровой на перебор буквенный) BArt2000 Паскаль, Turbo Pascal, PascalABC.NET 5 02.03.2015 12:56
Перебор элементов Namolem Помощь студентам 1 17.04.2011 14:42
Троичный перебор Besidnuk Помощь студентам 3 28.02.2011 11:35
перебор в с++ Girl/C++ Общие вопросы C/C++ 3 04.10.2010 09:50
Перебор с памятью artemavd Общие вопросы Delphi 12 24.05.2009 06:48