Текущий архив: 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.45 MB
Время: 0.041 c