В настоящее время мне поручено реализовать алгоритм CCL в системе баз данных (написанный на C++). Этот алгоритм назначил метку всем значениям заданного многомерного массива, которые превышают пороговое значение, а соседние помеченные значения будут иметь одну и ту же метку.Подключенная маркировка компонентов по случайным образом разделенным данным?
Кодирование базового алгоритма CCL не было затруднительным, но в моем домене входной массив случайным образом разбивается на несколько экземпляров базы данных. Когда вызывается мой оператор CCL, каждый экземпляр выполняет операцию над куском данных, за которые отвечает и возвращает свой локальный результат CCL. Эти локальные результаты затем объединяются для получения конечного результата.
Во время выполнения я не знаю, какой экземпляр отвечает за любую данную часть массива, а экземпляры не могут связываться друг с другом до последнего шага слияния.
- = - = - = -
В настоящее время у меня есть этот рабочий, выполнив следующие действия:
Каждый экземпляр создает массив логических значений размера, равного число пунктов в массиве и устанавливает все значения в FALSE.
Каждый экземпляр проходит через значения, за которые он отвечает, и проверяет, превышают ли эти значения порог; если они есть, то изменят соответствующие логические значения в их локальном массиве на ИСТИНА.
Все экземпляры отправляют свои массивы координатору, который объединяет результаты с использованием OR для создания конечного булева вектора.
Координатор передает каждое значение в массиве, пропуская значения , которые уже обозначены. Если значение не помечено и , то логическое значение, соответствующее этому значению, истинно, оно присваивает ему новую метку и рекурсивно присваивает все ее соседи (и соседние соседи и т. Д.) Одну и ту же метку.
Вектор этикетки возвращается.
Вышеупомянутый алгоритм работает, но единственное, что использует множественные экземпляры, это пороговые вычисления. Поскольку эта реализация просто собирает все и проверяет ее на координаторе, она скорее поражает точку использования нескольких экземпляров в первую очередь.
- = - = - = -
По существу, этот алгоритм делается в алгоритме разделяй и властвуй автоматически, но подразделения полностью и бесконтрольно случайным образом.
Мы хотим воспользоваться этим разделением, выполнив как развертки CCL на каждом экземпляре, так и объединив эти локальные результаты CCL на координаторе; то есть, если два экземпляра создают группы ярлыков, которые соседствуют друг с другом, мы хотим объединить эти два ярлыка , не просматривая каждое значение снова. Эта курсивная точка - это то, что дает нам наибольшую проблему, и мы скорее теряемся в том, как действовать дальше. Если у кого-то есть предложения либо для алгоритмов, либо для структуры данных, которые были бы хороши для изучения, это было бы высоко оценено.