Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

сортировка   Найти похожие ветки 

 
qoop   (2006-09-09 15:55) [0]

 PUUUType = ^TUUUType;
 TUUUType = record
   SomeData: string;
   LastTimeMs: DWord;
   Numbers: DWord;
 end;

 UUUTypes = array of PUUUType;


Есть массив заполненных записей, необходимо грамотно и быстро выбрать из этого массива наилучшую запись соответствующую например такому правилу: Numbers <- Min; ListeTimeMs <- Min

Т.е. найти в этом массиве запись с наименьшими значениями этих двух параметров. Очень нужен хороший и быстрый способ.


 
qoop   (2006-09-09 16:43) [1]

Ну-же господа, подскажите!


 
palva ©   (2006-09-09 17:00) [2]

Задача не совсем определенная. Возможно, что минимальный Numbers у одной записи, а минимальный ListeTimeMs - у другой. Нужно определиться что для вас важнее, после чего к примеру нужно искать сначала записи с минимальным Numbers, а уже среди них с минимальным ListeTimeMs. Сортировать записи для этого не требуется. Просто просматривайте записи сверху в низ и держите в отдельной переменной индекс записи-кандидата. Если очередная запись "меньше" чем кандидат, то замените кандидата (замените индекс). После окончания просмотра у вас будет минимальный элемент.


 
qoop   (2006-09-09 17:13) [3]

Я бред какой-то кодом написал наверное. Да я понимаю принцип, я сравниваю сразу два условия, вот мой код, но я не уверен в его оптимальности и быстроте. Может что подскажете?

var
 i: LongWord;
 UUUSpeed: TUUUType;
begin
for i := Low(UUUTypes) to High(UUUTypes) do
   with UUUTypes[i] do
   begin
     if (Numbers < UUUSpeed.Numbers) and (ListeTimeMs < UUUSpeed.ListeTimeMs) then
       UUUSpeed := UUUTypes[i];
   end;
end;


 
palva ©   (2006-09-09 17:27) [4]

Так можно, если индекс найденной записи вас не интересует. Только надо сделать начальное присваивание UUUSpeed, и проверять СНАЧАЛА один параметр, потом другой. Что у вас будет сначала - сами решайте.

var
i: LongWord;
UUUSpeed: TUUUType;
begin
UUUSpeed := UUUTypes[Low(UUUTypes)]
for i := Low(UUUTypes) + 1 to High(UUUTypes) do
  with UUUTypes[i] do
  begin
    if (Numbers < UUUSpeed.Numbers) or
      (Numbers = UUUSpeed.Numbers) and (ListeTimeMs < UUUSpeed.ListeTimeMs) then
      UUUSpeed := UUUTypes[i];
  end;
end;


 
qoop   (2006-09-09 18:00) [5]


> Так можно, если индекс найденной записи вас не интересует.

А что-то в конструкции изменит, если мне потребуется и индекс сохранить. Я полагаю, что просто сделаю вот так и это будет корректно работать. Я прав?


var
i, FIndex: LongWord;
...
begin
...
if (Numbers < UUUSpeed.Numbers) or (Numbers = UUUSpeed.Numbers) and ListeTimeMs < UUUSpeed.ListeTimeMs) then
 begin
  UUUSpeed := UUUTypes[i];
  FIndex := i;
 end;


 
palva ©   (2006-09-09 18:23) [6]

Будет. Только буква i уже занята под параметр цикла. Используйте например i_min. И перед циклом надо дать начальное значение индексу:
i_min := Low(UUUTypes);



Страницы: 1 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.105 c
15-1157876075
kull
2006-09-10 12:14
2006.10.01
Какой браузер лучше?


15-1157781176
syte_ser78
2006-09-09 09:52
2006.10.01
непонятное поведение sql запроса


1-1156161079
.ruslan
2006-08-21 15:51
2006.10.01
DBCheckBox как программно изменить значение


5-1138991113
Glex
2006-02-03 21:25
2006.10.01
Универсальная кнопка <i>(совместная разработка)</i>


2-1158224284
Rolf
2006-09-14 12:58
2006.10.01
Список записей.