我正在设计一个如下工作的算法:
假设有N个槽最初是空的并且每个槽都是空的 slot是唯一编号的。
随着时间的推移,物品将到达并存入数字匹配的插槽中 物品的号码。但是,假定物品到达的顺序 随意。
同时,将定期执行合并算法以合并相邻的占用时隙,使得时隙越来越“连接”,并最终成为一个大的占用时隙,此时算法终止。
P.S。我的算法是串行的。合并部分在一定数量后定期激活 新的老虎机被占用了。
答案 0 :(得分:3)
您可能正在寻找基于disjoint-set的内容。
从n
集合开始,每个集合用于空插槽,并在填充两个相邻插槽后“合并”[union]。这可以通过维护每个集合的每个根中的“最高”和“最低”字段来完成。
输入元素后,您需要查找其根[易于使用此数据结构],并将其与set[root.highest+1]
和set[root.lowest-1]
合并 - 如果它们已经“填充”
每个合并还必须修改root.highest和root.lowest字段,但是一旦找到新的根,就可以在O(1)
中轻松完成。
如果您实施disjoint set as forests,算法的初始化时间为O(n)
[其中n
为广告位数],每个插入操作均为O(alpha(n))
其中{ {1}}是反ackerman function,它是次对数。