zoukankan      html  css  js  c++  java
  • 为了工作必须弄死面试算法题

    1.蓄水池抽样问题

    '''
    经典面试题分析:蓄水池抽样.
    题目:要求从N个元素中随机的抽取k个元素,其中N无法确定。只能扫描一次数据
    '''
    
    '''
    分析:
    1.如果题目的N给定了,那么算法是把1到N这些整数shuffle一下,
      然后按照这个index取前k个即可.效率是O(N**2)的.但是由于只读取了k次数据.
      当读取数据一次很慢时候,这个效率可以.
    2.回归这个题目,他要求N无法确定.
      只需要:
      1.把前k个数按顺序放一个数组里面.
      2.对于第k+1个数.randint(1,k+1)如果rand出来的数在(1,k)里面,那么k+1位置的数与
        数组中rand出来的这个index的数交换.
      3.后面类似.对于第k+i个数就randint(1,k+i)............
      所以:一共randint跑了N次.数据也只扫描了一次.
    '''
    import random
    def savirior_sampling(data,k):#从data里面抽样k个元素,data这里用数组来模拟
        output=data[:k]
        #模拟不知道数组的长度所以用try来做
        index=k
        while 1:
            
            try:
              
                
                obj=random.randint(0,index)
                if obj <k:
                    output[obj]=data[index]
                index+=1
            except:
                
                return output
    #下面进行代码测试
    a=[0]*11
    for i in range(100000):
     tmp=savirior_sampling([1,2,3,4,5,6,7,8,9,10],3)
     for i in tmp:
         a[i]+=1
    print (a[1:])   #[1523, 1499, 1456, 1478, 1481, 1519, 1539, 1466, 1549, 1490]
    #所以我们基本可以说这个是等概率的.
    
    
    
    
    
    
    
    
    
        
    View Code
  • 相关阅读:
    NFS与通配符
    yum管理RPM包与linux网络设置
    git常用命令总结——覆盖日常开发全操作
    inner join on会过滤掉两边空值的条件
    入园第一天
    P3750 [六省联考2017]分手是祝愿 题解
    CSP2021 爆零记
    CSP 前模板记录(黄题篇)
    对拍
    2021.10.20CSP模拟模拟赛 赛后总结
  • 原文地址:https://www.cnblogs.com/zhangbo2008/p/8684109.html
Copyright © 2011-2022 走看看