大数据算法自检

news2024/11/15 11:14:45

1 大数据亚线性空间算法

1.1 流模型的计数问题

问题定义?用什么算法?算法步骤?(提示:三层递进)

切比雪夫不等式?怎么证明?期望,方差,空间复杂度?

极其有限的空间存储极大的数目

morris,morris+,morris++

1 / ( 2 X ) 1/(2^X) 1/(2X) => f ^ = ( 2 X − 1 ) \hat{f}=(2^X-1) f^=(2X1)

E [ γ ] = N E[γ]=N E[γ]=N

D [ γ ] = N 2 − N 2 k D[γ]=\frac{N^2−N}{2k} D[γ]=2kN2N

P [ ∣ γ − N ∣ ≥ ϵ ] ⩽ N 2 − N 2 k ϵ 2 P[|γ−N|≥ϵ]⩽\frac{N^2−N}{2kϵ^2} P[γNϵ]2kϵ2N2N

1.2 不重复元素数

问题定义?用什么算法?算法步骤?
(提示:存储实数:三层递进 + 无法存储实数:1+1)

怎么证明?期望,方差,空间复杂度?

统计一个数据流的不重复元素数

  1. FM,FM+

    h : [ n ] ↦ [ 0 , 1 ] h:[n]↦[0,1] h:[n][0,1] => z = m i n { z , h ( i ) } z=min\{z,h(i)\} z=min{z,h(i)} => 1 z − 1 \frac{1}{z}-1 z11

    E [ Z ] = 1 d + 1 E[Z]=\frac{1}{d+1} E[Z]=d+11

    v a r [ Z ] ⩽ 2 ( d + 1 ) ( d + 2 ) 1 q < 2 ( d + 1 ) ( d + 1 ) 1 q var[Z]⩽\frac{2}{(d+1)(d+2)}\frac{1}{q}<\frac{2}{(d+1)(d+1)}\frac{1}{q} var[Z](d+1)(d+2)2q1<(d+1)(d+1)2q1

    P [ ∣ X − d ∣ > ϵ ′ d ] < 2 q ( 2 ϵ ′ + 1 ) 2 P[|X−d|>ϵ'd]<\frac{2}{q}(\frac{2}{ϵ'}+1)^2 P[Xd>ϵd]<q2(ϵ2+1)2

  2. FM’+

    维护当前看到的最小的k个哈希值,返回 k z k \frac{k}{z_k} zkk

  3. PracticalFM

    1. 如果 z e r o s ( h ( j ) ) > z zeros(h(j))>z zeros(h(j))>z z = z e r o s ( h ( j ) ) z=zeros(h(j)) z=zeros(h(j))

    2. 返回 d ^ = 2 z + 1 2 \hat{d}=2^{z+\frac{1}{2}} d^=2z+21

    E [ Y r ] = d 2 r E[Y_{r}] = \frac{d}{2 ^ r} E[Yr]=2rd

    v a r [ Y r ] ≤ d 2 r var[Y_{r}] \leq \frac{d}{2^r} var[Yr]2rd

    最终正确的概率应该大于 1 − 2 2 C 1 - \frac{2\sqrt{2} }{C} 1C22

  4. BJKST

    1. z e r o s ( h ( j ) ) > z zeros(h(j))>z zeros(h(j))>z

      1. B = B ∪ ( g ( j ) , z e r o s ( h ( j ) ) ) B=B∪(g(j),zeros(h(j))) B=B(g(j),zeros(h(j)))
      2. ∣ B ∣ > c ϵ 2 |B| > \frac{c}{\epsilon^2} B>ϵ2c
        1. z = z + 1 z=z+1 z=z+1
        2. 从B中删除 ( α , β ) (α,β) (α,β),其中 β < z β<z β<z
    2. return d ^ = ∣ B ∣ 2 z \hat{d}=|B|2^z d^=B2z

1.3 点查询

问题定义?用什么算法?算法步骤?

空间复杂度?

计算流中所有的元素出现次数

  1. Misra_Gries

    维护一个集合A,其中的元素是 ( i , f i ^ ) (i,\hat{f_{i} }) (i,fi^)

    1. A ← ∅ A←∅ A

    2. 对每一个数据流中的元素e

      if e∈A,令 ( e , f e ^ ) → ( e , f e ^ + 1 ) (e,\hat{f_{e} }) \rightarrow (e,\hat{f_{e} } + 1) (e,fe^)(e,fe^+1)

      else if ∣ A ∣ < 1 ϵ |A| < \frac{1}{\epsilon} A<ϵ1:将(e,1)插入A

      else

      1. 将所有A中计数减1
      2. if f j ^ = 0 \hat{f_{j} } = 0 fj^=0:从A中删除(j,0)
    3. 对于查询 i,如果 i ∈ A i∈A iA,返回 f i ^ \hat{f_{i} } fi^,否则返回0

    空间代价是 O ( ϵ − 1 l o g n ) O(\epsilon^{-1}logn) O(ϵ1logn)

  2. Metwally

    1. 对每一个数据流中的元素e
      1. if e∈A:令 ( e , f i ^ ) ← ( e , f i ^ + 1 ) (e,\hat{f_i})←(e,\hat{f_i}+1) (e,fi^)(e,fi^+1)
      2. else if ∣ A ∣ < 1 ϵ |A| < \frac{1}{\epsilon} A<ϵ1:将(e,1)插入A
      3. else 将(e,MIN+1)插入A,并删除一个满足 f e ^ = M I N \hat{f_{e} } = MIN fe^=MIN
    2. 查询 i,如果 i ∈ A i∈A iA,返回 f i ^ \hat{f_i} fi^,否则返回MIN

    空间代价是 O ( ϵ − 1 l o g n ) O(\epsilon^{-1}logn) O(ϵ1logn)

  3. Count-Min

    1. 随机选择 t 个2−wise独立哈希函数 h i : [ n ] → [ k ] h_i:[n]→[k] hi:[n][k]

    2. 对每一个出现的更新(j,c)进行如下操作

      for i=1 to t

      C [ i ] [ h i ( j ) ] = C [ i ] [ h i ( j ) ] + c C[i][h_{i}(j)] = C[i][h_{i}(j)] + c C[i][hi(j)]=C[i][hi(j)]+c

    3. 针对对于a的查询,返回 f a ^ = min ⁡ 1 ≤ i ≤ t C [ i ] [ h i ( a ) ] \hat{f_{a} } = \min_{1 \leq i \leq t}{C[i][h_{i}(a)]} fa^=min1itC[i][hi(a)]

  4. Count-Median(min变median)

  5. Count Sketch

    1. 随机选择1个2−wise独立哈希函数 h : [ n ] → [ k ] h:[n]→[k] h:[n][k]

    2. 随机选择1个2−wise独立哈希函数 g : [ n ] → − 1 , 1 g:[n]→{−1,1} g:[n]1,1

    3. 对于每一个更新(j,c)

      C [ h ( j ) ] = C [ h ( j ) ] + c ∗ g ( j ) C[h(j)] = C[h(j)] + c * g(j) C[h(j)]=C[h(j)]+cg(j)

    4. 针对查询a,返回 f ^ = g ( a ) ∗ C [ h ( j ) ] \hat{f} = g(a) * C[h(j)] f^=g(a)C[h(j)]

  6. Count Sketch+
    (相当于是将Count Sketch算法运行了t次,最后取了中值)

    1. 随机选择1个2−wise独立哈希函数 h i : [ n ] → [ k ] h_i:[n]→[k] hi:[n][k]

    2. 随机选择1个2−wise独立哈希函数 g i : [ n ] → { − 1 , 1 } g_i:[n] \rightarrow \{-1,1\} gi:[n]{1,1}

      对于每一个更新(j,c)

      ​ 对于 i : 1 → t i:1→t i:1t

      C [ h i ( j ) ] = C [ h i ( j ) ] + c ∗ g i ( j ) C[h_i(j)] = C[h_i(j)] + c * g_i(j) C[hi(j)]=C[hi(j)]+cgi(j)

    3. 返回 f ^ = m e d i a n 1 ≤ i ≤ t g i ( a ) C [ i ] [ h i ( a ) ] \hat f=median_{1≤i≤t}g_i(a)C[i][h_i(a)] f^=median1itgi(a)C[i][hi(a)]

1.4 频度矩估计

问题定义?用什么算法?算法步骤?

期望,方差,空间复杂度?

1.5 固定大小采样

问题定义?用什么算法?算法步骤?

期望,方差,空间复杂度?

水库抽样算法

  1. 使用数据流的前s个元素对抽样数组进行初始化
    A [ 1 , . . . , s ] , m ← s A[1,...,s],m\leftarrow s A[1,...,s],ms
  2. 对于每一个更新x
    1. x以 s m + 1 \frac{s}{m + 1} m+1s概率随机替换A中的一个元素
    2. m++

1.6 Bloom Filter

问题定义?用什么算法?算法步骤?

大数据集中划出一个小数据集,抽一个数,猜它是否属于小数据集

  1. 近似哈希

    1. 令H是一族通用哈希函数: [ U ] → [ m ] , m = n δ [U]→[m],m = \frac{n}{\delta} [U][m]m=δn
    2. 随机选择 h∈H,并维护数组A[m],S的大小是n
    3. 对每一个 i∈S, A [ h ( i ) ] = 1 A[h(i)]=1 A[h(i)]=1
    4. 给定查询q,返回yes当且仅当 A [ h ( i ) ] = 1 A[h(i)]=1 A[h(i)]=1
  2. Bloom Filter

    1. 令H是一族独立的理想哈希函数:[U]→[m]

    2. 随机选取 h 1 , . . . , h d ∈ H h_1,...,h_d \in H h1,...,hdH,并维护数组A[m]

    3. 对于每一个i∈S

      ​ 对于每一个j∈[1,d]

      A [ h j ( i ) ] = 1 A[h_j(i)] = 1 A[hj(i)]=1

    4. 给定查询q,返回yes当且仅当 ∀ j ∈ [ d ] , A [ h j ( q ) ] = 1 \forall j \in [d],A[h_j(q)] = 1 j[d],A[hj(q)]=1

2 大数据亚线性时间算法

2.1 求连通分量的数目

问题定义?用什么算法?算法步骤?

计算公式?时间复杂度?

如果搜索到的点的个数少于 2 ϵ \frac{2}{\epsilon} ϵ2就继续搜索,否则直接返回 2 ϵ \frac{2}{\epsilon} ϵ2

从节点集合中随机选出 r = b / ϵ 2 r = b/{\epsilon}^2 r=b/ϵ2个节点构成节点U,对每个节点应用这个算法

最终的 C ^ = n r ∑ u ∈ U 1 n u ^ \hat{C} = \frac{n}{r} \sum_{u \in U}{\frac{1}{\hat{n_u} } } C^=rnuUnu^1,时间复杂度为 O ( d / ϵ 3 ) O(d/{\epsilon}^3) O(d/ϵ3)

2.2 近似最小支撑树

问题定义?用什么算法?算法步骤?

计算公式?时间复杂度?

G的子图 G ( i ) = ( V , E ( i ) ) G^{(i)}=(V,E^{(i)}) G(i)=(V,E(i)) E ( i ) = { ( u , v ) ∣ w u v ≤ i } E(i)=\{(u,v)|w_{uv}≤i\} E(i)={(u,v)wuvi},连通分量的个数为C(i)

M为所有这样的子图的连通分量的数目的和: M = n − w + ∑ i = 1 w − 1 C ( i ) M=n-w+\sum_{i=1}^{w-1}{C^{(i)} } M=nw+i=1w1C(i)
M = ∑ i = 1 w i ⋅ α i = ∑ i = 1 w α i + ∑ i = 2 w α i + ⋯ + ∑ i = w w α i = C ( 0 ) − 1 + C ( 1 ) − 1 + ⋯ + C ( w − 1 ) − 1 = n − 1 + C ( 1 ) − 1 + ⋯ + C ( w − 1 ) − 1 = n − w + ∑ i = 1 w − 1 C ( i ) \begin{align*} M &= \sum_{i=1}^{w}{i \cdot \alpha_i}=\sum_{i=1}^{w}{\alpha_i} + \sum_{i=2}^{w}{\alpha_i} + \dots + \sum_{i=w}^{w}{\alpha_i}\\ &= C^{(0)}-1 + C^{(1)}-1 + \dots + C^{(w-1)}-1\\ &= n-1+C^{(1)}-1 + \dots + C^{(w-1)}-1\\ &= n-w+\sum_{i=1}^{w-1}{C^{(i)} } \end{align*} M=i=1wiαi=i=1wαi+i=2wαi++i=wwαi=C(0)1+C(1)1++C(w1)1=n1+C(1)1++C(w1)1=nw+i=1w1C(i)

2.3 求点集合的直径

问题定义?用什么算法?算法步骤?

计算公式?时间复杂度?

The Indyk’s Algorithm

  1. 任选 k ∈ [ 1 , m ] k∈[1,m] k[1,m]
  2. 选出 l l l,使得 ∀ i , D k i ≤ D k l \forall i,D_{ki} \leq D_{kl} i,DkiDkl
  3. 返回 ( k , l ) , D k l (k,l),D_{kl} (k,l),Dkl

2.4 计算图的平均度算法

Alg III

  1. 从V中抽取样本S, ∣ S ∣ = O ~ ( L ρ ϵ 2 ) , L = p o l y ( l o g   n ϵ ) , ρ = 1 t ϵ 4 ⋅ α n |S| = \tilde{O}(\frac{L}{\rho\epsilon^2}),L=poly(\frac{log\ n}{\epsilon}),\rho = \frac{1}{t}\sqrt{\frac{\epsilon}{4}\cdot \frac{\alpha}{n} } S=O~(ρϵ2L),L=poly(ϵlog n),ρ=t14ϵnα
  2. S i ← S ∩ B i S_i \gets S \cap B_i SiSBi
  3. f o r   i ∈ { 0 , … , t − 1 }   d o \boldsymbol{for}\ i \in \{0,\dots,t-1\}\ \boldsymbol{do} for i{0,,t1} do
    1. i f   ∣ S i ∣ ≥ θ ρ   t h e n \boldsymbol{if}\ |S_i| \geq \theta_\rho\ \boldsymbol{then} if Siθρ then
      1. ρ i ← ∣ S i ∣ ∣ S ∣ \rho_i \gets \frac{|S_i|}{|S|} ρiSSi
      2. e s t i m a t e   Δ i estimate\ \Delta_i estimate Δi
    2. e l s e \boldsymbol{else} else
      1. ρ i ← 0 \rho_i\gets 0 ρi0
  4. r e t u r n   d ˉ ^ = ∑ i = 0 t − 1 ( 1 + Δ i ) ρ i ( 1 + β ) i \boldsymbol{return}\ \hat{\bar{d} } = \sum_{i=0}^{t-1}(1+\Delta_i)\rho_i(1+\beta)^{i} return dˉ^=i=0t1(1+Δi)ρi(1+β)i

Alg IV

  1. α ← n \alpha \gets n αn
  2. d ˉ ^ < − ∞ \hat{\bar{d} } < -\infty dˉ^<
  3. w h i l e   d ˉ ^ < α   d o \boldsymbol{while}\ \hat{\bar{d} } < \alpha\ \boldsymbol{do} while dˉ^<α do
    1. α ← α / 2 \alpha \gets \alpha/2 αα/2
    2. i f   α < 1 n   t h e n \boldsymbol{if}\ \alpha < \frac{1}{n}\ \boldsymbol{then} if α<n1 then
      1. r e t u r n   0 ; \boldsymbol{return}\ 0; return 0;
    3. d ˉ ^ ← A l g I I I ∼ α \hat{\bar{d} } \gets AlgIII_{\sim \alpha} dˉ^AlgIIIα
  4. r e t u r n   d ˉ ^ \boldsymbol{return}\ \hat{\bar{d} } return dˉ^

算法相关指标

近似比: ( 1 + ϵ ) (1 + \epsilon) (1+ϵ)

运行时间: O ~ ( n ) ⋅ p o l y ( ϵ − 1 l o g   n ) n / d ˉ \tilde{O}(\sqrt{n})\cdot poly(\epsilon^{-1}log\ n)\sqrt{n/\bar{d} } O~(n )poly(ϵ1log n)n/dˉ

3 并行计算算法

3.1 构建倒排索引

问题定义?Map函数做什么?Reduce函数做什么?

给定一组文档,统计每一个单词出现在哪些文件中

map: < d o c I D , c o n t e n t > → < w o r d , d o c I D > <docID,content> \rightarrow <word,docID> <docID,content>→<word,docID>
reduce: < w o r d , d o c I D > → < w o r d , l i s t   o f   d o c I D > <word,docID> \rightarrow <word,list\ of\ docID> <word,docID>→<word,list of docID>

3.2 单词计数

问题定义?Map函数做什么?Reduce函数做什么?

给定一组文档,统计每一个单词出现的次数

  • Map函数:<docID,content>→<word,1>
  • Reduce函数:<word,1>→<word,count>

3.3 检索

问题定义?

给定行号和相应的文档内容,统计指定单词出现的位置

  • Map函数: < l i n e I D , w o r d > → < w o r d , l i n e I D > <lineID,word>→<word,lineID> <lineID,word>→<word,lineID>
  • Reduce函数: < w o r d , l i n e I D > → < w o r d , l i s t   o f   l i n e I D > > <word,lineID>→<word,list~of~ lineID>> <word,lineID>→<word,list of lineID>>

3.4 矩阵乘法

问题定义?

两种算法:Map函数做什么?Reduce函数做什么?

  1. 矩阵乘法1
    • Map:
      • ((A,i,j),aij)→(j,(A,i,aij))
      • ((B,j,k),bjk)→(j,(B,k,bjk))
    • Reduce:(j,(A,i,aij)),(j,(B,k,bjk))→((i,k),aij∗bjk)
    • Map:nothing(identity)
    • Reduce:((i,k),(v1,v2,…))→((i,k),∑vi)
  2. 矩阵乘法2
    • Map函数:

      • ((A,i,j),aij)→((i,x),(A,j,aij)) for all x∈[1,n]
      • ((B,j,k),bjk)→((y,k),(B,j,bjk)) for all y∈[1,m]
    • Reduce函数:((i,k),(A,j,aij))∧((i,k),(B,j,bjk))→((i,k),∑aij∗bjk)

3.5 排序算法

Map函数做什么?Reduce函数做什么?解决问题的一个关键?

使用p台处理器,输入 < i , A [ i ] > <i,A[i]> <i,A[i]>

  • Map: < i , A [ i ] > → < j , ( ( i , A [ i ] ) , y ) > <i,A[i]> \rightarrow <j,((i,A[i]),y)> <i,A[i]>→<j,((i,A[i]),y)>

    1. 输出 < i % p , ( ( i , A [ i ] ) , 0 ) > <i\%p,((i,A[i]),0)> <i%p,((i,A[i]),0)>

    2. 以概率T/n为所有 j ∈ [ 0 , p − 1 ] j ∈ [0, p − 1] j[0,p1]输出 < j , ( ( i , A [ i ] ) , 1 ) > <j,((i,A[i]),1)> <j,((i,A[i]),1)>

      否则输出 < j , ( ( i , A [ i ] ) , 0 ) > <j,((i,A[i]),0)> <j,((i,A[i]),0)>

  • Reduce:

    • 将y=1的数据收集为S并排序
    • 构造 ( s 1 , s 2 , . . . , s p − 1 ) (s_1,s_2,...,s_{p−1}) (s1,s2,...,sp1) s k s_k sk为S中第 k ⌈ ∣ S ∣ p ⌉ k\left \lceil \frac{|S|}{p} \right \rceil kpS
    • 将y=0的数据收集为D
    • 对任意(i,x)∈D满足 s k < x ≤ s k + 1 s_k < x \leq s_{k+1} sk<xsk+1,输出<k,(i,x)>
  • Map:nothing(identity)

  • Reduce:$ <j, ((i, A[i]), . . . )>$

    • 将所有 ( i , A [ i ] ) (i, A[i]) (i,A[i])根据$ A[i]$排序并输出

3.6 计算最小支撑树(生成树)

主要思想?Map函数做什么?Reduce函数做什么?

利用图划分算法,将图G划分成k个子图,在每个子图中计算最小生成树

算法的本质就是先在局部算好生成树,然后用剩余的连接这些生成树的边组成一个新的图,并求出这个新的图的最小生成树作为最总的结果

  • Map:input:<(u,v),NULL>
    • 转化<(h(u),h(v));(u,v)>
    • 针对上述转化数据,如果h(u)=h(v),则对所有 j∈[1,k],输出<(h(u),j);(u,v)>
  • Reduce:input:<(i,j);Eij>
    • 令Mij=MSF(Gij)
    • 对Mij中的每条边e=(u,v)输出<NULL;(u,v)>
  • Map:nothing(identity)
  • Reduce:M=MST(H)

4 外存模型算法

4.1 外存模型

在I/O模型中,内存的大小为___,页面大小为___,外存大小___。连续读取外存上的N个数据,需要多少次I/O?

M,B,无限,N/B

4.2 计算矩阵乘法

输入两个大小为N×N的矩阵X和Y

  1. 将矩阵分为大小为___的块
  2. 考虑X×Y矩阵中的每个块,显然共有___个块需要输出
  3. 每个块需要扫描___对输入块
  4. 每次内存计算需要___次I/O
  5. 共计___次I/O

M / 2 × M / 2 \sqrt{M}/2\times\sqrt{M}/2 M /2×M /2

O ( ( N M ) 2 ) O((\frac{N}{\sqrt{M} })^2) O((M N)2)

N M \frac{N}{\sqrt{M} } M N

O(M/B)

O ( ( N M ) 3 ⋅ M / B ) O((\frac{N}{\sqrt{M} })^3\cdot M/B) O((M N)3M/B)

4.3 数据结构

4.3.1 外存栈

内存维护大小为___的数组,实现内存栈结构,外存中存储其余数据

怎么压栈(push)?
怎么弹栈(pop)?

I/O代价分析:
▷ 最坏情况代价:O(1)次I/O
▷ 均摊代价(amortized analysis):___,最优

2B

没满就压,满了就外写后压

不空就弹,空了就读了再弹

O(1/B)

4.3.2 外存链表

队列(Queue)
▷ 内存维护2个大小为B的数组A和B,一个用于出队,一个用于入队
▷ A和B中分别存储?
▷ 外存中存储其余数据
如何处理队列操作?
▷ 入队(insert)?
▷ 出队(remove)?
I/O代价分析:
▷ 最坏情况代价:O(1)次I/O
▷ 均摊代价(amortized analysis):___,最优

k个队头数据和k′个队尾数据

B没满就入内存,满了就外写后再入内存

A没空就弹,空了就读了再弹

O(1/B)

4.3.3 链表

进行三种操作:insert(x,p),remove§,traverse(p,k)

  • 想法二:块“半满”⇒数据至少B/2;

    在外存模型下,将一个链表中连续的元素放在一个大小为B的块中。同时,令每个块大小至少为B/2:
    ▷ remove: 什么情况下合并?什么情况下均分?
    ▷ insert: 什么情况下均分?
    ▷ traverse: ___,insert和remove最坏情况代价为O(1)

    ▷ 均摊代价:N次连续插入___,连续删除___

    小于B/2,则与邻居块合并,合并后大于B则均分

    大于B,平均划分

    O(2k/B)

    N次连续插入O(2N/B),连续删除 O ( l o g 2 B ⋅ N / B ) O(log_2 B · N/B) O(log2BN/B)

  • 想法三:连续的两个块至少包含2B/3个数据;

    连续的两个块至少包含2B/3个数据;内存维护大小为B缓冲区
    ▷ remove: 什么情况下合并?什么情况下均分?
    ▷ insert: 什么情况下合并?什么情况下均分?
    ▷ traverse: ___

    ▷ 均摊代价:N次连续插入___,连续删除___
    ▷ 均摊代价:N次连续更新___

删除并检查是否有相邻块使得数据量 ≤ 2B/3,有则合并

若当前块满,向邻居插入;邻居均满,均分当前块

O(3k/B)

O(2N/B),O(3N/B)

O(12N/B)

4.4 搜索结构

进行三种操作:insert(x),remove(x),query(x)

( a , b ) − t r e e : (a,b)-tree: (a,b)tree: a与b的关系

类似二分查找树 ⇒ ( p 0 , k 1 , p 1 , k 2 , p 2 , . . . , k c , p c ) \Rightarrow (p_0, k_1, p_1, k_2, p_2, . . . , k_c, p_c) (p0,k1,p1,k2,p2,...,kc,pc)

root节点有__个孩子;每个非叶子节点的孩子数目__:

  • remove:怎么操作?
  • insert:怎么操作?
  • query:时间复杂度?

2 ≤ a ≤ (b + 1)/2

根节点有0或≥ 2个孩子,其它非叶子节点的孩子数目∈ [a, b]

删除后若小于a,与邻接块合并,合并后若大于b,平均划分

插入后若大于b,均分

$ O(log_a(N/a))$

image-20230218091126688

插入操作

假设插入的键值为K,首先找到对应的叶结点L

  • 如果L中有空闲空间,那么直接插入,结束;

  • 否则将叶结点分裂为两个结点,并且把其中的键分到这两个新结点中,使得键个数满足最小要求;

    • 当分裂叶结点N时:

      ▷创建一个新结点M,让M为N的右侧兄弟,将键排序,前 ⌈ ( n + 1 ) / 2 ⌉ ⌈(n+1)/2⌉ ⌈(n+1)/2个留在N中,其他键‐指针放入M中。

    • 当分裂非叶结点N时:
      ▷将键‐指针排序,前 ⌈ ( n + 2 ) / 2 ⌉ ⌈(n+2)/2⌉ ⌈(n+2)/2个指针留在N中,剩下的 ⌊ ( n + 2 ) / 2 ⌋ ⌊(n+2)/2⌋ ⌊(n+2)/2个指针放入M中。
      ▷前 ⌈ n / 2 ⌉ ⌈n/2⌉ n/2个键留在N中,后 ⌊ n / 2 ⌋ ⌊n/2⌋ n/2个键放入M中,中间那个键留出来,插入到上一层结点中,该键指针指向M。

删除操作

假设删除的键值为K,首先找到对应的叶结点L。

  • 如果L中删除K后仍然具有满足最小要求的键个数,停止

  • 否则需要做如下处理:

    ▷尝试与L的相邻兄弟节点之一合并(合并后仍能放入同一节点),合并后,相当于在上层结点删除了一个键值,那么递归处理;

    ▷否则,考虑L的相邻兄弟

    • 假设其中一个能够提供L一个键‐指针,并且去除该键‐指针后该兄弟结点仍然满足键数的最小要求,那么L从该兄弟处借得一对键‐指针,并更新父节点的对应键值;
    • 如果两个兄弟都无法提供一个键‐指针,那么必然是如下情况:L的键数少于最小数,L兄弟M的键数恰好为最小数,那么两个结点可以合并。

B+树–性能

结点中指针数目的最大值:n,记录条数:N
B+Tree的插入操作: O ( l o g ⌈ n / 2 ⌉ ( N ) ) O(log_{⌈n/2⌉}(N)) O(logn/2(N))
B+Tree的删除操作: O ( l o g ⌈ n / 2 ⌉ ( N ) ) O(log_{⌈n/2⌉}(N)) O(logn/2(N))

4.5 外存排序

▷ 给定__个数据
▷ 分成大小为__的组,每组可在内存排序,需要__次I/O
▷ 排好序的分组,进行归并(Merge)
▷ 每次可以归并__个分组
▷ I/O代价:
▷ 画图理解

N

O(M),O(M/B)

O(M/B)

O ( N / B ⋅ l o g M / B N B ) O(N/B · log_{M/B} \frac{N}{B} ) O(N/BlogM/BBN) O ( N / B ⋅ l o g M / B N M ) O(N/B · log_{M/B} \frac{N}{M} ) O(N/BlogM/BMN)(存疑)

4.6 List Ranking

问题定义?(两个问题)

算法?(四个步骤)

给定大小为N的邻接链表L,L存储在数组(连续的外存空间)中,计算每个节点的rank(在链表中的序号)

输入大小为N的外存链表L

  1. 寻找L中的一个顶点独立集 X
  2. 将X中的节点“跳过”,构建新的、更小的外存链表L′
  3. 递归地求解L′
  4. 将X中的节点“回填”,根据L′的rank构建L的rank

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【音视频开发】 ffmpeg解码API

1.版本迭代ffmpeg解码API经过了好几个版本的迭代&#xff0c;上一个版本的API是解码视频&#xff1a;avcodec_decode_video2解码音频&#xff1a;avcodec_decode_audio4我们现在能看到的很多解码例子用的都是这两个&#xff0c;不过现在ffmpeg更推荐用新一代的API向解码器输送数…

04 中间件-提高框架的可拓展性

到目前为止我们已经完成了 Web 框架的基础部分&#xff0c;使用 net/http 启动了一个 Web 服务&#xff0c;并且定义了自己的 Context&#xff0c;可以控制请求超时。 在前面的controller.go中有一个超时控制逻辑&#xff1a; func FooControllerHandler(c *framework.Context…

【Ap AutoSAR入门与实战开发04】:服务的需求定义以及如何在arxml中定义服务

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 1 服务的需求定义2 服务的arxml定义2.1 事件中的数据类型定义我们在「【Ap AutoSAR入门与实战开发03】-【Ap_s2s模块02】:到底什么是基于信号,什么是基于服务,两者的主要区别是什么?」的文章中讲到了讲到了服…

如何在ONLYOFFICE v7.3中使用 WRAPROWS、WRAPCOLS公式

在ONLYOFFICE7.3版本更新以来&#xff0c;每次给大家都分享几种函数公式的运用方式&#xff0c;今天在给大家分享两种&#xff0c;分别是&#xff1b;WRAPROWS、WRAPCOLS。 ONLYOFFICE ONLYOFFICE文档是一款免费开源在线办公软件&#xff0c;可以打开阅读并编辑文档、表格和幻…

1247. 交换字符使得字符串相同

1247. 交换字符使得字符串相同 难度中等162收藏分享切换为英文接收动态反馈 有两个长度相同的字符串 s1 和 s2&#xff0c;且它们其中 只含有 字符 "x" 和 "y"&#xff0c;你需要通过「交换字符」的方式使这两个字符串相同。 每次「交换字符」的时候&am…

轻松入门H3C无线AC上线AP【入门篇】

我们知道华三的最新模拟器支持了无线AC的配置&#xff0c;今天就浅浅的出个无线AC的教程&#xff0c;你上也会的那种。今天我们模拟的是二层环境下&#xff0c;笔者准备了2个AP&#xff0c;以此展示AP上线到AC的教程&#xff0c;并且用手机测试WiFi连接正常&#xff0c;且客户端…

7、nodejs安装

前言&#xff1a;工具下载地址阿里云盘&#xff1a;nodejs&#xff1a;https://www.aliyundrive.com/s/hLAKBgjNUqr提取码: p9q9一、介绍Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;使用了一个事件…

【VUE】二 vue指令

目录 一、插值表达式 二、v-bind指令(对标签中的属性进行操作) 三、v-model指令&#xff08;input、select、textarea等。【双向绑定】&#xff09; 四、v-for循环指令 五、v-on(事件指令) 六、v-if条件判断 七、v-show&#xff08;条件显示或隐藏&#xff09; 八、案例…

模型解释性:PFI、PDP、ICE等包的用法

本篇主要介绍几种其他较常用的模型解释性方法。 1. Permutation Feature Importance(PFI) 1.1 算法原理 置换特征重要性(Permutation Feature Importance)的概念很简单&#xff0c;其衡量特征重要性的方法如下&#xff1a;计算特征改变后模型预测误差的增加。如果打乱该特征的…

HCIP-5距离矢量路由协议RIP学习笔记

前言 路由信息协议RIP&#xff08;Routing Information Protocol&#xff09;的简称&#xff0c;它是一种基于距离矢量&#xff08;Distance-Vector&#xff09;算法的协议&#xff0c;使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。Rip是第一个动…

如何创建“杀手级”SaaS 产品文档?

SaaS 产品的文档至关重要&#xff0c;尽管在 SaaS 初创公司的旋风中&#xff0c;它可能在您的列表中并不重要。它不仅仅是为客户支持节省成本。您可能已经在发布一些文档时做了一些尝试&#xff0c;但现在是时候将您的文档提升到一个新的水平了。由于 SaaS 公司采用订阅模式运营…

【Git】Git使用(保姆级讲解)

1、第一次安装使用 git下载地址&#xff1a;https://git-scm.com/download 1.1 配置用户名、邮箱 ​ 这是非常重要的&#xff0c;因为每次Git提交都会使用该用户信息。 设置 ​ 在 git bash 输入以下命令。 git config --global user.name "" git config --glo…

CV学习笔记-ResNet

ResNet 文章目录ResNet1. ResNet概述1.1 常见卷积神经网络1.2 ResNet提出背景2. ResNet网络结构2.1 Residual net2.2 残差神经单元2.3 Shortcut2.4 ResNet50网络结构3. 代码实现3.1 Identity Block3.2 Conv Block3.3 ResNet网络定义3.4 整体代码测试1. ResNet概述 1.1 常见卷积…

【三维几何学习】MeshCNN: A Network with an Edge

MeshCNN引言一、方法简述1.1 输入1.2 卷积1.3 池化二、实验分析三、改进以及应用引言 MeshCNN是第一个将网格简化引入到池化操作中的网络&#xff1a;合并顶点降低网格分辨率&#xff0c;类似图像中的平均池化。 主页1:https://ranahanocka.github.io/MeshCNN/ 比较详细的讲解…

Java 练习题:输出纯素数

文章目录纯素数简介任务要求思路解析源码奉上运行效果总结纯素数简介 所谓纯素数就是该数本身不仅是素数&#xff0c;并且该数的每一位都是素数。 例如&#xff1a;23,37是纯素数&#xff0c;但13,29不是。 任务要求 输出55555内所有的纯素数&#xff0c;按每行20个的格式化…

JVM 学习(2)—简单理解Java 四大引用(强、软、弱、虚)

一、Java 引用概述 Java 中出现四种引用是为了更加灵活地管理对象的生命周期&#xff0c;以便在不同场景下灵活地处理对象的回收问题。不同类型的引用在垃圾回收时的处理方式不同&#xff0c;可以用来实现不同的垃圾回收策略。Java 目前将其分成四类&#xff0c;类图如下&…

彻底搞懂inner join,left join,right join

1.inner join A inner join B where 条件&#xff0c; 对于A表中的每一行都会去B表的所有行去查找&#xff0c;去匹配&#xff0c;符合条件的就将这两行连接起来 下面用一个例子来帮助实际理解这句话&#xff1a; 创建下面两个表&#xff0c;customers表orders表 输入以下s…

银行软件测试面试题目总结,希望可以帮到你

目录 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、根据题目要求写出具体LINUX操作命令 1、分别写出一种…

HTML标签——列表标签 之 自定义列表

HTML标签——列表标签 之 自定义列表 目录HTML标签——列表标签 之 自定义列表一、 场景&#xff1a;在网页的底部导航中通常会使用自定义列表实现。二、标签组成&#xff1a;三、案例实操四、运行效果五、显示特点&#xff1a;六、注意点&#xff1a;七、小结一、 场景&#x…

DeepPath: A Reinforcement Learning Method forKnowledge Graph Reasoning

Innovation使用RL学习KG中的关系路径推理使用Supervised Policy Learning解决&#xff1a;KG中关系图大&#xff0c;如试错训练RL&#xff0c;难以收敛使用双向路径搜索&#xff0c;减少中间节点数量IntroductionPRA是一种学习推理路径的方法&#xff0c;使用基于RandomWalk的重…