继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

zengxing358
关注TA
已关注
手记 46
粉丝 2
获赞 0

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

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

讲师:Liuyubobobo


课程内容:

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

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

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

随机数生成算法PseudoRandom Number Generator


最基础的一次采样

陷阱:模偏差

http://img.mukewang.com/633183e40001c1cd14430807.jpg

http://img1.mukewang.com/63318442000192bf14750806.jpg

加权采样:彩票机制

http://img4.mukewang.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)

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

http://img2.mukewang.com/63318a040001999b13200795.jpg


http://img2.mukewang.com/63318a850001388b13350790.jpg

http://img3.mukewang.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 洗牌算法:注意公平性

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

http://img2.mukewang.com/63318d8a0001611514050805.jpg

蓄水池抽样

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

类似于TopK

http://img4.mukewang.com/633196850001647214190826.jpg

http://img.mukewang.com/6331977300019a5c14770807.jpg

http://img1.mukewang.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题更有意义。


打卡截图:

http://img1.mukewang.com/633181450001030714310799.jpg

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP