Topk问题和秒杀问题

1、Topk问题

(1)从1000个数据中找到k个最大数据

首先看到这个题时,可能会想到先将这1000个数据进行降序排序,即取出的前k个元素最大。时间复杂度为O(N^2),使得程序效率低。

思路:
可先创建一个数组topK[k],将1000中的前k个数据放入数组topK中,将topK中的数据建小堆,则可保证堆的第一个元素是最小的,将第k个元素与堆中第一个元素比较,若大于,则交换。对堆进行重新建小堆,取第k+1个元素与堆中第一个元素比较,以此类推,直至1000-k个元素比较完。则此时堆中的元素就是k个最大数据。

时间复杂度为 k*lgk+N*lgk

当N庞大时,k可忽略,则时间复杂度为O(N),大大提高了效率。

(2)堆排序

既然是排序,那就有两种可能升序or降序。使得堆是建大堆方便还是建小堆方便。

 <1>若为升序,则需要建大堆。

    堆的第一个元素为最大,将最大元素与末尾元素交换,剩下的元素(除末尾元素)向下调整。 

 <2>若为降序,则需要建小堆。

    堆的第一个元素为最小,将最小元素与末尾元素交换,剩下的元素(除末尾元素)向下调整。

2、秒杀问题

有限的商品,有限的资源,相对较大的人数,在某个时刻集中进行访问
要求:一个商品不能卖个两个人;相对来讲公平些,提交早的人先拿到
首先秒杀要有页面,页面有图片和视频等相对较大的静态资源,假如有500k的视频、图片,如果我们把这些存在服务器,一共有两万人同一时间访问这个页面,在这一秒共有多少流量
1000万k----10G,云服务器速度慢
如何解决这个问题
不把图片和视频放到服务器里,CDN(内容分发网络)
对于图片和视频的请求不会直接到服务器里,会导向就近服务节点上
OSS(静态资源存储)

秒杀是短时间内应对大流量的项目,不能说秒杀崩了之后网站崩
有人会提前去抢
要有时间控制,防止有人提前去抢,时间要以服务器为准
20万人,去抢五台机器,大部分的请求是没有用的,所以很多请求可以直接返回,特别是靠后的请求
一台Tomcat每秒500次处理,就算有1万请求也要有20台服务器,如何再优化,少一点
MQ
假如Tomcat来了请求和消息直接放入MQ当中,可以提升Tomcat单个的处理能力,MQ再去慢慢消化掉
MQ消费:如何防止超卖的问题,而且尽快处理
在redis中进行库存扣减,在redis中存一下当前能购买的数量,每消费一次就减一,如果redis中为0了,则后续直接返回失败,可以过滤一批
两个服务器同时都读到了redis的信息,然后-1返回,还是会出现超卖问题
在redis处理后的,再次封装进入第二个队列中,第二个队列只有一个消费者,这之后才是真正的去数据库中去进行商品秒杀的扣减,然后发订单之类的控制
两次队列防止超卖,不加锁是为了尽可能快的处理

适用于秒杀场景的:抢红包、商品秒杀、
红包问题:一对一红包、群红包(涉及,类似)、天降红包雨(类似秒杀)

参考:堆的应用(1000个数据中找最大的前K个元素,堆排序)_一起去看星星的技术博客_51CTO博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值