# An online parallel algorithm for finding top K elements

Suppose we have a function on GPU which calculates elements of array from which we need to select top K elements. The number of elements can be quite big so we can't store them in memory and our algorithm should be online. Another requirement for algorithm is its good parallelization so it could be effectively run on GPU.

Is there any classic approach for the problem? I've thought only of building heap/balanced tree with $k$ elements and inserting new elements into it if new elements is better than existing and popping smaller element. It gives O($n$ log$k$) but it fails with parallelisation because requires synchronization between GPU threads on modifying tree.

• did you end up implementing this kind of an algorithm on a GPU? If so, I would be very interested, and even though it's not perfectly on topic, you could add a link... I need something like this myself (although being on-line is not strictly necessary) for my DBMS-related work (shameless plug). – einpoklum - reinstate Monica Aug 12 '16 at 20:08
• Also, note that this is a very different problem when k << n and when k is some constant fraction of n. – einpoklum - reinstate Monica Aug 12 '16 at 20:18

Let the number of parallel processes be $m$. Then, keep a separate buffer/heap/balanced tree for each of the $m$ processes. Divide the range of input into $m$ sections. Whenever you read a number, insert it into the appropriate process' heap. This way, each process only works on its own heap/tree. When you are done with the input, and want to output the top $k$ elements, do a partial mergesort to find the overall top-k.
This will require $O(km)$ space and $O(n\log k + km\log k)$ time.