数据结构与算法之“串”学习笔记

 

 

       在较早的程序设计语言中,字符串是作为输入和输出的常量出现的。随着语言加工程序的发展,产生了字符串处理。这样,字符串也就作为一种变量类型出现在越来越多的程序设计语言中,同事也产生了一系列字符串的操作。字符串一般称为串,在汇编和语言的编译程序中,源程序和目标程序都是字符串数据。在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规格等一般也是作为字符串处理的。又如信息检索系统、文字编辑程序、问答系统、自然语言翻译系统以及音乐分析程序等,都是以字符串数据作为处理对象的。

       如今使用的计算机的硬件结构主要是反映数值计算的需要的,因此,在处理字符串数据时比处理整数和浮点数要复杂得多。在不同的类型的应用中,所处理的字符串具有不同的特点,要有效地实现字符串的处理,就必须根据具体情况使用合适的存储结构。

一、串类型的定义:

      1、串(String)是由零个或多个字符组成的有限序列:

      2、串相等:当且仅当两个串的值相等。只有当两个的长度相等,并且各个对应位置的字符都相等时才相等。

二、串的表示和实现:

      1、定长顺序存储表示:类似于线性表顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。

      2、对分配存储表示:这种存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得。在C语言中,存在一个称之为“堆”的自由存储区,并由C语言的动态分配函数malloc()和free()来管理。利用函数malloc()为每个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基址。

 

 

 

 

      3.串的块链存储表示:和线性表的链式存储结构相类似,可采用链表方式存储串值。由于串结构的特殊性——结构中的每个元素是一个字符,则用链表存储值时,存在一个“结点大小”的问题。即每个结点可以存放一个字符,也可以存放多个字符。

      为了方便进行串的操作,当以链表存储串值时,除头指针外还可以附设一个尾指针指示链表中的最后一个结点,并给出当前的长度。称如此定义的串存储结构为块链结构:

 

三、串的模式匹配算法:

      1.求子串位置的定位函数Index(S,T,pos) :

          子串的定位操作通常称做模式匹配(其中T称为模式串):

      2、BF算法:

           BF算法的BF是Brute Force的缩写,我们的主串中,检查起始位置分别是1、2.....n-m且长度m的n-m+1个子串,看有没有跟模式串匹配的。

          

                 

       3.RK算法:

           RK算法的思路是这样的:我们通过哈希算法对主串的n-m+1个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了。

             

         4、BM算法:

              核心思想是把模式串和主串的匹配过程,看做模式在主串中不停地往后滑动,当遇到不匹配的字符时,BF算法和RK算法的做法是,模式串往后滑动一位,然后从模式串的第一个字符开始重新匹配。而BM算法就是在模式串与主串匹配的过程中,当模式串和主串某个字符不匹配的时候,能够跳过一些肯定不会匹配的情况,讲模式串往后多滑动几位。

            BM算法的匹配顺序是倒着匹配的

            坏字符规则:从模式串的末尾往前倒着匹配,当发现某个字符没法匹配的时候。我们把这个没有匹配的字符叫坏字符。

            坏字符的代码实现

public int bm(char[] a, int n, char[] b, int m) {
        int[] bc = new int[SIZE]; // 记录模式串中每个字符最后出现的位置
        generateBC(b, m, bc); // 构建坏字符哈希表
        int i = 0; // i 表示主串与模式串对齐的第一个字符
        while (i <= n - m) {
            int j;
            for (j = m - 1; j >= 0; --j) { // 模式串从后往前匹配
                if (a[i+j] != b[j]) break; // 坏字符对应模式串中的下标是 j
            }
            if (j < 0) {
                return i; // 匹配成功,返回主串与模式串第一个匹配的字符的位置
            }
            // 这里等同于将模式串往后滑动 j-bc[(int)a[i+j]] 位
            i = i + (j - bc[(int)a[i+j]]);
        }
        return -1;
    }

           好后缀规则:把已经匹配的bc叫做好后缀。

    

     5、KMP算法:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值