数组与串,串的实现,KMP,BF算法

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

 数组是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431946.shtml

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

相关文章

结对开发——求最大值

一、题目&#xff1a; 返回一个整数数组中最大子数组的和。 要求&#xff1a; 1.输入一个整形数组&#xff0c;数组里有正数也有负数。 2.数组中连续的一个或多个整数组成一个子数组&#xff0c;每个子数组都有一个和。 3.求所有子数组的和的最大值。要求时间复杂度为O(n)。 二…

浏览器获取设备信息_一条命令获取 IE 浏览器保存网站的账号和密码信息

渗透攻击红队一个专注于红队攻击的公众号大家好&#xff0c;这里是 渗透攻击红队 的第 41 篇文章&#xff0c;本公众号会记录一些我学习红队攻击的复现笔记(由浅到深)&#xff0c;不出意外每天一更Powershell内网渗透一直以来都是一个热门话题&#xff0c;试想在一个大型的内网…

(转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性

转发&#xff1a;微软MVP 卢建晖 的文章&#xff0c;希望对大家有帮助。原文&#xff1a;http://blog.csdn.net/kinfey/article/details/44459625 编者语 &#xff1a; 昨晚写好的文章居然csdn不审核&#xff0c;这个也难怪人&#xff0c;但自己比较忙没办法。分享继续&#xf…

win10 python 调用模块_python常识系列14--gt;python通过jpype模块调用jar包

前言能坚持一件事&#xff0c;本身就是一种很了不起的才华。一、jpype模块是什么&#xff1f;能够让 python 代码方便地调用 Java 代码的工具二、jpype模块安装安装和其它模块没区别&#xff0c;但是注意模块名 是 jpype1 &#xff0c;后面有个1pip install jpype1三、jpype模块…

mysql 载入主体时出错_mysql遇到load data导入文件数据出现1290错误的解决方案

错误出现情景在cmd中使用mysql命令&#xff0c;学生信息表添加数据。使用load data方式简单批量导入数据。准备好文本数据&#xff1a; xueshengxinxi.txt 文件 数据之间以tab键进行分割执行 “load data infile 文本数据路径 into table tab_load_data” 弹出错误。#load d…

【原创】Kakfa utils源代码分析(一)

Kafka.utils&#xff0c;顾名思义&#xff0c;就是一个工具套件包&#xff0c;里面的类封装了很多常见的功能实现——说到这里&#xff0c;笔者有一个感触&#xff1a;当初为了阅读Kafka源代码而学习了Scala语言&#xff0c;本以为Kafka的实现会用到很多函数编程(Functional Pr…

redhad yum 安装mysql_redhat7通过yum安装mysql5.7.17教程

rhel/centos系列linux操作系统自身没有mysql的源&#xff0c;需要自行下载安装。本文介绍如何安装mysql5.7.x数据库。第一步&#xff1a;下载源[rootclient ~]# wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm注意&#xff1a;选择mysql57-community-…

codechef Polo the Penguin and the Tree

一般xor 的题目都是用trie解决。 那这道题是在树上的trie; 首先&#xff1a;从root1,遍历树得到1到所有节点的xor 值。 然后对于每个点我们把其插入二进制树中。 对于每一个点查找其二进值异或值最大的数 依次遍历下来。 注意&#xff1a;边的数量开两倍以上&#xff0c;RE很多…

mysql主从和dump_MySQL主从同步--原理及实现(一)

1、什么是mysql主从同步&#xff1f;当master(主)库的数据发生变化的时候&#xff0c;变化会实时的同步到slave(从)库。2、主从同步有什么好处&#xff1f;水平扩展数据库的负载能力。容错&#xff0c;高可用。Failover(失败切换)/High Availability数据备份。3、主从同步的原理…

解密多媒体封装解封装框架

上一篇文章我们搭好了环境并编译出所需的ffmpeg库&#xff0c;本篇我们讨论如何利用ffmpeg提供的API函数进行多媒体文件的解封装&#xff08;demux&#xff09;过程。在讲解之前&#xff0c;我们需要了解一些基本的多媒体文件知识&#xff0c;大虾请飘过。 容器格式&#xff1a…

bzoj 3611

和BZOJ消耗站一样&#xff0c;先将那个询问的简图构建出来&#xff0c;然后就是简单的树形DP。 &#xff08;倍增数组开小了&#xff0c;然后就狂WA&#xff0c;自己生成的极限数据深度又没有那么高&#xff0c;链又奇迹般正确&#xff09; 1 #include <cstdio>2 #includ…

vscode添加源文件_VSCode自制的IDE编译多个源文件

文/EdwardVSCode的预定义变量我们上一篇文章中讲述了如何将MinGW工具嵌入到VSCode文本编辑器中&#xff0c;在这个配置的过程中&#xff0c;我们只需要通过修改VSCode生成的“luanch.json”和“task.json”两个JSON文件中的特定字段&#xff0c;就可以实现开发环境的搭建。那么…

mysql+自动还原备份_Mysql 自动备份与恢复

自动备份MySql 5.0有三个方案&#xff1a;备份方案一&#xff1a; 通过 mysqldump命令,直接生成一个完整的 .sql 文件Step 1: 创建一个批处理(说明&#xff1a;root 是mysql默认用户名, aaaaaa 是mysql密码, bugtracker 是数据库名)------------mySql_backup.bat--------------…

Web Service 学习

1. Web services 平台的元素&#xff1a; SOAP (简易对象访问协议) UDDI (通用描述、发现及整合) WSDL (Web services 描述语言)1.1 什么是 SOAP&#xff1f; 基本的 Web services 平台是 XML HTTP。 SOAP 指简易对象访问协议 SOAP 是一种通信协议 SOAP 用于应用程序之间的通信…

mysql事务所_mysql事务

1.事务的ACID属性事务(Database Transaction) &#xff0c;是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成&#xff0c;否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元&…

Swift 操作符

这里只记录一些swift特殊的运算符 1.swift里面 仅仅进行赋值操作&#xff0c;不再向右边返回左值 2.模运算的操作数可以是小数了 3.Nil Coalescing Operator nil coalescing operator用来判断一个可选值是否有值&#xff0c;如果没有的话就赋予其一个缺省值 注意这里面“&…

netty java_Netty框架学习及第一个Netty应用

编辑推荐:本文来自于csdn,文章主要介绍了Netty的基础&#xff0c;有什么特点&#xff0c;其构成部分是什么&#xff0c;以及相关的应用。1.什么是Netty&#xff1f;Netty是一个利用Java的高级网络的能力&#xff0c;隐藏其背后的复杂性而提供一个易于使用的API的客户端/服务器框…

webdriver 爬虫 java_java爬虫通过selenium+WebDriver遍历页面链接报错

背景由于要爬取的页面&#xff0c;每个链接的请求都是点击之后js动态发起的&#xff0c;目标数据也多是js动态生成的&#xff0c;所以使用selenium工具webdriver(调试用的是chrome&#xff0c;具体使用准备用phantomjs).模拟登录之后&#xff0c;模拟查询之后&#xff0c;得到如…

XmlDocument类

XmlDocument类是.NET框架的DOC解析器。XmlDocument将XML视为树状结构&#xff0c;它装载XML文档&#xff0c;并在内存中构建该文档的树状结构。下面来看下XmlDocument提供了哪些功能。 一、属性&#xff1a; Attributes      获取一个 XmlAttributeCollection&#xff0c…

java类作用域标识符_java入门 (二) 标识符、数据类型、类型转换、变量、常量、作用域...

java入门(二)标识符数据类型类型转换变量、常量、作用域本次笔记引用B站&#xff1a;狂神说,虽然早就会了&#xff0c;现在回头来敲下基础&#xff0c;加深印象1.标识符&#xff1a;java所有的组成部分都需要名字。类名丶变量名丶方法名统称为标识符。标识符大小写敏感。不能使…