我有一个整数的排序列表,我希望在常量时间内插入任何元素。我被允许做一些预处理,只要它能让我在恒定的时间内运行这个操作(即,无论我在预处理后重复这个操作多少次,它应该在恒定的时间内运行)。
如何做到这一点?
编辑:我可以想到一些更多的约束条件,使它不那么模糊,而且要解决起来更具挑战性 -
答案 0 :(得分:5)
您可以将整数放入radix tree,将整数视为位字符串。如果基数为2且32位整数列表,则最大树深度为32,这是恒定时间插入的常数因子(通常不会这样做,因为常数因素是基数树可能会大于平衡二叉树的对数因子,加上你需要为基数树做的所有比特都是昂贵的)
答案 1 :(得分:2)
使用LinkedHashMap。确定每个哈希码存储多少个元素(假设整数0-10是哈希(1),整数11-20是哈希(2),依此类推......)
当您读取整数时,计算其哈希值O(1) - >访问hashmap(大致为O(1)) - > insert to list as first element O(1)。 如果要允许重复项,请将列表中的每个元素扩展到自己的列表中,或者为每个元素使用计数器。
答案 2 :(得分:0)
快速转发需要O(log(log(M))时间进行插入/删除/搜索操作,其中M是要存储的域中的最大值。其空间效率为O(n)。