双数组AC自动机精精品PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
并将中间关键字(和新结点指针new一起插入到* current的双亲* parent中。
B-树的删除 (1)删除操作的两个步骤
第一步骤:在树中查找被删关键字K所在的地点 第二步骤:进行删去K的操作
(2)删去K的操作 B-树是二叉排序树的推广,中序遍历B-树同样可得到关键字的有序序
列。任一关键字K的中序前趋(后继)必是K的左子树(右子树)中最右(左)下的 结点中最后(最前)一个关键字。
数据结构一、二
2010-10-24
5阶B-树示例 【例】下图给出了一棵包含24个英文字母的5阶B-树的存 储结构图。
说明: 按照定义,在5阶B-树里,根中的关键字数目可以是1~4,子树数可以是2~5;其
它的结点中关键字数目可以是2~4,若该结点不是叶子,则它可以有3~5棵子树。
B-树
一棵m(m≥3)阶的B-树是满足如下性质的m叉
B-树的实现
删除关键值
情形三:若*x及其相邻的左右兄弟(也可能只有一个兄弟)中的关键字数目均为最小值 Min,则上述的移动操作就不奏效,此时须*x和左或右兄弟合并。
不妨设*x有右邻兄弟*y(结点取代*x对左邻兄弟的讨论与此类似),在*x中删 去K及其右子树后,将双亲结点*parent中介于*x和*y之间的关键字K,作为中间关键 字,与并x和*y中的关键字一起"合并"为一个新的和*y。
public int idx=-1;//位置信息
public boolean isfind=false;//查找是否成功
}
B-树的实现
插入关键值
(1)首先在树中查找K,若找到则直接返回;
(2)否则查找操作必失败于某个叶子上,然后将K插入该叶子中。 (2.a)若该叶子结点原来是非满的,则插入K后并未破坏B-树的性质,故 插入K后即完成了插入操作;
(3)每个非根结点中所包含的关键字p{个ub数lic Bj满Tre足eN:ode()
m / 2 1 n m 1
child=mallocChildArray(2*M+2); keyValue=mallocValueArray(2*M+1);
keyNum=0;nodeLevel=1;parent=null;
若被删关键字K所在的结点非树叶,则用K的中序前趋(或后继)K'取代 K,然后从叶子中删去K'。
从叶子*x开始删去某关键字K的三种情形为: 情形一:若x.keynum>Min,则只需删去K及其右指针(*x是叶子,K的右
指针为空)即可使删除操作结束。
B-树的实现
删除关键值
情形二:若x->keynum=Min,该叶子中的关键字个数已是最小值,删K及其右指 针后会破坏B-树的性质(3)。 若*x的左(或右)邻兄弟结点*y中的关键字数目大于Min,则将*y中的最大(或最小) 关键字上移至双亲结点*parent中,而将*parent中相应的关键字下移至x中。显然 这种移动使得双亲中关键字数目不变;*y被移出一个关键字,故其keynum减1, 因它原大于Min,故减少1个关键字后keynum仍大于等于Min;而*x中已移入一个 关键字,故删K后*x中仍有Min个关键字。涉及移动关键字的三个结点均满足B-树 的性质(3)。 上述操作后仍满足B-树的性质(1)。移动完成后,删除过程亦结束。
Trie树
Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。 它的优点是:利用字符串的公共前缀来节约存储空间,查找速度快。
其基本性质可以归纳为: 1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对 应的字符串。 3. 每个节点的所有子节点包含的字符都不相同。
树:
Байду номын сангаас
/**
(1)每个结点至少包含下列数据域:* @note 这是一个raw type的节点类型
nKi为(1≤关i≤键n)(字是n,总关P数键0,字K,l,关P1键,字K2,序…列,p{*递up*bKu/l增ii,bcli有cPaibin)序sttrka:ecytNKuc1mla<s;Ks2<B…Tr<eeKNi。ode
对结点内的存放有序关键字序列的向量key[l..keynum] 用顺序查找或折半
查找方法查找。
/**
* @note 记录查找结果位置信息
* */
public class Position
{
public BTreeNode currNode=null;
public BTreeNode parentNode=null;
Pi(0≤i≤n)是孩子指针。对于叶结点pu,bli每c B个TrePeNi为od空e[]指ch针ild;。
keys(P0)<K1<keys(P1)<K2<…<Ki<keyspp(Puuibb)lliicc
T[] int
keyValue; nodeLevel;
(2)所有叶子是在同一层上,叶子的p层ub数lic B为Tr树eeN的od高e p度arehn。t;
(2.b)若该结点原为满,则K插入后keynum=m,违反B-树性质(3),故须 调整使其维持B-树性质不变。
调整操作:
将违反性质 3的结点以中间位置上的关键字key mid 为划分点,将结点(current ):
(m, P0 , K1, , Pmid 1, Kmid , Pmid , Km , Pm ) / /Ki表示key[i],Pi表示son[i] “分裂”为两个结点: (m / 2 1, P0 , K1, K , m/21 Pm/21) / /此节点为current节点 (m m / 2 , Pm/2 , K , m/21 Km , Pm ) / /此节点为新节点
(4)若树非空,则根至少有1个关键字} ,故若根不是叶子,则它至少
有2棵子树。根至多有m-1个关键字} ,故至多有m棵子树。
B-树的实现
关键值查找 插入关键值 删除关键值
关键值查找
在B-树中查找给定关键字的方法类似于二叉排序树上的查找。不同的是在
每个结点上确定向下查找的路径不一定是二路而是keynum+1路的。
Trie树的缺点:内存消耗非常大 因此,往往利用Trie树的一种变形, Double Array Trie。
B-树的删除 (1)删除操作的两个步骤
第一步骤:在树中查找被删关键字K所在的地点 第二步骤:进行删去K的操作
(2)删去K的操作 B-树是二叉排序树的推广,中序遍历B-树同样可得到关键字的有序序
列。任一关键字K的中序前趋(后继)必是K的左子树(右子树)中最右(左)下的 结点中最后(最前)一个关键字。
数据结构一、二
2010-10-24
5阶B-树示例 【例】下图给出了一棵包含24个英文字母的5阶B-树的存 储结构图。
说明: 按照定义,在5阶B-树里,根中的关键字数目可以是1~4,子树数可以是2~5;其
它的结点中关键字数目可以是2~4,若该结点不是叶子,则它可以有3~5棵子树。
B-树
一棵m(m≥3)阶的B-树是满足如下性质的m叉
B-树的实现
删除关键值
情形三:若*x及其相邻的左右兄弟(也可能只有一个兄弟)中的关键字数目均为最小值 Min,则上述的移动操作就不奏效,此时须*x和左或右兄弟合并。
不妨设*x有右邻兄弟*y(结点取代*x对左邻兄弟的讨论与此类似),在*x中删 去K及其右子树后,将双亲结点*parent中介于*x和*y之间的关键字K,作为中间关键 字,与并x和*y中的关键字一起"合并"为一个新的和*y。
public int idx=-1;//位置信息
public boolean isfind=false;//查找是否成功
}
B-树的实现
插入关键值
(1)首先在树中查找K,若找到则直接返回;
(2)否则查找操作必失败于某个叶子上,然后将K插入该叶子中。 (2.a)若该叶子结点原来是非满的,则插入K后并未破坏B-树的性质,故 插入K后即完成了插入操作;
(3)每个非根结点中所包含的关键字p{个ub数lic Bj满Tre足eN:ode()
m / 2 1 n m 1
child=mallocChildArray(2*M+2); keyValue=mallocValueArray(2*M+1);
keyNum=0;nodeLevel=1;parent=null;
若被删关键字K所在的结点非树叶,则用K的中序前趋(或后继)K'取代 K,然后从叶子中删去K'。
从叶子*x开始删去某关键字K的三种情形为: 情形一:若x.keynum>Min,则只需删去K及其右指针(*x是叶子,K的右
指针为空)即可使删除操作结束。
B-树的实现
删除关键值
情形二:若x->keynum=Min,该叶子中的关键字个数已是最小值,删K及其右指 针后会破坏B-树的性质(3)。 若*x的左(或右)邻兄弟结点*y中的关键字数目大于Min,则将*y中的最大(或最小) 关键字上移至双亲结点*parent中,而将*parent中相应的关键字下移至x中。显然 这种移动使得双亲中关键字数目不变;*y被移出一个关键字,故其keynum减1, 因它原大于Min,故减少1个关键字后keynum仍大于等于Min;而*x中已移入一个 关键字,故删K后*x中仍有Min个关键字。涉及移动关键字的三个结点均满足B-树 的性质(3)。 上述操作后仍满足B-树的性质(1)。移动完成后,删除过程亦结束。
Trie树
Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。 它的优点是:利用字符串的公共前缀来节约存储空间,查找速度快。
其基本性质可以归纳为: 1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对 应的字符串。 3. 每个节点的所有子节点包含的字符都不相同。
树:
Байду номын сангаас
/**
(1)每个结点至少包含下列数据域:* @note 这是一个raw type的节点类型
nKi为(1≤关i≤键n)(字是n,总关P数键0,字K,l,关P1键,字K2,序…列,p{*递up*bKu/l增ii,bcli有cPaibin)序sttrka:ecytNKuc1mla<s;Ks2<B…Tr<eeKNi。ode
对结点内的存放有序关键字序列的向量key[l..keynum] 用顺序查找或折半
查找方法查找。
/**
* @note 记录查找结果位置信息
* */
public class Position
{
public BTreeNode currNode=null;
public BTreeNode parentNode=null;
Pi(0≤i≤n)是孩子指针。对于叶结点pu,bli每c B个TrePeNi为od空e[]指ch针ild;。
keys(P0)<K1<keys(P1)<K2<…<Ki<keyspp(Puuibb)lliicc
T[] int
keyValue; nodeLevel;
(2)所有叶子是在同一层上,叶子的p层ub数lic B为Tr树eeN的od高e p度arehn。t;
(2.b)若该结点原为满,则K插入后keynum=m,违反B-树性质(3),故须 调整使其维持B-树性质不变。
调整操作:
将违反性质 3的结点以中间位置上的关键字key mid 为划分点,将结点(current ):
(m, P0 , K1, , Pmid 1, Kmid , Pmid , Km , Pm ) / /Ki表示key[i],Pi表示son[i] “分裂”为两个结点: (m / 2 1, P0 , K1, K , m/21 Pm/21) / /此节点为current节点 (m m / 2 , Pm/2 , K , m/21 Km , Pm ) / /此节点为新节点
(4)若树非空,则根至少有1个关键字} ,故若根不是叶子,则它至少
有2棵子树。根至多有m-1个关键字} ,故至多有m棵子树。
B-树的实现
关键值查找 插入关键值 删除关键值
关键值查找
在B-树中查找给定关键字的方法类似于二叉排序树上的查找。不同的是在
每个结点上确定向下查找的路径不一定是二路而是keynum+1路的。
Trie树的缺点:内存消耗非常大 因此,往往利用Trie树的一种变形, Double Array Trie。