Java 具有O(log(N))时间复杂度操作的HashMap

Java 具有O(log(N))时间复杂度操作的HashMap,java,algorithm,kotlin,data-structures,Java,Algorithm,Kotlin,Data Structures,我对CodeSignal进行了测试,但无法解决此问题 创建允许以下操作的数据结构。 插入x y-插入具有键x和值y的对象。 获取x-返回具有键x的对象的值。 addToKey x-将x添加到地图中的所有关键点 addToValue y-将y添加到映射中的所有值。 每个操作的时间复杂度应为O(log(N)) 我能够在Java中使用数组和LinkedList创建哈希映射。但我无法将时间复杂度设为O(log(N))。 在我的实现中,insert和get的时间复杂度是O(1)(在最坏的情况下是O(N))

我对CodeSignal进行了测试,但无法解决此问题

创建允许以下操作的数据结构。
插入x y-插入具有键x和值y的对象。
获取x-返回具有键x的对象的值。
addToKey x-将x添加到地图中的所有关键点
addToValue y-将y添加到映射中的所有值。
每个操作的时间复杂度应为O(log(N))

我能够在Java中使用数组和LinkedList创建哈希映射。但我无法将时间复杂度设为O(log(N))。 在我的实现中,insert和get的时间复杂度是O(1)(在最坏的情况下是O(N))。addToKey和addToValue的时间复杂度是O(N),因为我必须迭代所有元素来修改键和值。

对于这个问题,什么样的数据结构才是合适的?

在Vee和Tom Elias的有用评论之后进行编辑以更正答案。

您不能通过迭代所有元素来实现
addToKey
addToValue
,因为正如您所意识到的那样,这需要线性时间

相反,您可以保留一个
keyDelta
valueDelta
int
实例变量,它们分别保存应添加到每个键和值的值(或所有值的总和)。这是假设
addToKey
addToValue
应该向键或值添加一个数值

addToKey
addToValue
只需要更新这些实例变量,这将需要
O(1)

get(x)
操作将搜索键
x-keyDelta
,并在向其添加
valueDelta
后返回其相应的值

请注意,
add(x,y)
也需要更改,因为添加到映射的键值对不应受到先前调用
addToKey
addToValue
的影响。如果
insert(x,y)
实际将对
x-keyDelta,y-valueDelta
插入地图,则可以实现这一点


如果使用
TreeMap
实现键到值的映射,
get
insert
将采用
O(logN)

键和值是数字的吗?如果不是,那么将x/y添加到所有键/值意味着什么?这是一个HashMap问题,但这是一个BST问题。创建一个包含2 int、key和value的节点,并通过比较键“addToValue y-add y到map中的所有值”来创建一个BST。我怀疑这可以在小于
O(N)
的时间内完成,或者如果将添加值的总和单独保存在另一个节点中,这可能是
O(1)
variable@Cid就连我也这么想,密钥必须是唯一的数字,因此只能更新1个密钥。hashMapWell中不应该有多个键,原则上,您可以从新添加的对中减去当前的keyDelta和valueDelta来保存此方法。我的意思是在插入它们时,对不起。这样,在所有剩余的操作中,它们的行为将与已经存在的一致。他是对的,而不是一直插入(key,value)。当您“获取”时,您总是返回(值旧增量+新增量)。博克托夫;)是的,这可能有用。谢谢Vee和Tom@MaLong只需使用
java.util.TreeMap