Я реализую алгоритм кластеризации. У меня есть vector of Node
объектов vector of Node
для хранения оригинальных копий и другого vector of Cluster
объектов vector of Cluster
. Каждый Cluster object
содержит vector of pointers
на все содержащиеся в нем узлы.
На каждой итерации предполагается, что две кластеры будут объединены в соответствии со стоимостью соединения.
Прямо сейчас я использую priority queue
для хранения структур, которые содержат стоимость соединения и указатели на оба кластера. На каждой итерации я вывожу одну из них с минимальными затратами и присоединяюсь к ссылочным кластерам. Я хочу использовать очередность, потому что у меня много данных, и цикл по всем объектам, чтобы найти минимальную стоимость, непрактичен.
Я реализовал слияние, скопировав данные из одного кластера в другой, а затем удалив один из кластеров. Проблема в том, что моя очередь теперь содержит много записей, которые ссылаются на удаленный кластер.
Как вы его реализуете? Может быть, есть еще более умный способ присоединиться к кластерам? Я ищу генетическую идею для реализации.
У меня есть следующая идея. Пусть добавьте поле bool _isRemoved
в класс Cluster
. Вы установите значение true
для каждого удаленного кластера. Когда вы выталкиваете что-то из очереди, вы сначала проверите, имеет ли какой-либо из двух кластеров _isRemoved
значение true
. Если да, вы должны просто вывести следующую пару из очереди и продолжить обработку.
Я не эксперт C++, но следующая проблема может заключаться в том, что кластеры, которые были удалены и на которые ссылаются, все еще занимают память. Если вы хотите избежать этой проблемы вместо хранения указателей на кластеры в очереди, вы можете хранить идентификаторы кластеров. Идентификаторы могут быть быстро сопоставлены с кластерами с помощью карты (словаря).