Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Распараллелить поиск в неупорядоченных данных


Автор: andrey2185 22.9.2022, 23:47
Здорово теоретики, можно ли распараллелить подобную задачу?

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

Вот для наглядности код на julia, который выполняет эту задачу в одном цикле в одном потоке:

Код

# for example
A = Int32[2, 3, 3, 15, 4, 4, 8, 32, 9, 9, 9, 13, 14]
B = Int32[1, 4, 5, 6, 7, 9, 10, 15, 23, 54]

limit = 10

sortA = sort(A)
inds = sortperm(sortperm(A))

sortR = zeros(Int32, length(A))

b = 1
for i = 1 : length(sortA)
    while B[b] < sortA[i]
        b += 1
        if b == length(B)
            break
        end
    end
    if B[b] <= (sortA[i] + limit)
        sortR[i] = B[b]
    end
end
R = sortR[inds]

# result:
R == [4, 4, 4, 15, 4, 4, 9, 0, 9, 9, 9, 15, 15]  # -> true



Автор: andrey2185 24.9.2022, 11:35
решение - поэлементно для А выполнять бинарный поиск в В

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)