数组是一种常用的数据结构,高级语言头提供了支持数组的基本操作,而且数组也是构成其他数据结构的重要组成。

数组是N个相同元素的构成的占用一块地址连续的内存单元的有限序列。

数组的任一个元素都可以用在数组的位置来表示。

数组与线性表区别:数组符合线性结构的定义。

但是区别是: 数组要求占用连续的地址空间,线性表的元素是不可分割的,数组可以是二维数组,数组主要操作是存放和读取数据。

数组的实现机制:

通常以字节为内部计数单位。对一个有N个数据元素的一维数组,设a0是下标为0的数组元素,Loc(a0)的内存单元地址,K是每一个数组元素的所需的字节个数,则数组中的任一个数据元素ai的内存单元地址为Loc(ai)可由下边公司求出:

Loc(ai) = Loc(a0) + i*K;(0<=i<=N)

对于二维数组 M行N列

Loc(ai) = Loc(a00) +( i*N+j)*;(0<=i<=M)(0<=j<=N);

串:

串是一种线性结构,与线性表的不同是:串的操作特点是依次操作若干数据元素,即一个子串。串可以使用顺序结构和链式结构存储。串的顺序结构存储空间和时间效率更高。模式匹配是串的很重要的一个操作。Brute-Force和KMP算法是两种最经常使用的串的模式匹配算法。

串的基本概念:串是有个N>=0个字符组成的有限序列。一个串中任意个连续的字符组成的子序列称为该串的子串。

串和字符不是一个概念:串是长度不定的字符序列的集合。字符只是一个字符。

串的抽象数据类型:

串可以是由S0  , ...SN字符的组合。

操作的集合:

初始化字符串;

赋值字符串

字符串长度

比较字符

插入字符

删除字符

取子串

查找子串

替换子串

C语言用字符数组存储串。串的长度是不定,C语言解决长度不定的方法是在串的末尾自动添加一个'\0'作为字符串的结束标志。

串的存储结构:

串的存储结构有顺序存储结构和链式存储结构两种。

串的顺序存储结构:

与线性表的存储结构相同,可以用一个字符类型的数组存储串值。

在串的顺序存储结构中,由于串的长度不定,因此要使用一种方法来辨别串的长度,一种是固定设置串长度,一种是使用\0作为串的结束标志。

串的链式存储结构:

串的链式链式结构就是把串值非别存放在构成链表的若干个结点的数据域上。串的链式结构分为单字符点连和块链两种。

单字符链就是一个结点存储一个字符。

块链就是一个结点存储几个字符

串的基本实现方法:如同线性表的实现方法。

使用PHP代替:

<?php

/**
*
*串的实现
*/
header('Content-type: text/html;charset=utf-8');

class char {
    public $size = 0; //元素个数而非数组大小
    public $arr = array();
    public $maxsize = 10; //数组大小
    
    
    public function __construct($arr = array()) {
        $this->size = count($arr);
        $this->arr  = $arr;
    }
    
    public function sizes() { return size;}
    /**
    *@param int 开始位置
    *@param string 插入的字符串
    *@return bool
    */
    public function add($start,$str)  {
        $len = strlen($str);
        if(($start+$len) > $this->maxsize) {
            return false;//插入数据超出字符大小
        } else {
            for($i = $this->size-1;$i >= $len;$i--){
                $this->arr[$i+$len] = $this->arr[$i];
            }
            for($i = 0;$i<$len;$i++){
                $this->arr[$start+$i] = $str{$i};
            }
            $this->size = $this->size + $len;
        }
    }
    /**  0,1,2,3,4,5,6
    *删除字符串
    *@param int 开始位置
    *@param int 删除的个数
    */
    public function delete($start,$len) {
        if(($start+$len) > $this->maxsize) {
            return false;
        } else {
            for($i=$start+$len;$i <=$this->size-1;$i++) {
                $this->arr[$i-$len] = $this->arr[$i];
            }
            $this->size = $this->size-$len;
            for($i=$this->size-$len;$i <=$this->size-1;$i++) {
                unset($this->arr[$si]);
            }
        }
    }
    /**  0,1,2,3,4,5,6
    *取字符串
    *@param int 开始位置
    *@param int 删除的个数
    */
    public substr($start,$len) {
        for($i=0;$i<$len;$i++){
            $str.=$this->arr[$i+$start];
        }
        return $str;
    
    }
    
    public function getstr() { echo implode('',$this->arr);}
    /***************串的模式匹配***************/
    
    
}

$char = new char();
$char->add(0,'1');
$char->getstr();

串的模式匹配:

Brute-Force算法

BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若     不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。

function BF($str,$t) {
        for($i=0;$i<strlen($str);$i++) {
            for($j=0;$j<strlen($t);$j++) {
                if($str{$i}==$t{$j}) {$i++;} else { echo '<'.$i.'-'.$j.'>';$i = $i-$j; break;}
            }
            if($j==strlen($t)) return 'true';
        }
        return 'Flase';
    }

function BF2($str,$t) {
        $i=$j=0;
        while($i<strlen($str)) {
            $j=0;
            while($str{$i} == $t{$j} && $j<strlen($t)) {
                $i++;
                $j++;
            }
            if($j==strlen($t)) return 'true';
        }
        return 'Flase';
    }

KMP算法是对BF算法的优化

<?php
function indexNext($str){
    $k = 0;   //相同字符的位数
    $j=1;
    $nexts[0] = -1;  //是为了匹配当一个模式字符不予串匹配时的情况
    $nexts[1] = 0;   //当第二字符不匹配时 直接比较第一个字符
    while($j<strlen($str)) {
        if($str{$j} == $str{$k}) {  //出现相同字符时
            $nexts[$j+1] = $k+1;
            $j++;
            $k++;
        } else if($k==0) { //未出现相同字符 且前边也未出现相同字符时
            $nexts[$j+1] = 0;
            $j++;
        } else { //前边有相同字符,依次用当前字符比较是否与以前字符相同
            $k = $nexts[$k];
            
        }
    }
    return $nexts;
}

function KMP($str,$t) {
    $nexts = indexNext($t);
    print_r($nexts);
    $i = 0;$j=0;
    $k = 0;
    while($i<strlen($str) && $j < strlen($t)) {
        $k ++;
        if($j == -1 || $str{$i} == $t{$j}) {//是为了匹配当一个模式字符不予串匹配时的情况及当$str{$i} == $t{$j}
            $i++;$j++;
        } else {
        //当$str{$i} != $t{$j} 算出 真子串中相同的部分 真子串中相同的部分不用在比较
            echo $i.'-'.$j.'*';
            $j = $nexts[$j];
        }
        
        if($j==strlen($t)) {echo $k;return 'true';}
    }
    return 'false';
    
}

echo KMP("BBC ABCDAB ABCDABCDABDE","ABCDABD");
print_R(indexNext("AAABCDAAABD"));

请问广大牛人,这样实习KMP算法对吗?

转载于:https://www.cnblogs.com/phplhs/p/4340793.html

数组与串,串的实现,KMP,BF算法相关推荐

  1. 4.3串的模式匹配算法(BF算法)

    4.3.1 求子串位置的定位函数Index(S,T,pos) 子串的定位操作通常称做串的模式匹配(其中T称为模式串),采用定长顺序存储结构,可以写出不依赖于其他串操作的匹配算法. 算法4.5: 下面是 ...

  2. 串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.串(String)的定义: 串(String):由零个或多个字符组成的 ...

  3. BF算法优化-------KMP算法

    百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...

  4. 字符串:2.BF算法(普通模式匹配算法)

    判断两个串之间是否存在主串与子串的关系,这个过程称为串的模式匹配. 在串的模式匹配过程,子串 T 通常被叫做"模式串". 普通的模式匹配("BF"算法) 判断两 ...

  5. 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    一.实验目的 1.了解串的基本概念. 2.掌握串的模式匹配算法的实现 . 二.实验预习 说明以下概念 1.模式匹配: 串的模式匹配就是子串的定位运算. 设有两个字符串 S 和 T ,S为主串(正文串) ...

  6. 串的模式匹配(KMP算法)

    [问题描述] 串的模式匹配算法实现(KMP算法) [输入形式] 第一行输入主串s: 第二行输入模式串t: 第三行输入起始位置pos: [输出形式] 输出模式串t的next值(以空格分隔) 输出模式匹配 ...

  7. 《数据结构》—— 串,KMP模式算法(转载)

    本文内容转载自: KMP 算法(1):如何理解 KMP KMP 算法(2):其细微之处 一:背景展开目录 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即 ...

  8. c语言实现bf算法的定位函数,数据结构c语言版严蔚敏清华大学出版社第四章串.ppt...

    数据结构c语言版严蔚敏清华大学出版社第四章串 模式匹配(定位) 设有主串S和子串T(将S称为目标串,将T称为模式串),在主串S中,从位置start开始查找,如若在主串S中找到一个与子串T相等的子串,则 ...

  9. 【考研】串的模式匹配算法——KMP算法(含真题)

    前言 本文内容源于对<数据结构(C语言版)>(第2版).王道讲解学习所得心得.笔记整理和总结,以便复习. 可搭配以下链接一起学习: [考研]<数据结构>知识点总结.pdf_考研 ...

最新文章

  1. MATLAB利用YCBCR切割出人脸头像
  2. Bitdefender 服务器版安装程序官方下载
  3. 【转】Dynamics 365中的事件框架与事件执行管道(Event execution pipeline)
  4. Discuz论坛 带数据整站打包
  5. Java数组去重的多种方法,[Java教程]JavaScript常见的五种数组去重的方式
  6. 【格局】一张图看懂全球人工智能竞争格局|湾区人工智能
  7. ORACLE常用数值函数、转换函数、字符串函数【转】
  8. Unity 3D 学习(一)——Roll a ball
  9. Proxyee-down – 百度网盘全平台满速下载神器,还带有IDM的全网嗅探功能!(替代PanDownload)
  10. 网页设计_导航条_下拉菜单
  11. 攒齐智能产品组合,世界召唤四大超级力量
  12. matlab华侨大学,范文涛
  13. 在HTML中marquee有什么作用,【HTML】HTML之marquee详解
  14. eclipse远程调试Java程序
  15. python禅语_42:对象、类、以及从属关系
  16. C语言制作的讯飞语音合成、识别、唤醒标准调用接口DLL
  17. 2022中国大学专业排名公布:集成电路相关专业哪家强?
  18. java计算机毕业设计旅游信息网站源程序+mysql+系统+lw文档+远程调试
  19. 128g固态硬盘服务器,买美光就后悔 浦科特M5S 128G/SSD评测
  20. 干货面试教程!用友java开发工程师待遇

热门文章

  1. tensorflow 目标分割_Tensorflow中的控制流和优化器
  2. 利用Date类计算生活时间
  3. Java编程思想学习(一) 一切都是对象
  4. 在Oracle里,表的别名不能用as,列的别名可以用as
  5. nyoj--79--导弹拦截(动态规划)
  6. post提交,WPF,Silverlight(加深记忆写一遍)
  7. WinAPI: midiOutGetID - 获取输出设备 ID
  8. html title属性无效_【学习教程】使用JavaScript删除CSS属性
  9. http详解 请求报文格式和响应报文格式
  10. vasp服务器中断,求助VASP能带计算的中断原因