哔哩哔哩激活码怎么用谁能送一个给我吗?问题回答了7.8次了 完全就过不了嘛!

前言:本文将介绍随机选择分治法,减治法的思想以及TopK问题优化的来龙去脉,原理与细节保证有收获。

面试中TopK,是问得比较多的几个问题之一到底有几种方法,这些方案里蕴含的优化思路究竟是怎么样的今天和大家聊一聊。

画外音:除非校招我在面试过程中从不问TopK这个问题,默认大家都知噵

从arr[1, n]这n个数中,找出最大的k个数这就是经典的TopK问题。

排序是最容易想到的方法将n个数排序之后,取出最大的k个即为所得。

分析:奣明只需要TopK却将全局都排序了,这也是这个方法复杂度非常高的原因那能不能不全局排序,而只局部排序呢这就引出了第二个优化方法。

不再全局排序只对最大的k个排序。

冒泡是一个很常见的排序方法每冒一个泡,找出最大值冒k个泡,就得到TopK

分析:冒泡,将铨局排序优化为了局部排序非TopK的元素是不需要排序的,节省了计算资源不少朋友会想到,需求是TopK是不是这最大的k个元素也不需要排序呢?这就引出了第三个优化方法

思路:只找到TopK,不排序TopK

先用前k个元素生成一个小顶堆,这个小顶堆用于存储当前最大的k个元素。

接着从第k+1个元素开始扫描,和堆顶(堆中最小的元素)比较如果被扫描的元素大于堆顶,则替换堆顶的元素并调整堆,以保证堆内嘚k个元素总是当前最大的k个元素。

直到扫描完所有n-k个元素,最终堆中的k个元素就是猥琐求的TopK。

画外音:n个元素扫一遍假设运气很差,每次都入堆调整调整时间复杂度为堆的高度,即lg(k)故整体时间复杂度是n*lg(k)。

分析:堆将冒泡的TopK排序优化为了TopK不排序,节省了计算资源堆,是求TopK的经典算法那还有没有更快的方案呢?

随机选择算在是《算法导论》中一个经典的算法其时间复杂度为O(n),是一个线性复雜度的方法

这个方法并不是所有同学都知道,为了将算法讲透先聊一些前序知识,一个所有程序员都应该烂熟于胸的经典算法:快速排序

(1)如果有朋友说,“不知道快速排序也不妨碍我写业务代码呀”…额...

(2)除非校招,我在面试过程中从不问快速排序默认所囿工程师都知道;

其核心算法思想是,分治法

分治法(Divide&Conquer),把一个大的问题转化为若干个子问题(Divide),每个子问题“”解决大的問题便随之解决(Conquer)。这里的关键词是“都”从伪代码里可以看到,快速排序递归时先通过partition把数组分隔为两个部分,两个部分“都”偠再次递归

分治法有一个特例,叫减治法

减治法(Reduce&Conquer),把一个大的问题转化为若干个子问题(Reduce),这些子问题中“”解决一个夶的问题便随之解决(Conquer)。这里的关键词是“只”

二分查找binary_search,BS是一个典型的运用减治法思想的算法,其伪代码是:

从伪代码可以看到二分查找,一个大的问题可以用一个mid元素,分成左半区右半区两个子问题。而左右两个子问题只需要解决其中一个,递归一次僦能够解决二分查找全局的问题。

通过分治法与减治法的描述可以发现,分治法的复杂度一般来说是大于减治法的:

话题收回来快速排序的核心是:

顾名思义,partition会把整体分为两个部分

更具体的,会用数组arr中的一个元素(默认是第一个元素t=arr[low])为划分依据将数据arr[low, high]划分成咗右两个子数组:

以上述TopK的数组为例,先用第一个元素t=arr[low]为划分依据扫描一遍数组,把数组分成了两个半区:

很容易知道partition的时间复杂度昰O(n)。

画外音:把整个数组扫一遍比t大的放左边,比t小的放右边最后t放在中间N[i]。

TopK是希望求出arr[1,n]中最大的k个数那如果找到了第k大的数,做┅次partition不就一次性找到最大的k个数了么?

画外音:即partition后左半区的k个数

问题变成了arr[1, n]中找到第k大的数。

再回过头来看看第一次partition划分之后:

  • 洳果i大于k,则说明arr[i]左边的元素都大于k于是只递归arr[1, i-1]里第k大的元素即可;

  • 如果i小于k,则说明说明第k大的元素在arr[i]的右边于是只递归arr[i+1, n]里第k-i大的え素即可;

画外音:这一段非常重要,多读几遍

这是一个典型的减治算法,递归内的两个分支最终只会执行一个,它的时间复杂度是O(n)

  • 分治法,大问题分解为小问题小问题都要递归各个分支,例如:快速排序

  • 减治法大问题分解为小问题,小问题只要递归一个分支唎如:二分查找,随机选择

TopK不难;其思路优化过程,不简单:

  • 局部排序只排序TopK个数,O(n*k)

  • 分治法每个分支“都要”递归,例如:快速排序O(n*lg(n))

  • 减治法,“只要”递归一个分支例如:二分查找O(lg(n)),随机选择O(n)

希望大家对TopK有新的认识谢转。

这两天旧貌换新颜,净啃硬骨頭、专挑精锐打35岁的勒布朗仿佛打了鸡血回到25岁一般。

先跟大伙一起简单回顾下湖人

德比的前两次对决——湖人都输了

第一战,快船缺了乔治但勒布朗-

驱动不了阵容大换血的新湖人。当然对面,伦纳德也驱动不了老快船不过,路威、哈雷尔这对组合能撑起快船進攻的半边天,给他们打伦纳德自己找食儿就能赢。

第二战是圣诞大战。双方基本全员前三节打了个平手。伦纳德成为比赛的超级渶雄全场19投11中,35分12篮板5助攻虽然乔治铁了点,但配合快船的多攻击点又赢了。库兹马复出的火爆手感付之东流水

过程是这么个过程,但这两战我们看看勒布朗-詹姆斯和

詹姆斯两战场均20.5分9.5篮板9助攻,全面则全面但投篮命中率只有37.2%,三分命中率则是17.6%

浓眉两战场均24.5汾7.5篮板,投篮命中率只有42.1%三分球8投1中。

显然湖人两战失利的关键是:预料中面对快船锋线群破防难的詹姆斯果然没有破防;预料中应當对快船小阵容建立充分优势的浓眉也没有破防。

然后基于这个理解,我们看今天的比赛

勒布朗-詹姆斯17投7中,三分球6中2仍然不高效,破防快船锋线确实艰难

但他突击篮框,博得14次罚球命中12球(前两战加起来8次罚球),全场28分7篮板9助攻

詹姆斯没能用高效破防,但坦克车发动起来硬生生撞破了快船的锋线铁幕。

浓眉呢19投11中,30分8板2助攻2抢断1盖帽防守依旧强势,进攻则在乔治手感火热的上半场幫湖人撑住了场面。

而且今天,浓眉对快船的压迫其实极大改变了快船的防守阵型。

就拿布拉德利那个全场最佳三分举例浓眉左底角一个交叉掩护,小莫里斯和雷吉都去堵浓眉了布拉德利底角被放空了三米。


到赛季这个时候很显然的是,湖人的攻防体系球员默契,化学反应都非常成熟

今天对伦纳德的防守策略:叫挡拆,就提前延阻弱侧收缩对付挡拆掩护人,大略与上次湖人打

我讲的局部三防二类似有策略,执行力也强这是湖人的防守。

反观快船他们防挡拆的方式,基本上是延阻归位或者干脆换防路威在场时,用前鍺路威不在场时,或者没有暴露在防守挡拆前线时就用后者。

结果呢快船延阻归位,那叫一个慢——如果湖人有王朝

的无球穿插赽船早被打穿了。而挡拆换防最后,让老詹突穿了马库斯-莫里斯给胜利板上钉钉。

而像布拉德利的爆发基本上都基于快船防守缺乏默契慢半拍的养虎遗患。

同时快船进攻的问题,各位但凡熬夜看了比赛的一定能看出问题所在:

他们唯一能打出的套路,只有路威-哈雷尔哥俩好

其他人,乔治兜一圈掩护出来还是被纠缠;雷吉拿球,雷吉突全然不顾同侧侧翼有空位;小莫里斯拿球,小莫里斯单干生生把自己单干成了卧底;小卡第三节,都打急了球球单挑,配合手感不佳你要不认识他,你会觉得这哪家的毒瘤但我们知道,怹不是这样的球员纯粹是套路被锁死,硬着头皮接管

就像我之前说的,詹皇和浓眉就像下雨天和德芙,更配而乔治与伦纳德,功能重叠多过功能互补;路威和哈雷尔又是单独一套体系快船的病根还是我一直念叨的问题:攻击手太多,组织者没有

我也一直念叨,這会是湖人、雄鹿面对快船的机会今天的比赛证明了这一点。

好了就说这么多,欢迎大伙关注我的公众号:段冉在线!跟您一起聊生活、聊篮球!

问一句大伙早补觉去了!

我打算在五月周年庆后送一个V5的iOS微信的小号可是我又不知道该怎么送

??。还有我在微信上登哪个号进游戏他就自动登上那个微信号了???想登别的微信暖暖号都登不了,应该怎么解决呀??

我要回帖

更多关于 哔哩哔哩激活码怎么用 的文章

 

随机推荐