Главная страница
    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.012 c
4-1148307365
sholom
2006-05-22 18:16
2006.10.01
Подключить к COM-порту или USB


15-1158048993
Виталий Панасенко
2006-09-12 12:16
2006.10.01
Turbo Delphi


2-1157722946
Adios
2006-09-08 17:42
2006.10.01
Не работает функция


9-1136609402
Cash
2006-01-07 07:50
2006.10.01
10000 кубиков


2-1158090623
Murava
2006-09-12 23:50
2006.10.01
PostMessage(<окно>, wm_LButtonDown, 0, <координаты>)-не пашит :(





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский