1 简介
在数据挖掘和大数据处理领域,TopK问题是一个常见的问题,它要求从一组数据中找出最大的K个元素。这个问题在很多实际应用中都有出现,比如搜索引擎的关键字提取、推荐系统中的热门商品推荐等。TopK算法因其高效性和实用性,成为算法工程师和数据科学家必须掌握的技能之一。
2 代码实现
template<typename T>
bool TopK(const void *input_tensor_pointer,
size_t input_tensor_size,
std::vector<int64_t> &output_index,
std::vector<float> &output_tensor,
size_t k,
T min_confidence) {
// 使用最小堆来保存 TopK 元素,最小堆的每一个元素为{float confidence, int index}并将使用std::pair来表示
std::priority_queue<std::pair<T, int64_t>, std::vector<std::pair<T, int64_t>>, std::greater<>> min_heap;
// 将数据插入到最小堆中
auto temp_input_tensor_pointer = reinterpret_cast<const T *>(input_tensor_pointer);
for (int64_t i = 0; i < input_tensor_size; i++) {
if (temp_input_tensor_pointer[i] < min_confidence) {
continue;
}
min_heap.emplace(temp_input_tensor_pointer[i], i);
// 如果堆的大小超过 K,弹出堆顶元素
if (min_heap.size() > k) {
min_heap.pop();
}
}
while (!min_heap.empty()) {
output_tensor.emplace_back(min_heap.top().first);
output_index.emplace_back(min_heap.top().second);
min_heap.pop();
}
std::reverse(output_index.begin(), output_index.end());
std::reverse(output_tensor.begin(), output_tensor.end());
return true;
}