我遇到了这个问题的多个变种,最近在我的算术编码器实现中成为瓶颈。给定 N (<=256) 个已知非负大小 S_i 的段,从原点开始按顺序排列,并对于给定的 x,我想找到 n,使得
S_0 + S_1 + ... + S_(n-1) <= x < S_0 + S_1 + ... + S_n
问题在于查找和更新的频率大致相同,几乎每次更新都是通过增加一段的大小来完成的。此外,段越大,它被查找或更新的概率就越高。
显然某种类型的树似乎是明显的方法,但我无法想出任何满意利用已知特定领域细节的树实现。
鉴于 N 的相对较小,我也尝试了线性方法,但它们的速度比朴素的二叉树慢得多(即使进行了一些优化,例如从列表的后面开始处理总数超过一半的数字)。
类似地,我测试了引入一个中间步骤,以重新映射值的方式,以保持按大小排序的段,以便对最常用的访问更快,但添加的开销超过了收益。
很抱歉标题不太清楚——尽管这是一个相当基本的问题,但我不知道它有任何特定的名称。
S_0 + S_1 + ... + S_(n-1) <= x < S_0 + S_1 + ... + S_n
问题在于查找和更新的频率大致相同,几乎每次更新都是通过增加一段的大小来完成的。此外,段越大,它被查找或更新的概率就越高。
显然某种类型的树似乎是明显的方法,但我无法想出任何满意利用已知特定领域细节的树实现。
鉴于 N 的相对较小,我也尝试了线性方法,但它们的速度比朴素的二叉树慢得多(即使进行了一些优化,例如从列表的后面开始处理总数超过一半的数字)。
类似地,我测试了引入一个中间步骤,以重新映射值的方式,以保持按大小排序的段,以便对最常用的访问更快,但添加的开销超过了收益。
很抱歉标题不太清楚——尽管这是一个相当基本的问题,但我不知道它有任何特定的名称。
max(1, previousSize / 2)
。这是一个非常罕见的情况,因此性能不是问题(在合理范围内)。至于您的二叉树建议,那基本上就是我的当前实现。虽然性能不是很差,但它仍然是瓶颈,并且还不够快,所以我希望有更好的想法。 - tohoho