算法给小码农TopK重瞳双目

简介: 算法给小码农TopK重瞳双目

文章目录


Topk

在n个数中找出最大的前K个 or 在n个数中找出最小的前K个

(n>K)


1000个数中找到最大的前十个

方式1:

先排降序,前十个就是最大的。时间复杂度O(N*log2N)

方式2:

N个数依次插入大堆,PopK次,每次取堆顶的数据就是最大的前K个。时间复杂度O(N+log2N)(下篇证明)

方式3:

假设N非常大,N是10亿,内存中存不下这些数,他们存在文件中,k是100。那么方式1与方式2就都不可以用了。时间复杂度 O(K+(N-K)log2K)

10亿整数我们看看大概消耗多少空间

1.用前K个数建立一个K个数的小堆

2.用剩下的N-K个数,依次跟堆顶的数据进行比较,如果比堆顶的数据大,就去替换堆顶的数据,在向下调整

3.最后堆里面K个数就是最大的K个数

Topk打印函数TopkPrint

void TopkPrint(int* a, int n, int k)
{
  //创建一个堆
  HP hp;
  //堆初始化
  HeapInit(&hp);
  //用前K个数建立一个K个数的小堆
  int i = 0;
  for (i = 0; i < k; i++)
  {
    HeapPush(&hp,a[i]);
  }
  //用剩下的N-K个数,依次跟堆顶的数据进行比较,如果比堆顶的数据大,就去替换堆顶的数据,在向下调整
  //替换就破坏结构了,我们用接口来实现,找到就先pop,然后push大的数就行
  for (i = k; i < n ; i++)
  {
    //堆顶元素小于数组中的数
    if (HeapTop(&hp) < a[i])
    {
      //先把堆顶的数给出掉
      HeapPop(&hp);
      //再插入这个数组中的数进堆 
      HeapPush(&hp, a[i]);
    }
  }
  //然后打印堆即可
  HeapPrint(&hp);
  HeapDestroy(&hp);
}


没有修改的接口见 算法给小码农堆魂器–铁血柔情

改掉的接口

向上调整函数

//向上调整函数
void AdjustUp(HPDataType* a, int size, int child)
{
  assert(a);
  int parent = (child - 1) / 2;
#if HEAP
  while (child > 0)
  {
    if (a[parent] < a[child])//父亲小于孩子就交换(大堆)
    {
      Swap(&a[parent], &a[child]);
      //交换好后重新称呼一下孩子与父亲
      child = parent;
      parent = (child - 1) / 2;
    }
    else
    {
      break;
    }
  }
#elif !HEAP
  while (child > 0)
  {
    if (a[parent] > a[child])//父亲大于孩子就交换(小堆)
    {
      Swap(&a[parent], &a[child]);
      //交换好后重新称呼一下孩子与父亲
      child = parent;
      parent = (child - 1) / 2;
    }
    else
    {
      break;
    }
  }
#endif // HEAP
}

向下调整函数

//向下调整函数
void AdjustDown(HPDataType* a, int size, int parent)
{
  assert(a);
  //创建一个孩子变量,有两个孩子就在这个上加1就行
  int child = parent * 2 + 1;
#if HEAP
  while (child < size)
  {
    //选大孩子
    if (child + 1 < size && a[child] < a[child + 1])
    {
      child++;
    }
    //大的孩子还大于父亲就交换
    if (a[child] > a[parent])
    {
      Swap(&a[child], &a[parent]);
      parent = child;
      child = parent * 2 + 1;
    }
    else
    {
      break;
    }
  }
#elif !HEAP
  while (child < size)
  {
    //选小孩子
    if (child + 1 < size && a[child] > a[child + 1])
    {
      child++;
    }
    //小的孩子还小于父亲就交换
    if (a[child] < a[parent])
    {
      Swap(&a[child], &a[parent]);
      parent = child;
      child = parent * 2 + 1;
    }
    else
    {
      break;
    }
  }
#endif // HEAP  
}

然后在Heap.h文件中加入

//0 大堆模式  1小堆模式
#define HEAP   0       


目录
相关文章
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
7月前
|
存储 机器学习/深度学习 算法
数据结构与算法⑬(第四章_中_续二)堆解决Topk问题+堆的概念选择题
数据结构与算法⑬(第四章_中_续二)堆解决Topk问题+堆的概念选择题
58 3
|
7月前
|
算法 C++
算法--topk问题
该文介绍了TopK问题的两种解决方案:大小根堆和快排分割。使用大根堆可以找到前K小的元素,小根堆则用于找到前K大的元素。示例代码展示了如何用C++实现这两个方法。快排分割通过不断调整数组结构,找到第K大或第K小的元素。文章提供了相应的代码示例及输出结果。
40 0
|
7月前
|
算法
堆排序+TopK问题——“数据结构与算法”
堆排序+TopK问题——“数据结构与算法”
|
传感器 机器学习/深度学习 人工智能
超全汇总 | 基于Camera的3D目标检测算法综述!(单目/双目/伪激光雷达)
目前3D目标检测领域方案主要包括基于单目、双目、激光雷达点云、多模态数据融合等方式,本文主要介绍基于单目、双目和伪激光雷达数据的相关算法,下面展开讨论下~
超全汇总 | 基于Camera的3D目标检测算法综述!(单目/双目/伪激光雷达)
|
传感器 机器学习/深度学习 人工智能
史上最全综述 | 3D目标检测算法汇总!(单目/双目/LiDAR/多模态/时序/半弱自监督)(下)
近年来,自动驾驶因其减轻驾驶员负担、提高行车安全的潜力而受到越来越多的关注。在现代自动驾驶系统中,感知系统是不可或缺的组成部分,旨在准确估计周围环境的状态,并为预测和规划提供可靠的观察结果。3D目标检测可以智能地预测自动驾驶车辆附近关键3D目标的位置、大小和类别,是感知系统的重要组成部分。本文回顾了应用于自动驾驶领域的3D目标检测的进展。
史上最全综述 | 3D目标检测算法汇总!(单目/双目/LiDAR/多模态/时序/半弱自监督)(下)
|
算法 固态存储 计算机视觉
双目测距 BM算法 Python版
首先进行双目定标,获取双目摄像头内部的参数后,进行测距。本次的双目视觉测距,基于BM算法。
230 0
|
存储 算法 数据处理
提高数据处理效率的有力工具:TopK算法解析
提高数据处理效率的有力工具:TopK算法解析
244 0
提高数据处理效率的有力工具:TopK算法解析
|
算法 搜索推荐
最优商品topk排名算法
最优商品topk排名算法
85 0
|
算法
【数据结构与算法】堆的应用:堆排序和topk问题
【数据结构与算法】堆的应用:堆排序和topk问题
84 0
下一篇
DataWorks