Главная страница
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.054 c
14-1117924451
паша_голубь
2005-06-05 02:34
2005.07.11
Киевская Встреча Мастаков


9-1112199822
$SerG$
2005-03-30 20:23
2005.07.11
[Error] File not found: DelphiX.dcr . Где взять?


9-1104993420
[Baradoo]
2005-01-06 09:37
2005.07.11
3D космический шутер (demo) 600KB


3-1117428662
yk
2005-05-30 08:51
2005.07.11
Как выбрать из DataSet то что мне нужно


3-1117356716
_RusLAN
2005-05-29 12:51
2005.07.11
Firebird Embedded 1.5. Не могу подключиться.