Python中的概率计数

时间:2016-11-11 20:10:33

标签: python string algorithm probability stat

我有一个随机字符串的50gb txt文件,其中我想计算该文件中子字符串的出现次数..很多次,对于不同的非预定义的随机子字符串。< / p>

我想知道是否有另一种方法可以解决这个问题。

概率方式

类似于布隆过滤器,但不是概率成员资格检查,我们可以进行概率计数。该数据结构将用于计数估算

其他统计方法(?)

我可以使用任何虚拟方法来估计文本文件中字符串的出现次数?对替代品开放。

如果可以在&lt; =对数时间内完成,那将是很好的,因为我将多次执行相同的任务。

2 个答案:

答案 0 :(得分:1)

某些streaming algorithms声音与此问题相关,可以单独使用,也可以相互结合使用。

  1. 文件的初始传递可以给出heavy hitters的近似值。根据您的问题,重击手可能会出现问题。分配对你来说已经足够了,但是这个集合足够小以容纳在内存中。如果是这种情况,你可以进行第二次传球,只计算第一次传球时的重击球。

  2. count-min sketch数据结构可以执行近似计数。您可以单独使用此数据结构,也可以使用它来计算重击者的出现次数。

  3. 因为它被标记为Python:

答案 1 :(得分:1)

您可以为您的文件计算suffix array

此数组按排序顺序包含后缀的起始位置。使用50GB的文本,您可以为每个位置分配5个字节,最后使用5 * 50 = 250 GBytes的后缀数组。如果这太多了,那么你可以试试compressed suffix array

计算此数组可以在O(n)中完成(使用适当的算法可能需要几个小时,主要受磁盘读/写速度的限制)。

获得数组后,可以以对数时间计算任何子字符串的出现次数。在实践中,时间将由磁盘不同部分的寻道时间决定,因此如果将文件存储在固态驱动器上,这部分将会快得多。