为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第二十一天 随机算法

标签:
算法

学习课程:算法与数据结构

章节名称:第16周 随机算法,外存算法和更多

讲师:Liuyubobobo


课程内容:

随机算法是一个很广的概念

计算机生成的都是伪随机数

如何生成更”随机“的随机数

随机数生成算法PseudoRandom Number Generator


最基础的一次采样

陷阱:模偏差

https://img1.sycdn.imooc.com//633183e40001c1cd14430807.jpg

https://img1.sycdn.imooc.com//63318442000192bf14750806.jpg

加权采样:彩票机制

https://img1.sycdn.imooc.com//6331871a000131e014120833.jpg

Leetcode 528. 按权重随机选择

import random
class Solution:

    def __init__(self, w: List[int]):
        n=len(w)
        self.lst=[0]*n
        self.lst[0]=w[0]
        for i in range(1,n):
            self.lst[i]=self.lst[i-1]+w[i]
    def pickIndex(self) -> int:
        idx=random.randint(1,self.lst[-1])
        return bisect_left(self.lst, idx)

拒绝采样:计算结束期望次数

https://img1.sycdn.imooc.com//63318a040001999b13200795.jpg


https://img1.sycdn.imooc.com//63318a850001388b13350790.jpg

https://img1.sycdn.imooc.com//63318bed000150d814680795.jpg

leetcode 470. 用 Rand7() 实现 Rand10()

class Solution:
    def rand10(self):
        """
        :rtype: int
        """
        while True:
            seed = (rand7() - 1) * 7 + rand7() - 1
            if seed <=39:
                return seed%10+1

Knuth Shuffle 洗牌算法:注意公平性

可以用来解决多次不重复采样问题

https://img1.sycdn.imooc.com//63318d8a0001611514050805.jpg

蓄水池抽样

解决数据流中多次不重复采样问题

类似于TopK

https://img1.sycdn.imooc.com//633196850001647214190826.jpg

https://img1.sycdn.imooc.com//6331977300019a5c14770807.jpg

https://img1.sycdn.imooc.com//633197e50001295714790802.jpg

Leetcode 382 链表随机节点 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
import random
class Solution:

    def __init__(self, head: Optional[ListNode]):
        self.head=head

    def getRandom(self) -> int:
        ans=self.head.val
        cur=self.head.next
        cnt=1
        while cur:
            if random.randint(0,cnt)==0:            
                ans=cur.val
            cur=cur.next
            cnt+=1
        return ans

学习收获:

所有的算法的oj仅仅是学习算法的工具,关键还是要了解每一个算法的原理,很多可以AC的代码不一定就是正确的。

要注意封装的程序不受外部输入的影像,同时也不要让封装的程序影响到外部的输入;尤其是引用类型的数据。

系统设计中的算法问题值得研究,因为他是用计算机思维去解决计算机工程上的问题,他比oj题更有意义。


打卡截图:

https://img1.sycdn.imooc.com//633181450001030714310799.jpg

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消