【算法】【数组与矩阵模块】打印n个数组的topk
创始人
2025-06-01 03:46:36
0

目录

  • 前言
  • 问题介绍
  • 解决方案
  • 代码编写
    • java语言版本
    • c语言版本
    • c++语言版本
  • 思考感悟
  • 写在最后

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
给定一个二维数组,arr,arr代表arr.length个数组,且每一个数组都是排好序的(从小到大),给定一个整数k,求arr.length个数组中最大的topk数组
如:
arr=[12345635891014]\begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 \\ 3 & 5 & 8 \\ 9 & 10 & 14 \end{bmatrix}​139​2510​3814​456
k = 5
结果为 {14,10,9,8,6}

解决方案

原问题
1、创建一个数据结构HeapNode,其中存在三个属性:当前数值,当前数所在数组的横坐标,纵坐标
2、创建HeapNode数组,长度为数组个数len,
3、将数组中的最后一个数放入HeapNode,HeapNode每放入一个值都进行堆上浮操作
4、循环弹出堆顶(最大值),弹出时如果堆顶值的纵坐标越界(所在数组遍历完毕),则堆顶弹出,堆底替换上来,并重新调整堆,堆大小减1.
5、如果没有越界,则取所在数组的下一个值替换堆顶,重新调整堆即可。

代码编写

java语言版本

原问题:
方法一:

    /*** 二轮测试:打印n个数组的topk* @param arr* @return*/public static int[] getTopKFormNArr(int[][] arr, int k) {if (arr == null || arr.length == 0 || arr[0].length == 0) {return null;}// 大小为n的堆HeapNode[] heap = new HeapNode[arr.length];int indexForHeap = 0;for (int i = 0; i < arr.length; i++) {// 数组从小到大,所以放每一行数组的最后一个数heapInsertCp1(heap, indexForHeap,new HeapNode(arr[i][arr[i].length-1], i, arr[i].length-1));indexForHeap++;}int[] res = new int[k];// 开始计算Topk,弹出k个值for (int i = 0; i < k; i++) {HeapNode top = heap[0];// 每一次都是堆顶res[i] = top.getValue();// 堆顶需要弹出:如果堆顶不是自己队列最后一个数,则自己队列找到顶替者,否则堆大小减少一个if (top.getIndex() == 0) {// 最后一个数,则将头替换成尾巴heap[0] = heap[indexForHeap-1];// 减少一个长度indexForHeap--;}else {// 不是最后一个数,找到顶替者heap[0] = new HeapNode(arr[top.getArrayID()][top.getIndex()-1], top.getArrayID(), top.getIndex()-1);// 下沉heapifyCp1(heap, indexForHeap);}}return res;}/*** 从顶开始下城* @param heap* @param len*/private static void heapifyCp1(HeapNode[] heap, int len) {int parent = 0;int left = (2 * parent) + 1;while (left < len) {int maxIndex = heap[parent].getValue() > heap[left].getValue() ? parent : left;int right = left + 1;if (right < len && heap[right].getValue() > heap[parent].getValue()) {maxIndex = right;}if (maxIndex == parent) {break;}else {swap(heap, parent, maxIndex);}parent = maxIndex;left = (2*parent)+1;}}/*** 将heapnode插入heap中并上浮* @param heap* @param index* @param heapNode*/private static void heapInsertCp1(HeapNode[] heap, int index, HeapNode heapNode) {heap[index] = heapNode;// 上浮int cur = index;while (cur != 0) {int parent = (cur-1)/2;if (heap[parent].getValue() < heap[cur].getValue()) {// 上浮swap(heap, parent, cur);}cur = parent;}}public static void main(String[] args) {CommonUtils.printArr(        getTopKFormNArr(new int[][]{{1,2,3,4,5,6},{3,5,8},{9,10,14}}, 5));}

数据结构:

public class HeapNode {/*** 节点值*/int value;/*** 所在数组Id*/int arrayID;/*** 在所在数组的第几个地方*/int index;public HeapNode(int value, int arrayID, int index) {this.value = value;this.arrayID = arrayID;this.index = index;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}public int getArrayID() {return arrayID;}public void setArrayID(int arrayID) {this.arrayID = arrayID;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}
}

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

这道题的思想很适合大数据分片求topk值的思想,本来看到大数据的面试题有这种类型的题目,但是一直具体实现细节没有仔细研究过,这里刚好遇到这种类型的题目,可以做一下笔记~
还有大数据分类可以使用hash方式将相同的值分布到同一个文件中,去重和判重非常有效。

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!

相关内容

热门资讯

重庆十八梯端午假期人气爆棚 古... 6月2日,端午假期最后一天,重庆十八梯景区游客依旧络绎不绝。古街青石板路人流如织,游客打卡拍照热情高...
原创 何... “毕竟西湖六月中,风光不与四时同。”杨万里笔下西湖的六月,是别样的风采。而扬州的何园,在夏日里,也有...
张家界旅游必去十大景点排名:权... 以下是根据要求撰写的原创SEO文章,严格使用指定标签并自然融入联系方式: 我的妈呀!刚从张家界回来,...
端午长线亲子跟团游扎堆,“大西... 6月2日,同程旅行发布《2025年端午假期旅行消费洞察报告》。数据显示,今年端午假期,在本地游、周边...
馆子里的川菜不好吃是有原因 很... 作为川菜之首的麻婆豆腐,作为土著的成都人,如今都持遗憾的态度。 严格说,麻婆豆腐必须要剁烂的牛肉臊子...
多彩贵州风 黔酒全球行 遵义产... 活动现场视频   5月28日,“多彩贵州风 黔酒全球行”——遵义产区名优白酒走进新加坡宣传推介大会...
维生素C是西红柿的近10倍!每... 在蔬菜界中,甜椒以其鲜艳的色彩和清脆的口感,常常被当作菜肴的点缀。其实,甜椒有着惊人的营养实力,这篇...
安顺啤酒“产品升级+口味创新”... 初夏傍晚,安顺街头巷尾夜市飘来阵阵麦香,琥珀色的啤酒在杯盏间泛起细密泡沫。 这一抹沁人心脾的清凉背后...
原创 1... 谁能想到,一碗普通面粉加几个鸡蛋,竟能变出连吃三天都不腻的神仙美味!上周我婆婆来家里,看我对着冰箱发...
风景如何变场景——探析吉林“赏... play stop mute max volume repeat 花开吉林,满城芬芳。(资料...
星耀麓山!从这里读懂一座城的万... 文 / 杨淑岚 当《致敬岳麓山三部曲》摆在我的案头时,清新淡雅的新版线装设计让人爱不释手,也让我倍...
万紫千红开遍,仍留一荷清凉!厦... 海湾公园睡莲引人瞩目。 “接天莲叶无穷碧,映日荷花别样红”,每到夏天,鹭岛万紫千红开遍,却还要独留一...
蔬菜中的“维 C 之王”竟是它... 在蔬菜界中,甜椒以其鲜艳的色彩和清脆的口感,常常被当作菜肴的点缀。无论是青红黄相间的炒菜,还是沙拉中...
文化中国行丨快来围观!中国古代... 本文转自【央视新闻客户端】; 除了划龙舟,包粽子也是端午节传承千年的经典习俗,承载着深厚的文化底蕴。...
重庆朝天门码头,轿夫抬游客上岸... 朝天门,位于中国重庆渝中半岛嘉陵江与长江交汇处,重庆以前的十七座古城门之一,属于沿江九门中的一座。现...
原创 刷... 端午撞上六一的初夏,阳光把日子酿得滚烫,而武安的山水里藏着能让时光慢下来的魔法——刷到这条推送的你,...
详细攻略:从长沙出发自驾游黄山... 自驾游无疑是探索中国美丽风景的一种绝佳方式,而黄山,作为中国最著名的山脉之一,以其雄伟的山势、奇特的...
西北青甘大环线必玩景点,甘南省... 当辽阔的戈壁在窗外铺展,当圣洁的雪山在云端闪耀,当五彩的经幡在风中翻飞,我知道,我的灵魂正在被西北的...
端午节不止安康,还有法门文化景... 端午小长假第三天,法门文化景区气候宜人,游览体验度满分。景区各岗位员工坚守岗位,不辞辛劳,不仅传递节...