Data structures 为什么后缀树空间效率的隐藏因子是20?

Data structures 为什么后缀树空间效率的隐藏因子是20?,data-structures,big-o,space-complexity,suffix-tree,suffix-array,Data Structures,Big O,Space Complexity,Suffix Tree,Suffix Array,一般说来,后缀树比后缀数组节省空间。更具体地说,与近似为4的后缀数组相比,近似上界O(n)空间效率隐藏了因子20。为什么会发生这种情况?通常,后缀树是由每个节点在字母表中为每个字符存储一个指针来表示的,该指针指示所指示字符的子节点的位置。每个子指针还使用一对索引注释到原始字符串中,指示使用原始字符串中的哪些字符范围来标记给定的边。这意味着对于字母表中的每个字符(加上$character),每个后缀树节点将需要存储一个指针和两个机器字。这意味着,如果你在计算基因组学应用程序中做一些事情,比如字母表

一般说来,后缀树比后缀数组节省空间。更具体地说,与近似为4的后缀数组相比,近似上界O(n)空间效率隐藏了因子20。为什么会发生这种情况?

通常,后缀树是由每个节点在字母表中为每个字符存储一个指针来表示的,该指针指示所指示字符的子节点的位置。每个子指针还使用一对索引注释到原始字符串中,指示使用原始字符串中的哪些字符范围来标记给定的边。这意味着对于字母表中的每个字符(加上$character),每个后缀树节点将需要存储一个指针和两个机器字。这意味着,如果你在计算基因组学应用程序中做一些事情,比如字母表是{a,C,T,G},那么后缀树中每个节点需要15个机器字。后缀树中的节点数最多为2n-1,其中n是字符串的后缀数,因此您需要大约30n个机器字


与后缀数组相比,字符串中的每个字符只需要一个机器字(后缀的索引),因此总共需要n个机器字来存储后缀数组。与原始后缀树相比,这是一个巨大的节约。通常,后缀数组与LCP数组配对(LCP数组可以更深入地了解数组的结构),这需要另外n-1个机器字,因此总共需要大约2n-1个机器字。这比后缀树节省了很多,这也是为什么后缀数组在实践中使用得如此之多的原因之一。

我对你的答案有点困惑。我们是否同意我们最多有:n-1个叶、2n-2个边和n-1个内部节点?那么这30是如何计算的呢?内部节点、边缘和离开需要多少个指针?有两个独立的量-节点总数和每个节点的总空间。后缀树中巨大的空间膨胀与树中每个节点存储的内存量(15个机器字)有关,而且后缀树中的节点(最多2n-1)比后缀数组中的条目(n)多,因此每个条目的空间比后缀树中的条目周期长。如果字母表中有四个字符,然后,每个节点可能需要为这些字符中的每个字符存储一个子指针加上字符串结束标记。每个指针都是一个单词。此外,您需要知道与该子指针关联的整个子字符串,这需要指向显示在边缘上的字符串范围的开始和结束的指针。每个字符多两个单词。总的来说,五个字符中每个字符有三个单词,每个节点有15个单词!我将讨论后缀树在中间和末端的空间使用。如果你好奇的话,幻灯片是。