Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Внизсортировка Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.02 c