假设我有一对项目和计数对的列表,例如
import turtle
turtle.up()
turtle.goto(0, -100) # center circle around origin
turtle.down()
turtle.begin_fill()
turtle.fillcolor("yellow") # draw head
turtle.circle(100)
turtle.end_fill()
turtle.up()
turtle.goto(-67, -40)
turtle.setheading(-60)
turtle.width(5)
turtle.down()
turtle.circle(80, 120) # draw smile
turtle.fillcolor("black")
for i in range(-35, 105, 70):
turtle.up()
turtle.goto(i, 35)
turtle.setheading(0)
turtle.down()
turtle.begin_fill()
turtle.circle(10) # draw eyes
turtle.end_fill()
turtle.hideturtle()
turtle.done()
我对列表相对较短但计数总和很大的情况感兴趣;我现在看的具体案例有不到10,000个不同的项目,但总数超过4500万。
我想要一个相当大的随机样本项目,比如500万,没有替换。这样做的算法是什么,需要样本大小小于线性的空间,样本大小的时间小于线性?
相比之下,对每个项目应用一次加权选择函数的天真方法显然需要时间至少与样本大小成线性关系,因为您需要500万个项目的500万加权选择。
Python解决方案的额外功劳。
编辑以强调这与典型的加权选择问题有何不同:在典型的加权选择问题中,权重不会改变。如果没有从多个集合中进行替换,则可以进行抽样,因为删除项目的计数会减少。这就是为什么你需要做500万加权选择,如果你只有加权选择算法。