数组与串,串的实现,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,一经查实,立即删除!

相关文章

libsvm python_LibSVM for Python 使用

经历手写SVM的惨烈教训(还是太年轻)之后&#xff0c;我决定使用工具箱/第三方库PythonLibSVM是开源的SVM实现&#xff0c;支持C&#xff0c; C&#xff0c; Java&#xff0c;Python &#xff0c; R 和 Matlab 等, 这里选择使用Python版本。安装LibSVM将LibSVM仓库的所有内容放入…

结对开发——求最大值

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

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

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

__bridge,__bridge_retained,__bridge_transfer

最近遇到类型转换需要添加__bridge等开始不是很理解&#xff0c;后面查询资料才知道在CFObject 与 NSObject 之间转换时&#xff0c;ARC是不能管理Core Foundation object的生命周期。 在CFObject 与 NSObject 之间转换时&#xff0c;需要用到__bridge,__bridge_retained,__bri…

thinkphp5 判断数据是否存在_ThinkPHP 5.1 中间件中判断要访问的操作是否存在

ThinkPHP 5.1 中间件中判断要访问的操作是否存在ifu25 • 2021 年 01 月 15 日按惯例还是吐槽 ThinkPHP 官方社区极度不友好&#xff0c;提问基本得不到答案&#xff0c;更很少有官方人员回复。ThinPHP 5.1 中间件判断 action 是否存在中间件public function handle($request, …

NodeJS 学习记录

一、环境 1. 操作系统&#xff1a;win7, 32位 2. nodejs版本&#xff1a;v0.12.0 3. npm版本&#xff1a;2.5.1 二、问题 1. npm安装镜像源问题 国外镜像源很慢&#xff0c;国内出名且公开的有淘宝&#xff0c;也有内部未公开的&#xff0c;比如我所在的公司 示例&#xff1a; …

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

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

mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解

昔日庖丁解牛&#xff0c;未见全牛&#xff0c;所赖者是其对牛内部骨架结构的了解&#xff0c;对于MySQL亦是如此&#xff0c;只有更加全面地了解SQL语句执行的每个过程&#xff0c;才能更好的进行SQL的设计和优化。 当希望MySQL能够以更高的性能运行查询时&#xff0c;最好的办…

Java——容器(泛型)

【泛型】 起因&#xff1a;JDK1.4之前类型不明确<1>装入集合的类型都被当做Object对待&#xff0c;从而失去自己的实际类型。<2>从集合中取出时往往需要转型&#xff0c;效率低&#xff0c;且很容易出错。解决办法&#xff1a;<1>在定义集合的时候同时定义集…

quartz mysql 初始化_quartz scheduler 从数据库初始化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

mysql group by 慢_mysql“group by”查询非常慢

我在一个有大约100k记录的表中有这个查询,它运行得很慢(3-4s),当我取出组时它更快(少于0.5s).我很想知道如何解决这个问题&#xff1a;SELECT msg.id,msg.thread_id,msg.senderid,msg.recipientid,from_user.username AS from_name,to_user.username AS to_nameFROM msgtable A…

拦截QT关闭窗口的CloseEvent

QDialog类下有一个虚函数 void QDialog::closeEvent ( QCloseEvent * e ) [virtual protected] 通过实现closeEvent函数&#xff0c;就可以以对关闭窗口消息进行拦截&#xff0c;比如程序还没有完成工作时&#xff0c;可以弹出警告窗口&#xff0c;即使用户确认退出操作…

mysql8.0本机登录要1秒_Mysql8.0的登录大坑……(忘记登录密码也可以这么搞)

关于安装和使用就不说了&#xff0c;属于基本操作了&#xff1b;我来重点记录一下关于使用前&#xff0c;使用navicat登录的时候报错&#xff0c;1130和2059查看安装后随机生成的密码&#xff1a; grep temporary password /var/log/mysqld.log原因&#xff1a;mysql8的密码验证…

Gmail邮箱添加域名解析

主机记录 MX 服务器地址 优先级 MX ASPMX.L.GOOGLE.COM. 10 MX ALT1.ASPMX.L.GOOGLE.COM. 20 MX ALT2.ASPMX.L.GOOGLE.COM. 20 MX ASPMX2.GOOGLEMAIL.COM. 30 MX ASPMX3.GOOGLEMAIL.COM. 30 MX ASPMX4.GOOGLEMAIL.COM. 30 MX ASPMX5.GOOGLEMAIL.COM. 3…

tidb vs mysql_一个长耗时SQL在TiDB和Mysql上的耗时测试

之前看到的TiDB和MySql的性能对比都是大量短耗时请求下的压测&#xff0c;单机情况下TiDB和MySql的确有些差距&#xff0c;不过笔者最近碰到的场景更多是sql要扫描的行数不小的情况下单sql比较耗时的问题&#xff0c;所以自己做了个简单测试这类型sql的耗时。TiDB单机环境部署g…

Oracle存储过程(转)

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明…

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

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

js 定时器

Document自带的方法&#xff1a; 循环执行&#xff1a;var timeid window.setInterval&#xff08;“方法名或方法”&#xff0c;“延时”&#xff09;;window.clearInterval(timeid); 定时执行&#xff1a;var tmid window.setTimeout(“方法名或方法”, “延时”);window.c…

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

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

JavaScript快速入门(四)——JavaScript函数

函数声明 之前说的三种函数声明中&#xff08;参见JavaScript快速入门&#xff08;二&#xff09;——JavaScript变量&#xff09;&#xff0c;使用Function构造函数的声明方法比较少见&#xff0c;我们暂时不提。function func() { }和var func function() { }除了在声明提升…