Data structures 如何实现一个数据结构,它接受一个整数及其权重,这样对它的查询将返回该整数及其权重的%倍?

Data structures 如何实现一个数据结构,它接受一个整数及其权重,这样对它的查询将返回该整数及其权重的%倍?,data-structures,tree,computer-science,implementation,Data Structures,Tree,Computer Science,Implementation,数据以数字和重量的形式输入。例如,如果数据结构中输入了数据(1,9)和(2,1),那么它应该在90%的时间内返回数字1,在10%的时间内返回数字2 此实现应使用哪种数据结构?另外,查询函数的基本代码是什么样的 编辑:我在考虑一棵树,它存储每个子树的累计总和。假设我有(1,4)、(2,7)、(3,1)和(4,11)。 这棵树看起来像: 23 /\ 11 12 /\/\ 471111 我不知道这棵树是否应该是二进制的。此外,将权重存储在树中并将其映射到数字或以某种方式使用给定的数字作为数据输入是否有

数据以数字和重量的形式输入。例如,如果数据结构中输入了数据(1,9)和(2,1),那么它应该在90%的时间内返回数字1,在10%的时间内返回数字2

此实现应使用哪种数据结构?另外,查询函数的基本代码是什么样的

编辑:我在考虑一棵树,它存储每个子树的累计总和。假设我有(1,4)、(2,7)、(3,1)和(4,11)。
这棵树看起来像:
23
/\
11 12
/\/\
471111


我不知道这棵树是否应该是二进制的。此外,将权重存储在树中并将其映射到数字或以某种方式使用给定的数字作为数据输入是否有意义?

从值/权重元组
(1,4)、(2,7)、(3,1)、(4,11)
生成一个具有累计权重和的数组

[(1, 4), (2, 11), (3, 12), (4, 23)]
并通过二进制搜索获得累积权重字段的值


从问题中不清楚,查询应该如何工作-随机?

以及您的努力和想法在哪里?是的,累积和的想法是好的。是否需要动态添加新值?如果不是,只需使用具有累积总和的简单数组,二叉树就可以正常工作。在0和累积和之间选择一个随机数,然后通过二进制搜索找到它的位置。示例中的最终范围是:
(0-4)、(4,11)、(11,12)、(12,23)
。如果恰好是
4、11或12,只需随机选择其中一个。您需要跟踪当前总和,以便知道
1
实际上是
13
。如果你不使用随机权重,我同意MBo。也可以使用间隔树。@Nuclearman谢谢!你能给我举个例子吗?我知道如何形成数组。另外,我们知道这个查询函数应该返回value1 4/23次、value2 7/23次、value3 1/23次和value4 11/23次。你能详细说明1是13的部分吗?精化:你知道累积总数是
23
,所以你可以选择一个介于
0和23
之间的随机数。假设这个数字是
13.5
,称它为
n
,以保持简短。树中的第一个节点是
23
,它覆盖
0和23
之间的所有数字,
n
位于
0和23
之间,因此我们继续沿着树往下走。左边是11,表示
0到11
,右边是
12
,表示
11+(0到12)=11到23
n
介于两者之间,因此我们遵循该节点。最后,我们有
1
这是
11+(0到1)=11到12
11
这是
11+1+(0到11)=12到23
。从(12,23)中的13开始,返回11。此查询函数应返回value1 4/23次、value2 7/23次、value3 1/23次和value4 11/23次。类似地,如果它运行23次,1返回4次,等等。我们是否依赖于此处的随机化函数?我不知道这些值应如何根据查询编号进行分布-您没有指定是。如果数据没有更改或只能添加,则最好使用此方法。移除数组中的第一个元素需要
O(N)
重新计算和。二叉树方法需要
O(logn)
。一般来说,我不确定每次更新是否可以
O(1)
,不过只要不删除元素,就可以使用这种方法。另外,对于随机化,您可以使用与上面阐述的相同的
(0,4)、(11,12)、(12,23)
,但是搜索更容易,因为它只是一个二进制搜索。缺点是删除积分的更新速度较慢。如果您不需要高效删除,建议使用此方法。