流式字符串值的近似直方图(卡片目录算法?)

时间:2015-03-09 20:07:58

标签: string algorithm sorting streaming histogram

我有一个按字典顺序排序的UTF-8字符串的大型列表(或流)。我想创建一个直方图,其计数值大致相等,根据需要改变bin宽度以保持计数均匀。在文献中,这些有时被称为等高或等深直方图。

我不打算做通常的字数统计条形图,我正在寻找更像旧式图书馆卡片目录的东西,你有一套抽屉(箱子),一个人可能拿着SAM - 已售出和下一个箱子SOLE-STE,而所有Y-ZZZ都装在一个箱子里。我想计算每个垃圾箱的截止点。

是否存在(A)已知的算法,类似于数值的近似直方图?或者(B)关于如何以标准数字直方图算法起作用的方式对字符串进行编码的建议。该算法不应要求先前了解字符串数量。

到目前为止,我能想到的最好的方法是等到我有一些合理数量的数据,然后通过以下方式形成逻辑箱:

number_of_strings / bin_count = number_of_strings_in_each_bin

然后,从0开始,由number_of_strings_in_each_bin前进以获取bin端点。

这对我的用例有两个缺点。首先,它需要对可能非常大量的字符串进行两次迭代,一次用于计数,一次用于查找端点。更重要的是,良好的直方图实现可以估计值在bin中的位置,这将非常有用。

感谢。

2 个答案:

答案 0 :(得分:1)

如果我们无法对数据做出任何假设,那么您将不得不进行通过以确定容器大小。

这意味着您必须以bin大小而不是bin编号开头,或者使用双遍模型。我只是使用线性插值来估计箱之间的位置,然后从那里进行二元搜索。

当然,如果您可以对数据进行某些假设,那么以下是一些可能会有所帮助的假设:

例如,您可能不知道确切的大小,但您可能知道该值将落在某个时间间隔[a, b]中。如果您最多需要n个分箱,请将分区大小设为== a/n

或者,如果您并不特别关注完全相同大小的二进制文件,您可以通过对传递中的每个m元素进行抽样并将其转储到一个数组中来进行一次传递,其中m基于背景是合理的。

然后,要找到bin端点,您会在数组中找到size/n/m处的元素。

答案 1 :(得分:0)

我提出的解决方案通过使用水库采样解决了缺乏有关人口的前期信息。通过水库采样,您可以从未知大小的群体中有效地获取给定大小的随机样本。有关详细信息,请参阅Wikipedia。无论河流是否有序,水库采样都会提供随机样本。

我们通过数据进行一次传递,收集样本。对于样本,我们有关于元素数量及其分布的明确信息。

对于直方图,我使用了番石榴RangeMap。我选择了范围的端点,以在每个范围内提供偶数个结果(sample_size / number_of_bins)。地图中的整数仅存储范围的顺序,从1到n。这允许我估计落在两个值内的记录的比例:如果有100个相等大小的箱,并且值落在箱25和箱75中,那么我可以估计大约50%的人口落在这些值之间。

此方法具有适用于任何可比数据类型的优势。