假设我给了一组重量加1的重量,我将它们一个接一个地排成一行,制作一系列长度与其重量成比例的箱子。我为每个bin分配一个与其位置对应的整数。
鉴于[0,1]中的任何数字,我希望能够检查哪个索引对应于此数字所在的bin。我可以在恒定时间内提出算法吗?
对数时间解决方案很简单,但我希望更好!
答案 0 :(得分:3)
这可以使用alias method来完成,{{3}}可用于在时间O(1)中从离散分布生成随机样本。我相信您可以通过简单地反转变换来调整此算法来解决您的问题,这样您就可以从一个离散的桶映射到一个统一的变量,而不是从一个统一的随机变量映射到一个离散的桶。从那里,您可以确定值落入哪个存储桶。
希望这有帮助!
编辑:我最近写了一篇关于别名方法和其他相关技巧的文章。希望这会使算法及其直觉更清晰,更容易!
答案 1 :(得分:0)
创建一个包含k个条目的表,1 / k必须小于最小的条目。 然后在表格中填入他们指向的条目,然后你有O(1)。
如果你放松对k的限制,你可以创建一个多阶段查找,其中第一步如上所述,但第二步是线性或对数搜索。然后这变为O(log2(n/k))
。 n/k, k=n => O(log2(1)) = O(1)
?
要查找要使用的表中的哪个条目,它是floor(x * k)