我正在尝试解决以下问题。让我们定义2个多节点操作:
|M,e|
对有序多集节点的操作为获取多集e
的最低M
元素。例如,|{1,1,2,3,3,4},4|={1,1,2,3}
。[E,F,G,e]
为:
[E,F,G,e]=|E+F,e|
,如果总和多集E的所有元素都是偶数,[E,F,G,e]=|E+G,e|
,如果总和多重E的所有元素都是奇数例如:[{0,2},{1,2},{0,3},3]=|{0,2}+{1,2},3|=|{0,2,1,2},3|=|{0,1,2,2},3|={0,1,2}
问题陈述是:提供一系列n
非空自然数字多重集:X={x(0), x(1), …, x(n-1)}
和数字m
和k
,找到多重集合的总和以下操作的结果:[…[[{},x(i_0),x(j_0),m],x(i_1),x(j_1),m]…,x(i_(k-1)),x(j_(k-1)),m]
,即对起始集k
)应用{}
次替代和操作,对于某些给<i,j>
对。
现在我已经使用多集的数组表示来解决这个问题并且合并两个多字节是有效的,因为我可以合并两个有序数组,同时裁剪它的大小(在O(l)
其中l是{{1两个数组的大小合并)并同时对结果数组求和。
但我认为可能有一个更快的基于树/堆的解决方案,它可以让我更快地合并多个集合,并以更灵活的方式保存有关多集合总和的信息。
在这种情况下,哪种数据结构是最佳选择?
答案 0 :(得分:0)
当然,有类似堆的数据结构可以更快地完成合并,例如Fibonacci heap或pairing heap。但是,任何类似堆的数据结构在查找最小的m个条目时会更慢;这几乎总是O(m log(n))。如果m的值通常很小,那么值得尝试,但如果m通常不比n小得多,我猜你当前的解决方案总体上可能更快。