Как стать автором
Обновить

Комментарии 2

Собственно я не видел, чтобы такая задача вообще ставилась. А между тем, думаю, этому нашлось бы немало применений

Можно привести примеры применений, идея интересная, но хотелось бы больше конкретики в практической плоскости.
Примером может послужить описанная выше задача: предоставить произвольному классу возможность добавлять, удалять и проверять на принадлежность себя множеству за O(1), и при этом не связывать его конкретным классом-родителем.
Определяется классы 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). Вместо того чтобы вычислять индекс элемента каждый раз при обращении мы вычисляем его один раз и резервируем ячейку.

Впрочем, думаю, это не единственный способ применения.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории