我有一个64位有符号整数的列表,例如[10232,10233,10234,10400,10235,10236,10401]
哪种数据结构最合适,因为我需要对其进行以下操作(按操作频率排序)
答案 0 :(得分:1)
使用a rope之类的节点的整数映射。
绳索是二叉树。它实际上用于字符串,但我们可以使用它进行微小的更改。
让每个节点的“权重”等于1加上其左子树中所有节点的总和。每个节点的值由这些权重隐式定义,并且对应于列表中的索引。在确定这些值时,我们从根节点到目标节点,如果我们向右移动或者我们正在寻找的节点是目标节点,则将权重相加。
每个节点还需要有一个指向其父节点的指针(因此我们能够确定某个给定节点的索引)。
使用这些结构组合,O(log n)将支持所有操作。
通过查询树中的两个数字的索引并比较它们,查询是否在一个数字出现之前可以完成另一个数字。通过首先获得索引,然后在该索引处加上1来插入数字,可以类似地插入一个数字。
例如,如果我们有这样的树:
.
/ \
. .
/ \ / \
. . . .
/ / \
. . .
权重将是:
6
/ \
3 3
/ \ / \
2 2 1 1
/ / \
1 1 1
节点的值将是:
6
/ \
3 9
/ \ / \
2 5 7 10
/ / \
1 4 8
要在上面的树中获取7
,我们从根开始并添加6
,因为我们正确。然后我们走了,所以无事可做。然后我们在目标节点,并且没有左子树,所以我们添加1
,给我们7
。