Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 流字符串值的近似直方图(卡片目录算法?)_String_Algorithm_Sorting_Streaming_Histogram - Fatal编程技术网

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

String 流字符串值的近似直方图(卡片目录算法?),string,algorithm,sorting,streaming,histogram,String,Algorithm,Sorting,Streaming,Histogram,我有一个按字典排序的UTF-8字符串的大列表(或流)。我想为计数创建一个近似相等的直方图,根据需要改变箱子宽度以保持计数均匀。在文献中,这些直方图有时被称为等高度直方图或等深度直方图 我不想做通常的字数条形图,我想找一个更像老式图书卡目录的东西,在那里你有一套抽屉(箱子),一个可以放SAM-Seld,下一个箱子SOLE-STE,而所有的Y-ZZZ都放在一个箱子里。我想计算每个垃圾箱的截止日期 是否有(A)类似于数值近似直方图的已知算法?或者(B)关于如何以标准数字直方图算法能够工作的方式对字符串

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

我不想做通常的字数条形图,我想找一个更像老式图书卡目录的东西,在那里你有一套抽屉(箱子),一个可以放SAM-Seld,下一个箱子SOLE-STE,而所有的Y-ZZZ都放在一个箱子里。我想计算每个垃圾箱的截止日期

是否有(A)类似于数值近似直方图的已知算法?或者(B)关于如何以标准数字直方图算法能够工作的方式对字符串进行编码的建议。该算法不需要字符串填充的先验知识

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

字符串数/bin\u计数=每个bin中字符串数

然后,从0开始,按\u每个\u bin中的\u字符串的数量\u前进,以获得bin端点

对于我的用例来说,这有两个缺点。首先,它需要对可能非常多的字符串进行两次迭代,一次用于计数,一次用于查找端点。更重要的是,一个好的柱状图实现可以估计出一个值在箱子中的位置,这将非常有用


谢谢

如果我们不能对数据做出任何假设,您将不得不通过确定箱子大小

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

当然,如果您可以对数据做出一些假设,以下是一些可能会有所帮助的假设:

例如,您可能不知道确切的大小,但您可能知道该值将在某个时间间隔内下降。如果您最多需要
n
存储箱,请将存储箱大小设置为
==a/n

或者,如果您对大小完全相同的箱子不太挑剔,您可以在一次过程中对过程中的每个
m
元素进行采样,并将其转储到一个数组中,其中
m
是基于上下文的合理值


然后,为了找到bin端点,您可以在数组中找到
大小/n/m
的元素。

我提出的解决方案通过使用水库采样解决了缺乏关于总体的预先信息的问题。通过水库采样,您可以有效地从未知规模的总体中获取给定规模的随机样本。有关更多详细信息,请参阅。水库采样提供随机样本,无论河流是否有序

我们对数据进行一次遍历,收集样本。对于示例,我们有关于元素数量及其分布的明确信息

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


这种方法的优点是适用于任何可比较的数据类型

那么您的数据是从什么开始排序的?它是什么类型的数据结构?阵列?链表?排序集?它在一个持久的键值存储中。访问它的唯一方法是获得一个迭代器,并一次传递一个元素。您知道键值存储的大小吗?不知道。需要一次迭代才能将它们全部计算出来。这是“x=y*z”,您事先不知道这三个变量中的任何一个。那么,唯一的另一个选择就是为你的垃圾箱选择一个固定的(最大)尺寸,并拥有很多垃圾箱。在这种情况下,你不知道要花多少钱。