Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Database 缓存不经意前瞻阵列_Database_Algorithm_Caching - Fatal编程技术网

Database 缓存不经意前瞻阵列

Database 缓存不经意前瞻阵列,database,algorithm,caching,Database,Algorithm,Caching,我正试图理解的是在和第35页中描述的无缓存前瞻阵列 简体字插入分析 分形树: 合并2个大小为X的阵列的成本是O(X=B)块I/O。合并是非常重要的 I/O效率高 合并的每个元素的成本是O(1/B),因为O(X)个元素是 合并 每个元素合并的最大次数为O(logN) 平均插入成本为O(logN/B) 我可以理解#1、#2和#3,但我无法理解#4,从论文中,合并可以被视为二进制加法进位,例如,(31)B可以表示为: 11111 插入新项(加1)时,应该有5=log(32)merge(5个进位)。但是

我正试图理解的是在和第35页中描述的无缓存前瞻阵列

简体字插入分析 分形树:

  • 合并2个大小为X的阵列的成本是O(X=B)块I/O。合并是非常重要的 I/O效率高
  • 合并的每个元素的成本是O(1/B),因为O(X)个元素是 合并
  • 每个元素合并的最大次数为O(logN)
  • 平均插入成本为O(logN/B)
  • 我可以理解#1、#2和#3,但我无法理解#4,从论文中,合并可以被视为二进制加法进位,例如,(31)B可以表示为: 11111
    插入新项(加1)时,应该有5=log(32)merge(5个进位)。但是,在这种情况下,我们必须合并32个元素!此外,如果每次我们加1,那么从0到2^k将执行多少次进位?anwser应该是2^k-1。换句话说,每次插入一个合并


    那么#4是如何计算的呢?

    虽然在最坏的情况下,合并元素(以及传输)的数量都是N,并且总合并的数量也是相同的顺序,但是平均插入成本仍然是对数的。它来自两个事实:合并的成本不同,低成本合并的数量远高于高成本合并的数量

    通过示例可能更容易看到。
    让我们设置B=1(即每个块1个元素,每个合并最坏的情况是有代价的)和N=32(例如,我们将32个元素插入到一个初始为空的数组中)。
    一半的插入(16)将一个元素放入大小为1的空子数组中,因此不会导致合并。在剩余的插入中,一个(最后一个)需要合并(移动)32个元素,一个(第16个)移动16个,两个(第8个和第24个)移动8个元素,四个移动4个元素,八个移动2个元素。因此,元素移动的总数为96,即每次插入平均移动3次


    希望这会有所帮助。

    一般来说,每个增量的已更改位摊销数为2=O(1)

    这是一个逻辑/推理的证明


    这里有一个实验的“证据”

    第一个日志B级别适合(一页)内存,因此在这些级别发生的任何事情都不会引发I/O(这也解决了rrenaud分析的问题,即每次插入都有O(1)个合并,因为您只有在第一个日志B合并后才开始支付。)

    一旦你合并了至少B个元素,事实2就开始了

    从元素的角度考虑工作。它被合并O(logn)次。每次发生这种情况,它都会被收取O(1/B)的费用。插入的总成本是O((logn)/B)(需要额外的参数来区分O(logn/B),这将是非常糟糕的插入性能——甚至比B树还要差)

    “平均”成本实际上是摊销成本——它是插入该元素时向该元素收取的金额。更正式一点,它是插入N个元素的总工作量,然后除以N。O((logn)/B)的摊销成本实际上意味着插入N个元素就是O((logn)/B)I/O——对于整个序列。这与B-树相比非常有利,B-树对于N个插入总共执行O((N logn)/logb)I/O。除以B显然比除以log B要好得多

    您可能会抱怨工作过于繁杂,有时会执行导致大量合并的插入操作。没关系。您不会将所有合并收费到最后一次插入。每个人都为他们参与的每次合并支付自己的小额费用。由于(logn)/B通常远小于1,因此在参与的所有合并过程中,每个人的费用都比单个I/O少

    如果您不喜欢摊销分析,并且您说即使插入吞吐量增加了几个数量级,您也不喜欢单个插入会导致大量工作,那么会发生什么情况?啊哈!有一些标准的方法可以解除这种数据结构的隔离,在每次插入过程中都会进行一些抢占式的合并。你会得到同样的I/O复杂性(你必须相信我的话),但对于那些关心摊销分析和结果去抵押的人来说,这是相当标准的东西


    充分披露:我是《可乐报》的作者之一。而且,雷纳德也在我的算法课上。另外,我也是Tokutek的创始人。

    如何将32个ITME和5个有序列表合并成一个线性区域?即使使用分数级联(),它仍然是O(N)。在论文中,有人说“不在乎缓存的前瞻阵列…由log2(N)个数组或级别组成…第k个数组的大小为2k,数组连续存储在内存中。”此外,他们的成本模型只计算磁盘到内存的传输。