Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.014 c
15-1158046046
Бугага
2006-09-12 11:27
2006.10.01
Еще одна :)


2-1157839282
progdev
2006-09-10 02:01
2006.10.01
Оптимальный методь поиска в тхт файлов


2-1157701316
непонимающий
2006-09-08 11:41
2006.10.01
указатели


2-1158288695
Timur
2006-09-15 06:51
2006.10.01
Проверка на корректность документа Word.


1-1155834928
APOSTOL
2006-08-17 21:15
2006.10.01
TrichEdit как сделать курсор в виде прямоугольника?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский