首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

topK问题

给定一个字符串数组,让你找出前k个出现次数最多的字符串 比如: 输入: 3 1 2 4 5 6 5 8 6 6 9 输出: No.1:6, times:3 No.2:5, times:2 No...topK个堆元素,恢复堆有序,最后留下的一定是满足条件最大的几个 for (Entry entry : map.entrySet()) {...生成哈希表复杂度O(n), 有n条数据 每次进堆的时候恢复堆有序需要O(logk),因为堆数组是k个,是我们需要排名出来的前k个元素,所以前k次进堆并恢复堆有序时间复杂度为O(klogk) 剩下n-k个元素需要检查更新小顶堆...,时间复杂度O( (n-k)logk ) 接着k个元素堆排序O(klogk) 总的时间复杂度O(n)+2O(klogk)+O( (n-k)logk ) 因为我们排出来的k一般很小,比如10W条数据需要前...20条,那么这个k相遇于n来说可以忽略 所以总体时间复杂度为O(nlogk) k是需要排名列出的前k条记录 n为总体数据量

15010

【算法】TopK问题超详解

O(n) 除了排序以外,实际上还有其他的方法来实现。...首先,对于前面的循环,它将前k个元素依次插入堆中,插入一个元素的时间复杂度是O(logk),而循环执行k次,所以这部分的时间复杂度是O(klogk)。...接下来,对于后面的循环,它从第k+1个元素开始,依次与堆顶元素进行比较。如果当前元素比堆顶元素大,就将堆顶元素替换为当前元素,并进行堆的调整。堆的调整操作的时间复杂度是O(logk)。...这个循环执行了n-k次,所以这部分的时间复杂度是O((n-k)logk)。 综合起来,这个算法的时间复杂度是O(klogk + (n-k)logk)。从数量级上来看,平均的时间复杂度就是:。...当k较小的时候,算法的时间复杂度较低;当k接近n时,算法的时间复杂度较高。 有序地返回TopK 事实上,如果要求我们有序地返回这k个数的话,我们只需多写一个Sort函数即可。

11810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    大数据量获取TopK的几种方案

    时间复杂度:排序一轮是O(N),则K次排序总时间复杂度为:O(KN) 空间复杂度:O(K),用来存放获得的topK,也可以O(1)遍历原数组的最后K个元素即可。...时间复杂度:每次对K个元素进行建堆,时间复杂度为:O(KlogK),加上N-K次的循环,则总时间复杂度为O((K+(N-K))logK),即O(NlogK),其中K为想要获取的TopK的数量N为总数据量...适用环境 多核多机的情况,分治法会将多核的作用发挥到最大,节省大量时间 时间复杂度与空间复杂度 时间复杂度:一份获取前TopK的时间复杂度:O((N/n)logK)。...则所有份数为:O(NlogK),但是分治法我们会使用多核多机的资源,比如我们有S个线程同时处理。则时间复杂度为:O((N/S)logK)。...之后进行快排序,一次的时间复杂度为:O(N),假设排序了M次之后得到结果,则时间复杂度为:O(MN)。所以 ,总时间复杂度大约为O(MN+(N/S)logK) 。

    97920

    第K个最大的数+优化优先队列

    <= 10^5 -104^ <= nums[i] <= 10^4 1.要求时间复杂度为O(n),有两种方法,一种使用优先队列,一种是基于快排的思想 2.这是我写的代码,用的优先队列,但是复杂度不是O(...,把减少的部分尽量换成时间复杂度为O(1)的比较操作,这样假设有m次add,那么有(n-m)次比较,综合起来就是O(klogk)+O(n-k) 题目中要求第K个最大的数,数组长度是N,所以定义堆的时候大小为...K,然后用剩下的N-k个数和堆顶元素比较,最后堆顶即为结果: (1)如果K>2/N,最好做(N-K)次add操作。...第K个最大的数,就是第(N-K)个最小的数,因此用(N-K)大小的最大堆,堆顶就是结果。...1——————K——N (N-K)次add (2)如果KN,最好做K次add操作。用K大小的最小堆,堆顶就是结果。

    16710

    文心一言 VS 讯飞星火 VS chatgpt (83)-- 算法导论8.1 4题

    这个过程可以使用一个双指针来实现,时间复杂度为 O(k)。 接下来,我们需要找到所有子序列的中位数。 对于一个长度为 k 的序列,中位数是第 k/2 个元素。...因此,时间复杂度为 O(n)。 将所有过程的时间复杂度相加,我们得到 O(n*k)/3 + O(n) = Ω(nlgk). 因此,这个排序问题中所需比较次数的下界是 Ω(nlgk)....在这种情况下,我们需要比较的下界是 O(klogk)。这是因为在任何排序算法中,对于长度为 k 的子序列,我们需要至少比较 k 次。 现在,我们考虑长度为 n 的序列。...对于每个子序列的排序,我们需要比较的下界是 O(klogk)。由于我们有 n/k 个子序列,因此总共需要的比较下界是 n/k * O(klogk) = O(nlogk)。...根据大 O 记法,我们可以将 O(nlogk) 表示为 O(nlgk),因为 n 和 logk 都是关于 n 的单调递增函数。

    14340

    算法面试必问:Top K问题浅析

    那么一个常见的做法就是我们对这个数组进行排序,然后返回第K大元素。这样的解法时间复杂度需要 O(N*logN),这是排序所需要的。那可以做的更好吗?...O(logK),我们首先往堆里面插入了K个元素,然后迭代剩余的元素,然后每一步在最坏的情况下,我们都需要进行删除插入操作,我们算法需要的复杂度为O(K∗logK+(N−K)∗logK)。...return new ArrayList(minHeap); } 这时候我们的时间复杂度在O(N∗logK),而因为我们只要在堆中保存元素,空间复杂度在O...最坏情况下,我们要从堆中删除K个元素,从堆中删除一个元素要 O(logN),删K个就要 O(KlogN),所以整体复杂度就在O(N∗logN+KlogN),不过还是能再优化一下的,我们最多也只会在堆中删除...K个元素,因此我们可以只往堆中插入K个元素,其余的想进来就跟堆的根部作比较,删掉一个才能新插入一个,那我们的算法就优化成O(N∗logK+KlogK),空间复杂度比较稳定,在最坏情况下,所有元素都要往哈希表里面存

    49940

    2021-07-30:两个有序数组间相加和的Topk问题。给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1

    2021-07-30:两个有序数组间相加和的Topk问题。给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组。...[要求]时间复杂度为O(klogk)。 福大大 答案2021-07-30: 1.左神方法。大根堆。 时间复杂度:O(klogk)。 空间复杂度:O(k)。 2.我的方法。小根堆。...两个有序数组构成一个二维数组。然后从右下往左上遍历,当遍历数量大于等于k时,停止遍历。见图。 时间复杂度:略大于O(k)。 空间复杂度:O(k)。 ? 代码用golang编写。...) } } type Node struct { index1 int // arr1中的位置 index2 int // arr2中的位置 sum int //...:= 0 maxHeap := make([]*Node, 0) set := make(map[int]struct{}) i1 := N - 1 i2 := M -

    80050

    2021-07-30:两个有序数组间相加和的Topk问题。给定两个

    2021-07-30:两个有序数组间相加和的Topk问题。给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组。...要求时间复杂度为O(klogk)。 福大大 答案2021-07-30: 1.左神方法。大根堆。 时间复杂度:O(klogk)。 空间复杂度:O(k)。 2.我的方法。小根堆。...两个有序数组构成一个二维数组。然后从右下往左上遍历,当遍历数量大于等于k时,停止遍历。见图。 时间复杂度:略大于O(k)。 空间复杂度:O(k)。 [图片] 代码用golang编写。...) } } type Node struct { index1 int // arr1中的位置 index2 int // arr2中的位置 sum int //...:= 0 maxHeap := make([]*Node, 0) set := make(map[int]struct{}) i1 := N - 1 i2 := M -

    33040

    典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,

    综合分析一下,排序的时间复杂度是O(NlgN),而遍历的时间复杂度是O(N),因此该算法的总体时间复杂度就是O(N+NlgN)=O(NlgN)。...思想与上述算法二一致,只是在算法三,我们采用了最小堆这种数据结构代替数组,把查找目标元素的时间复杂度有O(K)降到了O(logK)。       ...总结: 至此,算法就完全结束了,经过上述第一步、先用Hash表统计每个Query出现的次数,O(N);然后第二步、采用堆数据结构找出Top 10,N*O(logK)。...所以,我们最终的时间复杂度是:O(N) + N'*O(logK)。(N为1000万,N’为300万)。...只待循环完毕返回临时数组的K个元素,即是需要的K个最大数。同算法一其平均时间复杂度为O(KLogK + (N - K))。具体代码实现可以自行完成。

    5.5K30

    搞定大厂算法面试之leetcode精讲16.set&map

    两数之和 (easy) 方法1.暴力枚举 思路:两层for循环,第一层for i:0->n-1, 枚举nums中的每一个数x,第二层for j:i+1->n-1,寻找是否存在两个数字的和是target。...复杂度分析:时间复杂度:O(n^2), n为数组的长度。空间复杂度O(1)。...复杂度:时间复杂度O(n*klogk),n是字符串的个数,k是最长的字符串的长度,排序复杂度O(klogk),n次排序,哈希表更新O(1)。...,可以对每个字符串统计其中字符的频次,将每个字符频次相同的字符串放在一组 复杂度:时间复杂度O(n*k),n是字符串个数,k是最长字符串长度,循环字符串数组复杂度O(n),对每个字符串统计频次复杂度O(...空间复杂度O(n*k),map中存放了n个大小最长为k的字符串。

    73550

    49. 字母异位词分组

    题目描述 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。...思路 一个简单的解法就是遍历数组,然后对每一项都进行排序,然后将其添加到 hashTable 中,最后输出 hashTable 中保存的值即可。...这种做法空间复杂度 O(n), 假设排序算法用的快排,那么时间复杂度为 O(n * klogk), n 为数组长度,k 为字符串的平均长度 代码: var groupAnagrams = function...然后我们给每一个字符一个固定的数组下标,然后我们只需要更新每个字符出现的次数。最后形成的 counts 数组如果一致,则说明他们可以通过 交换顺序得到。...这种算法空间复杂度 O(n), 时间复杂度 O(n * k), n 为数组长度,k 为字符串的平均长度. ?

    62010

    面试学习:海量数据的数据结构思想与算法

    最终我们在O(N)的时间复杂度内用Hash表完成了统计;  堆排序:第二步、借助堆这个数据结构,找出Top K,时间复杂度为N‘logK。...即借助堆结构,我们可以在log量级的时间内查找和调整/移动。因此,维护一个K(该题目中是10)大小的小根堆,然后遍历300万的Query,分别和根元素进行对比。...所以,我们最终的时间复杂度是:O(N) + N' * O(logK),(N为1000万,N’为300万)。...维护k个元素的最小堆,即用容量为k的最小堆存储最先遍历到的k个数,并假设它们即是最大的k个数,建堆费时O(k),并调整堆(费时O(logk))后,有k1>k2>...kmin(kmin设为小顶堆中最小元素...继续遍历数列,每次遍历一个元素x,与堆顶元素比较,若x>kmin,则更新堆(x入堆,用时logk),否则不更新堆。这样下来,总费时O(k*logk+(n-k)*logk)=O(n*logk)。

    6810

    数据结构·面试·数组高频题·中位数问题第K大问题等

    暴力法:先跟每一行的最后一个数比较确定其在哪一行(O(n)),再在确定的行中二分查找O(lgm)最优解 O(n), 排除法,见后文。...暴力:先跟每一行的最后一个数比较确定其在哪一行(O(n)),再在确定的行中二分查找O(lgm) 排除法:O(n) 最优解:将输入的二维数组a[i][j]和一维数组b[k]间做单射, b[k] = a[k.../m][k%m], 对长度为mn的b数组做二分查找,O(lg(mn)) 【3*】数组中出现次数超过一半的数字 O(n) ret记录出现次数最多的数,count为其出现的相对次数。...之后的n-k个数逐一和堆顶比较,如果比堆顶大就替换堆顶,然后堆顶元素下沉直到重新成为堆( O(logk) ), 整体 (n-k)*O(logk) 整体时间复杂度O(nlogk), 额外空间 O(k) 额外空间...O(n)的解法: 建立最大堆 O(N) 找数 O(klgN),即堆数组转化为有序数组。

    1.4K20

    从头到尾解析Hash 表算法

    具体过程是,堆顶存放的是整个堆中最小的数,现在遍历N个数,把最先遍历到的k个数存放到最小堆中,并假设它们就是我们要找的最大的k个数,X1>X2...Xmin(堆顶),而后遍历后续的N-K个数,一一与堆顶元素进行比较...,如果遍历到的Xi大于堆顶元素Xmin,则把Xi放入堆中,而后更新整个堆,更新的时间复杂度为logK,如果Xi的复杂度为O(K)+O((N-K)*logK)=O(N*logK...只是算法在算法三,我们采用了最小堆这种数据结构代替数组,把查找目标元素的时间复杂度有O(K)降到了O(logK)。...总结: 至此,算法就完全结束了,经过上述第一步、先用Hash表统计每个Query出现的次数,O(N);然后第二步、采用堆数据结构找出Top 10,N*O(logK)。...所以,我们最终的时间复杂度是:O(N) + N'*O(logK)。(N为1000万,N’为300万)。如果各位有什么更好的算法,欢迎留言评论。

    1K40

    go实现利用最大堆寻找最小k个数

    思路设计 知道了如上定义,我们就可以将容量为K的最大堆存储我们的最小k个数,因此我们仍然可以按照之前的方法假设堆中存储的仍然是最小的k个数(不懂的可以看我的上一篇文章),再通过比较替换或不替换堆来最终找到我们的最小的...此解法与解法二类似但由于使用堆时进行查找或更新的时间复杂度降低到了O(logk),那么通过遍历剩余的n-k个数,那么最坏情况下的时间复杂度为O(k + (n-k)logk) = O(nlogk)。...这里的O(k)为建堆时的时间复杂度。...因此我们需要建堆,通过以上的分析我们可以用一维数组存储我们的堆,我们先来看一个完全二叉树找一下规律 我们将1,2,3,4,5分别作为下标,在上个图片的思路中,我们可以发现每次我们的遍历刚开始指向的是一个由子节点的父节点...因为是同样的操作,因此该过程仍然是一个循环,循环结束的标志是最后一层的叶节点。

    1.1K20
    领券