algorithm - 确定性地将集合分箱成子集
问题描述
我有一组无序的n
唯一正整数。我想以一种确定的方式将它划分为最多为数字 ( ) 的ceil(n / k)
无序集(我想获得相同输出集的序列,而不依赖于输入的固定顺序)。k
k << n
ceil(n / k)
有没有一种方法可以在算法复杂性方面对集合进行排序和对结果序列进行分区?
解决方案
这是一种方法,其平均性能为O(n)
, 节拍O(n log(n))
。
选择m
,r < m < n
其中r = ceil(n / k)
是桶的数量。对于每个数字,将其散列并放入其中一个m
袋子中。(我故意使用袋子和水桶,袋子更小。)这是一项O(n)
任务。现在我们可以r
通过遍历m
袋子来构建我们的桶,当把桶装满时,我们可以快速选择一个m
袋子。跑过那些包是,O(m)
把它们放进去,然后用 quickselect 把包分割在一个边界上,这肯定是包含在里面的。r
O(n)
r-1
O(r * (n/m))
O(n)
推荐阅读
- django - Visual Studio Code 和 Django:导入用户模型时出错
- types - 在研究简单类型的 Lambda 微积分时发现了哪些奇怪的方程
- python - 加载多个目录的 Pythonic 方式
- selenium - 使用 python 和 selenium 从 svg 中提取文本
- azure-machine-learning-service - 在 Cartpole 示例中可以使用 SAC 代替 PPO 吗?
- r - CRSM 不适用于得分范围为 0 到 100 的数据
- javascript - jQuery点击功能问题
- c - 为什么第一个 for 循环没有在代码块中执行?
- scala - 当转换不是 1:1 而是 1:many 时如何创建 Spark DataSet
- javascript - 将参数传递给回调函数的正确方法是什么?