Комментарии 2
Собственно я не видел, чтобы такая задача вообще ставилась. А между тем, думаю, этому нашлось бы немало применений
Можно привести примеры применений, идея интересная, но хотелось бы больше конкретики в практической плоскости.
0
Примером может послужить описанная выше задача: предоставить произвольному классу возможность добавлять, удалять и проверять на принадлежность себя множеству за O(1), и при этом не связывать его конкретным классом-родителем.
Определяется классы TUnion и TSignature.
Каждое множество (экземпляр TUnion) содержит массив ссылок на TSignature.
Экземпляр TSignature является полем произвольного объекта и содержит ссылку на объект и массив «обратных индексов», т.е. индексов себя в соответствующих множествах.
В таком виде это, в некотором роде, альтернатива словарям (TDictionary). Вместо того чтобы вычислять индекс элемента каждый раз при обращении мы вычисляем его один раз и резервируем ячейку.
Впрочем, думаю, это не единственный способ применения.
Определяется классы TUnion и TSignature.
Каждое множество (экземпляр TUnion) содержит массив ссылок на TSignature.
Экземпляр TSignature является полем произвольного объекта и содержит ссылку на объект и массив «обратных индексов», т.е. индексов себя в соответствующих множествах.
constructor TUnion.Create(Owner: TObject);
begin
FOwner := Owner;
FGlobalIndex := GlobalIndexator.GetIndex(TUnion.ClassInfo, Self);
end;
function TSignature.IsIncluded(Union: TUnion): Boolean;
begin
Result := (Union.GlobalIndex < Length(Self.BackIndexes)) and
(Self.BackIndexes[Union.GlobalIndex] <> -1);
end;
В таком виде это, в некотором роде, альтернатива словарям (TDictionary). Вместо того чтобы вычислять индекс элемента каждый раз при обращении мы вычисляем его один раз и резервируем ячейку.
Впрочем, думаю, это не единственный способ применения.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Индексация глобальная и не очень