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

Вниз

Использование BinarySearch в DeCAL?   Найти похожие ветки 

 
Erik1 ©   (2005-06-13 17:13) [0]

Вопрос работает ли данная функция? У меня есть контейнер из 3 элементов функция сразвенеия выгладит так:
function ComparatorSID(ptr: Pointer; const obj1, obj2: DObject): Integer;
begin
Result := TRaw(obj1.VObject).Element.ID - obj2.VInteger;
end;
Провожу тест:
iter := BinarySearch(Raw.Container, [240851208]);
if atEnd(iter) then
 sysutils.Beep;
iter := BinarySearch(Raw.Container, [241048155]);
if atEnd(iter) then
 sysutils.Beep;
iter := BinarySearch(Raw.Container, [241117550]);
if atEnd(iter) then
 sysutils.Beep; //вот здесь ненаходит.

Вобщем неможет она найти последний элемент!


 
Erik1 ©   (2005-06-13 17:39) [1]

Вот аггоритм поиска:
function _binarySearchInWith(_start, _end : DIterator; compare : DComparator; const obj : DObject) : DIterator;
var dist, comp : Integer;
   last : DIterator;
begin

assert(diRandom in _start.flags, "Binary search only on random access iterators");
last := _end;
 result := last;

 repeat
   dist := distance(_start, _end) div 2;
   if dist <= 1 then //кажется в этом блоке ошибка?
     begin
      if compare(getRef(_start)^, obj) = 0 then
        result := _start
       else if compare(getRef(advanceF(_start))^, obj) = 0 then
        result := advanceF(_start)
       else
        result := last;
       break;
     end;
   result := advanceByF(_start, dist);
   comp := compare(getRef(result)^, obj);
   if comp = 0 then
     break
   else if comp < 0 then
     _start := result
   else
     _end := advanceF(result)
 until false;
end;
Переменая dist будет равна 1 при 2 и 3 элементах в контейнере.


 
Erik1 ©   (2005-06-13 19:19) [2]

Я решил, что в библиотеке есть ошибка и переписал алгоритм. :(



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

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

Наверх




Память: 0.47 MB
Время: 0.093 c
5-1089872243
ViJen
2004-07-15 10:17
2005.07.11
DbGrid, DateTimePicker и прокрутка


4-1115215444
ANB
2005-05-04 18:04
2005.07.11
Как эмулировать нажатие клавиш на клавиатуре для чужой программы


4-1116052072
KADAN
2005-05-14 10:27
2005.07.11
память и файл подкачки


1-1118494123
bma_ru
2005-06-11 16:48
2005.07.11
Динамические массивы в dll


3-1117386935
parasolka
2005-05-29 21:15
2005.07.11
Работа с DBGrid