- 论坛徽章:
- 0
|
每个数字均可用二进制形式表示,例如:32可表示为100000, 48可表示为110000, 12可表示为1100, 3可表示为11 ...。
如果一个数a的二进制表示完全位于另一个数b的二进制表示中的首位,则b被a covered, a covers b。例如48被12和3 covered。
现有n个数,n<2**m,这些数字都是唯一的。需要记录每个数字所cover的数字的集合,例如目前的数字是{32,48,12,3},则3的cover集合是[3,12,48]。现需要完成下列操作。
1)新增一个数a,输出所有变化了的现有数中的cover集合。例如{32,48,12,3}中增加了24 (11000),则输出应为 24: [24, 48], 12: [12, 24, 48], 3: [3,12,24,48]。
2)删除一个数a,输出所有变化了的现有数中的cover集合。例如{32,48,12,3}中增加了删除了12 (1100),则输出应为 3: [3, 48]。
请设计一个需要存储空间最小的算法和一个速度最快算法,并分析它的空间、时间复杂度。
一个我能想到的简单方法是利用binary tree,每个节点用不同的颜色表示其存在或不存在,这样生成一个给定数字的cover集合是O(m)+O(2**m)。O(m)是定位给定数字所需要的操作, 而O(2**m)是寻找一个节点所有存在的children所需要的操作。但这个算法存储空间不小,因为你可能需要存储许多并不存在的节点。 而且时间复杂度也不小。。。。 |
|