您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

字节跳动面试必会:快速选择算法,TopK问题最优解

时间:2020-06-30 15:48:07  来源:  作者:

在面试字节跳动的过程中,现场写算法代码是绕不开的一个环节。其中快速排序(Quick Sort)、快速选择(Quick Select)是最常见的算法题之一。快速选择是目前解决TopK问题的最优算法,如果想拿下字节跳动的offer,快速排序算法是必须要掌握的算法之一!

字节跳动面试必会:快速选择算法,TopK问题最优解

 

开篇先出到面试题,请读者思考一下可能的解法:

给你一个无序数组,请找出其中第K大的数,时间复杂度控制在O(N)。

如果不对时间复杂度加约束的情况下,该题有很多种可能解法,例如:

  • 用任意一种性能不错的排序算法先将数组进行排序,然后从中找到位置k的数值。但即便用当前最好的排序算法,时间复杂度也是在O(n·log n)的级别,不符合题目要求。
  • 用大顶堆算法,仅保留K个最大的值。这种算法的时间复杂度虽然优于前面一种,但时间复杂度也是O(n·log k)的级别,依然不满足题目要求。

因此,为了达到题目中要求,就必须要引出今天的主角:快速选择算法(Quick Select)。快速选择算法是目前解决TopK问题的最优解。其核心思想和快速排序类似,因为这两个经典算法的提出者都是同一个人——C.A.R.Hoare。

快速选择的执行步骤是先从数组中随机选择一个元素作为pivot,然后遍历数组,将<pivot的元素都放在pivot左侧,≥pivot的元素都放在pivot右侧。如此遍历完以后,如果要找第k大的数,可以判断pivot两侧元素个数。假设pivot右侧元素个数≥k可推断出,第k大的数一定在pivot右侧的元素中,因此拿pivot右侧部分作为新数组重新进行一轮找出第k大元素的快速选择即可。若pivot右侧元素个数<k,可知,第k大的数一定在pivot左侧,因此以pivot左侧所有元素作为新数组,重新进行一轮快速选择,但是k的值就变为k-右侧元素个数,因为最大的若干个元素都在pivot右侧中,所以要从k中减去这些右侧元素的个数。

以下是一个快速选择的示例:

字节跳动面试必会:快速选择算法,TopK问题最优解

 


字节跳动面试必会:快速选择算法,TopK问题最优解

 

以下是基于JAVA实现的快速选择的代码,仅供参考:

public int findTopK(int[] nums, int k, int start, int end) {
        if (k <= 0) {
            throw new IllegalArgumentException("K can not less than 1!");
        } else if (k > (end - start + 1)) {
            throw new IllegalArgumentException("K out of range! start = " + start + ", end = " + end + ", k = " + k);
        }

        if (k == 1) {
            int max = Integer.MIN_VALUE;
            for (int i = start; i <= end; i++) {
                max = Math.max(max, nums[i]);
            }
            return max;
        }

        int rand = new Random().nextInt(k);
        int tmp = nums[end];
        nums[end] = nums[start + rand];
        nums[start + rand] = tmp;
        int pivot = nums[end];

        int l = start, r = start;
        while (r < end) {
            if (nums[r] > pivot) {
                r++;
            } else {
                tmp = nums[r];
                nums[r] = nums[l];
                nums[l] = tmp;
                l++;
                r++;
            }
        }

        tmp = pivot;
        nums[end] = nums[l];
        nums[l] = tmp;

        if (start + (end - start + 1) - l >= k) {// 若右侧(含l)数量≥k
            return findTopK(nums, k, l, end);
        } else {// 右侧(含l)数量不足k
            return findTopK(nums, k - (end - l + 1), start, l - 1);
        }
    }

快速选择的时间复杂度是O(n),推论依据是快速选择每次遍历的元素个数预期都会减半,因此全部要遍历的元素个数是:

Sn = n + n/2 + n/4 + …… + 1

这是一个典型的等比数列求和,套用等比数列求和公式可得:

Sn = n + n/2 + n/4 + …… + 1 = (a1 - an · q) / (1 - q)= (n - 0.5) / 0.5 = 2n - 1

去除不必要的常数,仅保留数量级之后可得,快速排序的预期时间复杂度是O(n)


现如今互联网求职竞争越发激烈,难度越发困难,如果不做好充足的复习,很可能会丧失宝贵的面试机会!关注我,定期高频更新优质面试宝典,帮助你在职场中平步青云,斩获理想offer!



Tags:快速选择算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在面试字节跳动的过程中,现场写算法代码是绕不开的一个环节。其中快速排序(Quick Sort)、快速选择(Quick Select)是最常见的算法题之一。快速选择是目前解决TopK问题的最优算...【详细内容】
2020-06-30  Tags: 快速选择算法  点击:(331)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条