F # Set.union выполнение порядка аргументов - PullRequest
3 голосов
/ 07 октября 2011

Есть ли какой-нибудь рекомендуемый способ вызвать Set.union, если я знаю, что один из двух наборов будет больше, чем другой?

Set.union large small

или

Set.union small large

Спасибо

Ответы [ 3 ]

6 голосов
/ 08 октября 2011

Внутри наборы представлены в виде сбалансированного дерева (вы можете проверить источник онлайн ).При вычислении объединения множеств алгоритм разбивает меньший набор (дерево) на основе значения из корня большего набора (дерева) на набор меньших и набор более крупных элементов.Разделение всегда выполняется на меньшем наборе, чтобы выполнять меньше работы.Затем он рекурсивно объединяет два левых и правых подмножества и выполняет некоторую перебалансировку.

Суммарный результат равен , алгоритм на самом деле не зависит от того, какой из наборов является первым, а какой изим это второй аргумент.Он всегда будет выбирать лучший вариант в зависимости от размера набора (который хранится как часть структуры данных).

1 голос
/ 08 октября 2011

Цель вашего вопроса, похоже, повысить производительность при использовании Set.union за счет использования недокументированных возможностей этой реализации функции. Но Set.union абстрагирует вас от сложности реализации, оставляя только теоретико-множественное значение операции union , которая является независимой , для свойств аргумента. Умышленное нарушение этого уровня абстракции отрицательно влияет на сложность и удобство сопровождения вашего кода, и его следует избегать.

Хотя иногда у вас нет выбора, кроме как иметь дело с неплотными абстракциями , Set.union определенно не тот случай. И хорошо, что услышит от Томаса , что реализация Set.union не имеет недостатков в вытекающей абстракции.

0 голосов
/ 07 октября 2011

Делай что хочешь. Вы также можете сделать small + large и large - small для разницы (конечно, также small - large).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...