![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование BinarySearch в DeCAL?
Erik1 © (2005-06-13 17:13:00)Вопрос работает ли данная функция? У меня есть контейнер из 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 19:19:00) [1]Я решил, что в библиотеке есть ошибка и переписал алгоритм. :(
Erik1 (2005-06-13 17:39:00) [2]Вот аггоритм поиска:
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 элементах в контейнере.