Я вижу 3 разных решения.Все они имеют одинаковую сложность O (N * logN).
1.
Сохранять элементы, если bar
в двоичном дереве (std::map
).Затем для каждого элемента в foo
вам нужно найти до двух ограничивающих элементов и выбрать лучший из них.
Построение дерева - O (N * logN), второй проход - O (N* logN) * 1010 *
2.
То же, что и выше, за исключением того, что вместо использования двоичного дерева вы можете использовать отсортированный массив.Создайте массив, каждый элемент которого состоит из элемента bar
и его индекса (в качестве альтернативы ваш массив должен содержать указатели на элементы bar
).Затем вместо поиска по дереву вы будете выполнять поиск по массиву.
С точки зрения сложности это почти то же самое.Однако практически поиск в отсортированном массиве, вероятно, будет несколько быстрее.
3.
Сортировка foo
и bar
.(Тем не менее, вам снова нужно будет иметь оригинальный индекс в вашем отсортированном массиве или просто хранить указатели на исходные элементы.
Теперь для каждого элемента в отсортированном foo
вам не нужно делатьполный поиск в bar
. Вместо этого вы должны только проверить, должны ли вы оставаться в текущей позиции в отсортированном bar
или двигаться вперед.