[C++][algorithm] 使用C++实现TopK算法

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值