22.1.22 并查集和KMP算法

1.并查集结构

1)实现:
  • 并查集有多种实现方式,例如向上指的图的方式,数组的方式等等。其根本思想就在于准确记录某个节点的根节点,这个这种记录就能够很快的实现并查集的两种主要的功能:合并和查询。

2)两种优化方法:
  • 压缩路径;

  • 在合并时将深度小的树合并到深度大的树。

3)code:
    public static class PointUnion<V>
{
private V value;
public PointUnion(V value)
{
this.value = value;
}
}

public static class UnionSet<V>
{
public HashMap<V,PointUnion<V>> PUmap ;
public HashMap<PointUnion<V>,PointUnion<V>> Fathermap ;
public HashMap<PointUnion<V>,Integer> Rankmap ;

public UnionSet(List<V> list)
{
PUmap = new HashMap<V,PointUnion<V>>();
Fathermap = new HashMap<PointUnion<V>,PointUnion<V>>();
Rankmap = new HashMap<PointUnion<V>,Integer>();

for(V value : list)
{
PointUnion<V> PU = new PointUnion<V>(value);
PUmap.put(value, PU);
Fathermap.put(PU, PU);
Rankmap.put(PU, 1);
}
}

public PointUnion<V> FindFather(PointUnion<V> PU)
{
Stack<PointUnion<V>> S = new Stack();
while(PU!=Fathermap.get(PU))
{
S.push(PU);
PU = Fathermap.get(PU);
}

while(!S.isEmpty())
{
Fathermap.put(S.pop(), PU);
}
return PU;
}

public boolean isSameUnion(V a, V b)
{
if(PUmap.containsKey(a)&&PUmap.containsKey(b)&&FindFather(PUmap.get(a))==FindFather(PUmap.get(b)))
return true;
return false;
}

public void union(V a, V b)
{
if (PUmap.containsKey(a) && PUmap.containsKey(b))
{
PointUnion<V> aF = FindFather(PUmap.get(a));
PointUnion<V> bF = FindFather(PUmap.get(b));
if (aF != bF)
{
PointUnion<V> big = Rankmap.get(aF) >= Rankmap.get(bF) ? aF : bF;
PointUnion<V> small = big == aF ? bF : aF;
Fathermap.put(small, big);
Rankmap.put(big, Rankmap.get(aF) + Rankmap.get(bF));
Rankmap.remove(small);
}
}
}

}

2.KMP算法

1)用途:
  • KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。

  • 例如有这样的一个问题:判断一个较短的字符串是否为一个较长的字符串的子串。

    • 我们很容易想到这样的一种方法:从较长的字符串的第一位开始与较短的字符串比较,相同则同时后移,不同的话较长的字符串从第二位开始再与较短的字符串的第一位比较,重复之前的步骤,直到找到或者遍历完较长的字符串。

    • 第二种高效的方法:KMP算法

    2)解释:
    • code:

        public static int getIndexOf(String s, String m) {
    if (s == null || m == null || m.length() < 1 || s.length() < m.length()) {
    return -1;
    }
    char[] str1 = s.toCharArray();
    char[] str2 = m.toCharArray();
    int i1 = 0;
    int i2 = 0;
    int[] next = getNextArray(str2);
    while (i1 < str1.length && i2 < str2.length) {
    if (str1[i1] == str2[i2]) {
    i1++;
    i2++;
    } else if (next[i2] == -1) {
    i1++;
    } else {
    i2 = next[i2];
    }
    }
    return i2 == str2.length ? i1 - i2 : -1;
    }

    public static int[] getNextArray(char[] ms) {
    if (ms.length == 1) {
    return new int[] { -1 };
    }
    int[] next = new int[ms.length];
    next[0] = -1;
    next[1] = 0;
    int i = 2;
    int cn = 0;
    while (i < next.length) {
    if (ms[i - 1] == ms[cn]) {
    next[i++] = ++cn;
    } else if (cn > 0) {
    cn = next[cn];
    } else {
    next[i++] = 0;
    }
    }
    return next;
    }

    public static void main(String[] args) {
    String str = "abcabcababaccc";
    String match = "ababa";
    System.out.println(getIndexOf(str, match));

    }

22.1.22 并查集和KMP算法的更多相关文章

  1. 深入理解KMP算法

    前言:本人最近在看<大话数据结构>字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏<数据结构>的一个翻版,此书中给出的代码实现确实非常精炼,但是个人 ...

  2. 数据结构(复习)---------字符串-----KMP算法(转载)

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  3. 字符串匹配--kmp算法原理整理

    kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...

  4. KMP算法详解-彻底清楚了(转载+部分原创)

    引言 KMP算法指的是字符串模式匹配算法,问题是:在主串T中找到第一次出现完整子串P时的起始位置.该算法是三位大牛:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,以其名字首字 ...

  5. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  6. 【原创】通俗易懂的讲解KMP算法(字符串匹配算法)及代码实现

    一.本文简介 本文的目的是简单明了的讲解KMP算法的思想及实现过程. 网上的文章的确有些杂乱,有的过浅,有的太深,希望本文对初学者是非常友好的. 其实KMP算法有一些改良版,这些是在理解KMP核心思想 ...

  7. BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法

    标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...

  8. KMP算法&next数组总结

    http://www.cnblogs.com/yjiyjige/p/3263858.html KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年 ...

  9. 【数据结构】KMP算法

    我还是不太懂... 转2篇大神的解释    1>https://www.cnblogs.com/yjiyjige/p/3263858.html     2>https://blog.csd ...

随机推荐

  1. c++ 拷贝构造函数、拷贝运算符、析构函数

    拷贝构造函数.拷贝运算符.析构函数 拷贝构造函数.拷贝运算符.析构函数 定义行为像值的类 class HasPtr{ public: HasPtr(const string &s = stri ...

  2. 《深度探索C++对象模型》第一章 | 关于对象

    C++对象模式 非静态数据成员放置在每个类对象内,静态数据成员则被放置在所有类对象之外.静态和非静态的成员函数也被放置在所有类对象之外.每个类产生一堆指向虚函数的指针,放在虚表(vtbl)中.每个类对 ...

  3. Vue2.0源码学习(6) - 组件注册

    组件注册 前言 在 Vue.js 中,除了它内置的组件如 keep-alive.component.transition.transition-group 等,其它用户自定义组件在使用前必须注册.在开 ...

  4. k8s虚拟机未关闭,电脑重启后,虚拟机无法启动

    莫名其妙电脑重启了,虚拟机连不上,心里真的是一万匹草泥马,显示如下: Generating "/run/initramfs/rdsosreport.txt" Entering em ...

  5. kali linux安装nessus

    详细介绍在 Kali 中安装 Nessus 的详细过程步骤以及插件下载失败解决方法. 实验环境 安装过程 下载 Nessus 安装 Nessus 启动 Nessus 获取激活码 登陆 web 界面 N ...

  6. flask 中使用蓝图将路由分开写在不同文件

    flask 若想将不同的路由写在不同的文件中(如将 user 对象的相关接口写在一个文件中,将 customer 对象的相关接口写在另一个文件中),可以使用蓝图来实现. 有关蓝图的定义:A Bluep ...

  7. EXCEL应用之商机分析:企业商机分析模板免费用

    ​一.分析背景 商机是订单的来源,因此抓住每个销售机会,就可以更多地赢得交易.商机管理可以说是业务环节中最为关键的一步.每个企业都有自己的商机阶段划分,从销售人员接触客户.发现商机.跟进商机.推进销售 ...

  8. 财务数据分析工具的选择:Excel还是大数据BI?

    ​财务数据分析一般都采用什么工具?跟财务数据分析的哪些指标有关?要怎样展现财务数据间的紧密关联? 财务报表分析比较复杂,一般来说主要包括以下项目: 1. 趋势:在多个时间段内为财务报表中的关键项目创建 ...

  9. netty系列之:EventExecutor,EventExecutorGroup和netty中的实现

    目录 简介 EventExecutorGroup EventExecutor EventExecutorGroup在netty中的基本实现 EventExecutor在netty中的基本实现 总结 简 ...

  10. 60天shell脚本计划-5/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月16日 --修改时间:2021年2月20日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...