大数据算法自检

news/2024/4/26 16:48:19/文章来源:https://blog.csdn.net/twi_twi/article/details/129257839

1 大数据亚线性空间算法

1.1 流模型的计数问题

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

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

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

morris,morris+,morris++

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

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

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

P[∣γ−N∣≥ϵ]⩽N2−N2kϵ2P[|γ−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=min{z,h(i)}z=min\{z,h(i)\}z=min{z,h(i)} => 1z−1\frac{1}{z}-1z11

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

    var[Z]⩽2(d+1)(d+2)1q<2(d+1)(d+1)1qvar[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]<2q(2ϵ′+1)2P[|X−d|>ϵ'd]<\frac{2}{q}(\frac{2}{ϵ'}+1)^2P[Xd>ϵd]<q2(ϵ2+1)2

  2. FM’+

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

  3. PracticalFM

    1. 如果zeros(h(j))>zzeros(h(j))>zzeros(h(j))>zz=zeros(h(j))z=zeros(h(j))z=zeros(h(j))

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

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

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

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

  4. BJKST

    1. zeros(h(j))>zzeros(h(j))>zzeros(h(j))>z

      1. B=B∪(g(j),zeros(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+1z=z+1z=z+1
        2. 从B中删除(α,β)(α,β)(α,β),其中β<zβ<zβ<z
    2. return d^=∣B∣2z\hat{d}=|B|2^zd^=B2z

1.3 点查询

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

空间复杂度?

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

  1. Misra_Gries

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

    1. A←∅A←∅A

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

      if e∈A,令(e,fe^)→(e,fe^+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 fj^=0\hat{f_{j} } = 0fj^=0:从A中删除(j,0)
    3. 对于查询 i,如果i∈Ai∈AiA,返回fi^\hat{f_{i} }fi^,否则返回0

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

  2. Metwally

    1. 对每一个数据流中的元素e
      1. if e∈A:令(e,fi^)←(e,fi^+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,并删除一个满足fe^=MIN\hat{f_{e} } = MINfe^=MIN
    2. 查询 i,如果i∈Ai∈AiA,返回fi^\hat{f_i}fi^,否则返回MIN

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

  3. Count-Min

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

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

      for i=1 to t

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

    3. 针对对于a的查询,返回 fa^=min⁡1≤i≤tC[i][hi(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,1g:[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独立哈希函数 hi:[n]→[k]h_i:[n]→[k]hi:[n][k]

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

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

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

      C[hi(j)]=C[hi(j)]+c∗gi(j)C[h_i(j)] = C[h_i(j)] + c * g_i(j)C[hi(j)]=C[hi(j)]+cgi(j)

    3. 返回f^=median1≤i≤tgi(a)C[i][hi(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←sA[1,...,s],m\leftarrow sA[1,...,s],ms
  2. 对于每一个更新x
    1. x以sm+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)]=1A[h(i)]=1A[h(i)]=1
    4. 给定查询q,返回yes当且仅当A[h(i)]=1A[h(i)]=1A[h(i)]=1
  2. Bloom Filter

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

    2. 随机选取h1,...,hd∈Hh_1,...,h_d \in Hh1,...,hdH,并维护数组A[m]

    3. 对于每一个i∈S

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

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

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

2 大数据亚线性时间算法

2.1 求连通分量的数目

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

计算公式?时间复杂度?

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

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

最终的C^=nr∑u∈U1nu^\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)∣wuv≤i}E(i)=\{(u,v)|w_{uv}≤i\}E(i)={(u,v)wuvi},连通分量的个数为C(i)

M为所有这样的子图的连通分量的数目的和:M=n−w+∑i=1w−1C(i)M=n-w+\sum_{i=1}^{w-1}{C^{(i)} }M=nw+i=1w1C(i)
M=∑i=1wi⋅αi=∑i=1wαi+∑i=2wαi+⋯+∑i=wwαi=C(0)−1+C(1)−1+⋯+C(w−1)−1=n−1+C(1)−1+⋯+C(w−1)−1=n−w+∑i=1w−1C(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. 选出lll,使得∀i,Dki≤Dkl\forall i,D_{ki} \leq D_{kl}i,DkiDkl
  3. 返回(k,l),Dkl(k,l),D_{kl}(k,l),Dkl

2.4 计算图的平均度算法

Alg III

  1. 从V中抽取样本S,∣S∣=O~(Lρϵ2),L=poly(lognϵ),ρ=1tϵ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. Si←S∩BiS_i \gets S \cap B_iSiSBi
  3. fori∈{0,…,t−1}do\boldsymbol{for}\ i \in \{0,\dots,t-1\}\ \boldsymbol{do}for i{0,,t1} do
    1. if∣Si∣≥θρthen\boldsymbol{if}\ |S_i| \geq \theta_\rho\ \boldsymbol{then}if Siθρ then
      1. ρi←∣Si∣∣S∣\rho_i \gets \frac{|S_i|}{|S|}ρiSSi
      2. estimateΔiestimate\ \Delta_iestimate Δi
    2. else\boldsymbol{else}else
      1. ρi←0\rho_i\gets 0ρi0
  4. returndˉ^=∑i=0t−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} } < -\inftydˉ^<
  3. whiledˉ^<αdo\boldsymbol{while}\ \hat{\bar{d} } < \alpha\ \boldsymbol{do}while dˉ^<α do
    1. α←α/2\alpha \gets \alpha/2αα/2
    2. ifα<1nthen\boldsymbol{if}\ \alpha < \frac{1}{n}\ \boldsymbol{then}if α<n1 then
      1. return0;\boldsymbol{return}\ 0;return 0;
    3. dˉ^←AlgIII∼α\hat{\bar{d} } \gets AlgIII_{\sim \alpha}dˉ^AlgIIIα
  4. returndˉ^\boldsymbol{return}\ \hat{\bar{d} }return dˉ^

算法相关指标

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

运行时间:O~(n)⋅poly(ϵ−1logn)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:<docID,content>→<word,docID><docID,content> \rightarrow <word,docID><docID,content>→<word,docID>
reduce:<word,docID>→<word,listofdocID><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函数:<lineID,word>→<word,lineID><lineID,word>→<word,lineID><lineID,word>→<word,lineID>
  • Reduce函数:<word,lineID>→<word,listoflineID>><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并排序
    • 构造(s1,s2,...,sp−1)(s_1,s_2,...,s_{p−1})(s1,s2,...,sp1)sks_ksk为S中第k⌈∣S∣p⌉k\left \lceil \frac{|S|}{p} \right \rceilkpS
    • 将y=0的数据收集为D
    • 对任意(i,x)∈D满足sk<x≤sk+1s_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}/2M/2×M/2

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

NM\frac{N}{\sqrt{M} }MN

O(M/B)

O((NM)3⋅M/B)O((\frac{N}{\sqrt{M} })^3\cdot M/B)O((MN)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(log2B⋅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)−tree:(a,b)-tree:(a,b)tree: a与b的关系

类似二分查找树⇒(p0,k1,p1,k2,p2,...,kc,pc)\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(log⌈n/2⌉(N))O(log_{⌈n/2⌉}(N))O(logn/2(N))
B+Tree的删除操作:O(log⌈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⋅logM/BNB)O(N/B · log_{M/B} \frac{N}{B} )O(N/BlogM/BBN)O(N/B⋅logM/BNM)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.luyixian.cn/news_show_75234.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法(六):图结构

图是一种比线性表和树更复杂的数据结构&#xff0c;在图中&#xff0c;结点之间的关系是任意的&#xff0c;任意两个数据元素之间都可能相关。图是一种多对多的数据结构。 一、基本概念 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间边的集合组成&#x…

每日分享(免登录积分商城系统 动力商城 兑换商城源码)

​demo软件园每日更新资源,请看到最后就能获取你想要的: 1.Python教程2022&#xff1a;100天从新手到大师 完整版 Python 100天从新手到大师是一个Python入门教程&#xff0c;Python从入门到精通&#xff0c;专门为热爱python的新手量身定做的学习计划&#xff0c;100天速成pyt…

OOM的俩种情况---主动kill/被动kill

出现OOM, 有两种处理方式&#xff1a;1. 主动Kill; 2. 被动Kill 例&#xff1a;HBase Region Server OOM定位问题复盘 现象 在HBase资源隔离项目中&#xff0c;对测试集群进行压测时&#xff0c;发现region server会出现崩溃的情况&#xff0c;单机请求量从>200到~50每秒都…

【Git使用教程】从入门到学废

文章目录1. 基础git流程图常用命令基本配置快捷指令解决GitBash乱码获取本地仓库基础操作指令查看修改的状态&#xff08;status&#xff09;添加工作区到暂存区(add)提交暂存区到本地仓库(commit)查看提交日志(log)版本回退添加文件至忽略列表总结2. 分支查看本地分支创建本地…

程序员多赚20k的接私活必备网站

为什么都是程序员&#xff0c;就有人能多赚20k&#xff1f;那是因为副业搞得那么溜啊&#xff01; 今天分享一些程序员搞钱必备的接私活网站&#xff0c;让更多程序员们在工作之余能有另外一份收入。 1.程序员客栈&#xff1a;http://proginn.com 专为程序员服务的软件外包对…

超级品牌符号怎么设计?大咖有方法

怎么设计超级LOGO图标&#xff1f;有方法&#xff01; LOGO设计大趋势&#xff1a;卡通化、拟人化 抽象符号已经泛滥 但卡通形象也已经泛滥 趣讲大白话&#xff1a;设计容易出名难 【安志强趣讲信息科技89期】 ******************************* 别以为设计一个卡通就牛X闪闪 比…

React Native使用echart——wrn-echarts

这里写自定义目录标题前言Tips详细使用过程如下1、开发环境搭建2、准备RN工程3、build App包4、 安装相关依赖5、试用Skia模式6、试用Svg模式7、封装Chart组件8、多个图表使用总结前言 平时写图表相关需求&#xff0c;用得最多的图表库就是echarts。echarts在web端的表现已经相…

机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测

机器学习&#xff1a;基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞…

毕业设计 基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信

基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 dht11温湿度检测电路设计2.3 NRF24L01无线通信电路设计3、部分代码展示3.1 NRF24L01初始化3.2 NRF24L01的SPI写时序3.…

【数据库】数据库基本概念和类型

一、数据库基本概念 1、数据 所谓数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这些符号是可识别的、抽象的。它不仅仅指狭义上的数字&#xff0c;而是有多种表现形式&#xff1a;字母、文字、文本、图形、音频、视频等。现在…

STM32开发(16)----CubeMX配置DMA

CubeMX配置DMA前言一、什么是DMA&#xff1f;二、实验过程1.CubeMX配置2.代码实现3.实验结果总结前言 本章介绍使用STM32CubeMX对DMA进行配置的方法&#xff0c;DMA的原理、概念和特点&#xff0c;配置各个步骤的功能&#xff0c;并通过串口DMA传输实验方式验证。 一、什么是…

【学习笔记汇总】Github Note

本科毕业设计 Internet of Things environmental monitoring system based on STM32 STM32系列单片机工程模板 【STM32F103_Libary】基于STM32F103开发板的工程模板 ST7735屏幕【STM32F103Template】基于STM32F103开发板的工程模板 ILI9341屏幕【STM32F103_LibaryFinalVersio…

服务拆分及远程调用

目录 服务拆分 服务拆分注意事项 服务间调用 步骤一&#xff1a;注册RestTemplate 步骤二&#xff1a;修改业务层代码 总结&#xff1a; 提供者和消费者 思考 服务调用关系 服务拆分 服务拆分注意事项 单一职责&#xff1a;不同微服务&#xff0c;不要重复开发相同业…

电压放大器和电流放大器的区别是什么意思

在日常电子实验测试中&#xff0c;很多电子工程师都会使用到电压放大器和电流放大器&#xff0c;但是很多新手工程师却无法区分两者的区别&#xff0c;下面就让安泰电子来为我们讲解电压放大器和电流放大器的区别是什么意思。 一、电压放大器介绍&#xff1a; 电压放大器是一种…

2023王道考研数据结构笔记第一章绪论

第一章 绪论 1.1 数据结构的基本概念 1.数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。 2.数据元素&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一个整体进行考虑和处理…

【MySQL】数据库中锁和事务的相关知识点

1.事务的四大特点 原子性&#xff1a;事务中的所有操作要么都成功&#xff0c;要么都失败。所有的操作是一个不可分割的单位。一致性&#xff1a;一致性指的是事务执行前后&#xff0c;数据从一个合法性状态转移到另一个合法性状态。这个状态和业务有关&#xff0c;是自己定义…

Editor工具开发实用篇:EditorGUI/EditorGUILayout的区别和EditorGUILayout的方法介绍

目录 一&#xff1a;EditorGUI和EditorGUILayout区别 二&#xff1a;EditorGUILayout 1.EditorGUILayout.BeginFadeGroup(float value); 2.EditorGUILayout.BeginHorizontal EditorGUILayout.BeginVertical 3.EditorGUILayout.BeginScrollView 4.EditorGUILayout.BeginT…

sql-labs-Less1

靶场搭建好了&#xff0c;访问题目路径 http://127.0.0.1/sqli-labs-master/Less-1/ 我最开始在做sql-labs靶场的时候很迷茫&#xff0c;不知道最后到底要得到些什么&#xff0c;而现在我很清楚&#xff0c;sql注入可以获取数据库中的信息&#xff0c;而获取信息就是我们的目标…

概念+示例+横向对比+难点解析征服八大react hooks

8大hooks概念、使用场景 前言 对不同阶段的react开发者会有不同的效果&#xff0c;最终目的是能够对8大react hooks&#xff0c;完全理解&#xff0c;游刃有余。对比useState和useReducer&#xff0c;什么时候使用useMemo和useCallback&#xff0c;useEffect的参数… … use…

文献阅读笔记 # 面向大规模多版本软件系统的代码克隆检测加速技术

面向大规模多版本软件系统的代码克隆检测加速技术&#xff0c;方维康 吴毅坚 赵文耘&#xff0c;《计算机应用与软件》复旦大学软件学院、复旦大学上海市数据科学重点实验室2022 April 面向大规模多版本软件系统的代码克隆检测加速技术 摘要 很多代码克隆检测方法主要针对软…