数据结构:Top-K问题详解

ops/2025/3/3 23:22:18/

一.Top-K问题

#include<stdio.h>
//先自主创建n个数据
void CreateNDate()
{// 造数据int n = 100000;srand(time(0));//表示随时间初始化随机生成数的种子const char* file = "data.txt";///创建一个文件FILE* fin = fopen(file, "w");//“只写”写入创建的数据if (fin == NULL){perror("fopen error");return;}for (int i = 0; i < n; ++i){int x = (rand() + i) % 1000000;//生成n个100000以内的数据fprintf(fin, "%d\n", x);//写入文件}fclose(fin);//关闭文件
}
void topk()
{printf("请输⼊k:>");int k = 0;scanf("%d", &k);const char* file = "data.txt";FILE* fout = fopen(file, "r");//只读条件下从文件内读取数据if (fout == NULL){perror("fopen error");return;}int val = 0;int* minheap = (int*)malloc(sizeof(int) * k);if (minheap == NULL){perror("malloc error");return;}for (int i = 0; i < k; i++){fscanf(fout, "%d", &minheap[i]);//先在动态申请的数组里暂时插入k个数据}// 建k个数据的⼩堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(minheap, k, i);//向下调整算法,}int x = 0;while (fscanf(fout, "%d", &x) != EOF){// 读取剩余数据,⽐堆顶的值⼤,就替换他进堆if (x > minheap[0]){minheap[0] = x;AdjustDown(minheap, k, 0);}}for (int i = 0; i < k; i++){printf("%d ", minheap[i]);}fclose(fout);
}//向下调整算法(具体函数内部结构参数可以参考我上一篇文章,即二叉树的数组结构)
void AdjustDown(HP* hp, int parent, int n)//n是向下调整的下界范围
{int child = parent * 2 + 1;//公式while (child < n){//建小根堆if (child + 1 < n && hp->arr[child + 1] < hp->arr[child])//child+1的目的是确保两个孩子结点都是有意义的结点{child++;}if (hp->arr[parent] > hp->arr[child]){swap(&hp->arr[parent], &hp->arr[child]);parent = child;child = parent * 2 + 1;}else{//我最小的孩子都比父节点大,那么这个堆就是正常堆了,直接退出break;}}
}


http://www.ppmy.cn/ops/162895.html

相关文章

Android15 Camera HAL Android.bp中引用Android.mk编译的libB.so

背景描述 Android15 Camera HAL使用Android.bp脚本来构建系统。假设Camera HAL中引用了另外一个HAL实现的so &#xff08;例如VPU HAL&#xff09;&#xff0c; 恰巧被引用的这个VPU HAL so是用Android.mk构建的&#xff0c;那Camera HAL Android.bp在直接引用这个Android.mk编…

git clone的时候出现出现error

报错如下&#xff1a; Collecting githttps://github.com/haotian-liu/LLaVA.git Cloning https://github.com/haotian-liu/LLaVA.git to /tmp/pip-req-build-360q6tt1 Running command git clone --filterblob:none --quiet https://github.com/haotian-liu/LLaVA.git /t…

《国密算法开发实战:从合规落地到性能优化》

前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…

设计模式Python版 观察者模式

文章目录 前言一、观察者模式二、观察者模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组…

深度解读Grok-2:新一代AI大模型的崛起

随着人工智能技术的飞速发展&#xff0c;越来越多的创新型大语言模型&#xff08;LLM&#xff09;开始涌现。Grok-2&#xff0c;作为OpenAI的后继版本之一&#xff0c;在技术和应用上都表现出了强大的潜力。本文将深入解析Grok-2大模型的技术架构、发展历程、功能特性、应用场景…

【Docker】使用Docker搭建-MySQL数据库服务

零、更换Docker镜像源 因为国内现在封锁了Docker默认拉取镜像的站点&#xff08;DockerHub&#xff09;&#xff0c;而且国内大部分Docker镜像站已全部下线&#xff0c;导致现在很多朋友在拉取镜像的时候会出现无法拉取的现象&#xff0c;这时候就需要进行更换Docker镜像源。 可…

缓存穿透,缓存击穿,缓存雪崩

用「银行防盗系统」类比理解缓存问题 一、缓存穿透&#xff08;查无此人攻击&#xff09; 场景&#xff1a;黑客伪造不存在的账户ID频繁查询 类比&#xff1a;小偷用假身份证到银行金库门口反复试开锁 请求 → 缓存 → 不存在 → 数据库 → 不存在&#xff08;每次穿透&#…

kafka小白基础知识

一、Kafka 入门 &#xff08;一&#xff09;Kafka 简介 Kafka 是一个开源的分布式流处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;后来贡献给了 Apache 软件基金会。它被设计用于处理实时数据流&#xff0c;具有高吞吐量、可扩展性、持久性和容错性等特点。Kafka 主要…