[数分面经QA] 如何在一个无序数据中合理抽样?

问题:给你有 m 个元素的无序数组,需要抽取 n 个样本,怎样合理抽样?

因为无序数据是相对于有序数组而言的,并不是随机数据,可能存在某些顺序或规律;所以不能直接使用前 n 个元素作为样本。需要使用随机抽样的方法;或者先使用洗牌算法转化为随机数组后,再抽取前 n 个样本。

延伸 1:如果无序数组存储在文件中(元素数未知),有什么随机抽样方法可以尽量小地占用内存空间?

水塘抽样:水塘抽样(应用场景+算法步骤+算法证明+Python实现)

延伸 1 - 1:水塘抽样的时间和空间复杂度是什么?
  • 时间复杂度: O ( m ) O(m) O(m),其中 m m m 为无序数组的元素数量。
  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 为需要抽样的样本数量。
延伸 2:如果后续需要多次抽样,有什么方法可以优化后续抽样的性能?

可以先使用洗牌方法,得到随机数组。如果需要多次抽样,则后续每次抽样只需要指定随机的开始位置,向后抽取连续 n 个样本即可。

延伸 3:有什么高性能的转化为随机序列的方法?

Fisher-Yates 随机洗牌方法:Fisher-Yates洗牌算法(应用场景+算法步骤+算法证明+Python实现+复杂度分析)

你可能感兴趣的:(数据分析面经,抽样,水塘抽样,Fisher-Yates洗牌)