数据结构04串

第四章 串

STL:string  http://blog.csdn.net/weixin_37289816/article/details/54716009

计算机上非数值处理的对象基本上是字符串数据。

在不同类型的应用中,字符串具有不同的特点,要有效的实现字符串的处理,必须选用合适的存储结构。

 

4.1 串类型的定义

串 String 由零个或多个字符组成的有限序列。

s = 'a1a2a3...an'   n >= 0

s 串名

用单引号扩起来的字符序列是串的值

n 串的长度

空串:零个字符的串

子串:串中任意个连续字符组成的子序列称为该串的字串

位置:字符在序列中的序号称为该字符在串中的位置

相等:当且仅当两个串的值相等

 

串的逻辑结构与线性表极为相似,区别仅在于串的数据对象约束为字符集。

最小操作子集: 串赋值求串长 求子串 串比较 串连接

 

4.2 串的表示和实现

串的三种表示方法:

1、定长顺序存储表示

   用一组连续的存储单元存储串值的字符序列,此时串的最大长度被限定。

   两种表示方法:

        1以下标为0的数组分量存放串的实际长度  PASCAL

        2在串值后面加一个不计入串长的结束标记字符,此时串长为隐含值  C语言中的'\0'

 

2、堆分配存储表示

   在C语言中,存在一个称之为“堆”的自由存储区,由动态分配函数malloc()和free()管理。

   仍以一组连续的存储单元存储串值的字符序列,此时串的长度无限制。

   存储空间在程序执行过程中动态分配。

 

3、块链存储表示

   块大小的选择

   头指针 尾指针串长度

   设置尾指针的目的:联结操作

 

4.3 串的模式匹配算法

串的模式匹配:字串的定位操作。

KMP算法: O(n+m)

改进:每当一趟的匹配过程中出现字符比较不等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。

 

匹配仅需从模式中第k个字符与主串中第i个字符继续进行比较:此时模式中头k-1个字符和主串中最后k-1个字符相同。

亦即 next[1, j-1] 这个串中,前后缀相同串的字符为 next[1, next[j] - 1],所以下一次比较的是next[j]个字符的不同。

next数组里存放的,相同前后缀子串,前子串位置的下一个位置坐标。

 

next[j] = k : 当模式中第j个字符失配时,重新进行比较的位置。

算法:

假设主串指针i = pos,模式串指针j = 1;

若si = pj,则i++, j++;

否则j = next[j], 继续进行si 和pj 的比较。

如果 j = 0, 则 i++, j++, 继续进行si和 pj的比较。

 

KMP算法的基础是next函数值,仅和模式串本身有关。

求next[j + 1] 的方法:

next[1] = 0;

next[j] = k;

若 pk = pj,next[j + 1] = k +1;

若 pk!=pj,k = next[k],继续进行pk和 pj的比较。若k = next[k] = 0,则next[j + 1] = 1。

 

 

i = 1;
next[1] = 0;
j = 0;
while (i < length)
{if (j == 0 || T[i] == T[j])i++; j++; next[i] = j;elsej = next[j];
}

 

 

 

两点说明:

1、简单算法的时间复杂度虽然是O(n*m),但在一般情况下,其实际执行时间近似于O(n+m),因此至今仍被采用。

KMP算法仅当模式与主串之间存在许多“部分匹配”的情况下才显得比简单算法快得多。

KMP算法的最大特点:无需回溯,整个匹配过程,对主串仅需从头至尾扫描一遍,这对处理从外设输入的庞大文件很有效,可以边读入边匹配,而无需回头重读。

2、next函数的修正算法 针对连续字符的改进

 

i = 1;
next[1] = 0;
j = 0;
while (i < length)
{if (j == 0 || T[i] == T[j])i++; j++;if (T[i] != T[j])  next[i] = j;else next[i ] = next[j];elsej = next[j];
}

 

 

 

 

 

4.4 串操作应用举例:

文本编辑

文本编辑程序是一个面向用户的系统服务程序,文本编辑的实质是修改字符数据的形式或格式。

虽然各文本编辑程序的功能强弱不同,但基本操作是一致的,一般包括串的查找、插入、删除等。

可以利用换页符和换行符把文本划分为若干页,每页有若干行。

把文本看成是一个字符串,称为文本串。页是文本串的子串,行是页的子串。

 

为了管理文本的页和行,在进入文本编辑的时候,编辑程序先为文本串建立相应的页表和行表,即建立各子串的存储映像。

页表的每一项给出页号和该页的起始行号。

行表的每一项指示行号、起始地址和该字串的长度。

设立页指针、行指针、字符指针,分别指向当前操作的页、行、字符。

页表和行表是递增顺序存储的,对行表进行的插入或删除运算需移动操作位置以后的全部表项。

Tip:由于访问是以页表和行表作为索引的,所以在作行和页的删除操作时,可以只对行表和页表作相应的修改,不必删除所涉及的字符,这样可以节省时间。

 

 

建立词索引表

信息检索。

可设定此索引表为按字典有序的线性表。

 

重复下列操作直至文件末尾:

1、从书目文件中读取一个书目串

2、从书目串中提取所有关键词插入词表

3、对词表中的每一个关键词,在索引表中进行查找并作相应的插入操作。

 

需要一张常用词表,不在常用词表中的字符串为关键字。

索引表虽是动态生成,在生成过程中需频繁进行插入操作,但考虑索引表主要为查找用,为了提高查找效率,宜采用顺序存储结构

索引表内容:关键词 + 书号索引。

书号索引采用链式存储结构。

 

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

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

相关文章

CAS单点登录原理解析

CAS单点登录原理解析 SSO英文全称Single Sign On&#xff0c;单点登录。SSO是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。CAS是一种基于http协议的B/S应用系统单点登录实现方案&#xff0c;认识CAS之前首先要熟悉http协议、Session与Co…

数据结构05数组和广义表

第五章 数组 和 广义表 数组和广义表可以看成是线性表在下述含义上的扩展&#xff1a;表中的数据元素本身也是一个数据结构。 5.1 数组的定义 n维数组中每个元素都受着n个关系的约束&#xff0c;每个元素都有一个直接后继元素。 可以把二维数组看成是这样一个定长线性表&…

数据结构06树和二叉树

第六章 树和二叉树 6.1 树的定义和基本术语 树 Tree 是n个结点的有限集。 任意一棵非空树中&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根&#xff08;root&#xff09;的结点&#xff1b; &#xff08;2&#xff09;当n>1时&#xff0c;其余结点可…

CountDownLatch,CyclicBarrier和Semaphore

在java 1.5中&#xff0c;提供了一些非常有用的辅助类来帮助我们进行并发编程&#xff0c;比如CountDownLatch&#xff0c;CyclicBarrier和Semaphore&#xff0c;今天我们就来学习一下这三个辅助类的用法。以下是本文目录大纲&#xff1a;一.CountDownLatch用法二.CyclicBarrie…

数据结构07排序

第十章内部排序 10.1 概述 排序就是把一组数据按关键字的大小有规律地排列。经过排序的数据更易于查找。 排序前KiKj&#xff0c;且Ki在前: 排序方法是稳定的&#xff0c;若排序后Ki在前&#xff1b; 排序方法是不稳定的&#xff0c;如排序后Kj在前。 分类&#xff1a; 内…

数据结构08查找

第九章 查找 另一种在实际应用中大量使用的数据结构--查找表。 所谓查找&#xff0c;即为在一个含有众多的数据元素的查找表中找出某个“特定的”数据元素。 查找表 search table 是由同一类型的数据元素构成的集合。集合中的数据元素之间存在着完全松散的关系&#xff0c;故…

下载Centos7 64位镜像

下载Centos7 64位镜像 1.打开Centos官网 打开Centos官方网站地址&#xff1a;https://www.centos.org/&#xff0c;点击Get CentOS Now 2.点击Minimal ISO镜像 Minimal ISO镜像&#xff0c;与DVD ISO镜像的差别有很多&#xff0c;这里只说两点 1.Minimal ISO类似于Windows的纯净…

Scala01入门

第1章 可伸展的语言 Scala应用范围广&#xff0c;从编写脚本&#xff0c;到建立大型系统。 运行在标准Java平台上&#xff0c;与Java库无缝交互。 更能发挥力量的地方&#xff1a;建立大型系统或可重用控件的架构。 将面向对象和函数式编程加入到静态类型语言。 在Scala中&a…

Java网络01基本网络概念

协议 Protocol&#xff1a;明确规则 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;数据如何分包&#xff1b; ... TCP/IP四层模型&#xff1a; 应用层 HTTP SMTP POP IMAP 传输层 TCP UDP 网际层 IP 主机网络层 host to host layer 数模、…

Java网络02基本Web概念

URI Uniform Resource Identifier 同一资源标识符 以特定语法标识一个资源的字符串 绝对URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分为&#xff1a; data file本地文件系统 ftp http telnet urn 统一资源名 scheme-specific-part为&am…

解决自建ca认证后浏览器警告

前一篇讲解了基本的建立证书的过程&#xff0c;但是建立后总是会在浏览器那里警告&#xff1a; 此链接不是私密链接 --谷歌浏览器 此证书颁发机构不可信 此证书不是这个网站的 --ie浏览器 总之证书是生成成功了&#xff0c;但是其中的内容填写错误了&a…

Java网络03流

网络程序所做的很大一部分工作只是输入和输出&#xff1a;从一个系统向另一个系统移动数据。 输出流 Java的基本输出流类是java.io.OutputStream: public abstract class OutputStream 这个类提供了写入数据所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序开发的仿微信demo

(本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明&#xff1a; 基于微信小程序开发的仿微信demo 整合了ionic的样式库和weui的样式库 使用请查看使用必读! 更新日志请点击这里 目前功能 查看消息 网络请求获取数据&#xff08;download示例server…

解决idea 中web项目无法正常显示的问题

转载于:https://www.cnblogs.com/nulijiushimeili/p/10575364.html

分享一个前后端分离的web项目(vue+spring boot)

Github地址&#xff1a;https://github.com/smallsnail-wh 前端项目名为wh-web后端项目名为wh-server项目展示地址为我的github pages&#xff08;https://smallsnail-wh.github.io&#xff09;用户名&#xff1a;admin&#xff0c;密码admin&#xff08;第一次启动会比较慢&am…

部署php项目到linux

服务器&#xff1a;39.106.26.67rootBayou2009 数据库&#xff1a;rootbayou2009 项目文件夹路径&#xff1a;/home/www/项目文件夹名称&#xff1a;education.bayou-tech.cn 绑定域名&#xff1a;education.bayou-tech.cn 绑定域名&#xff1a; 用ftp把配置文件下班到windows修…

ZooKeeper安装配置

配置 1、在conf目录下创建一个配置文件zoo.cfg tickTime2000 dataDir.../zookeeper/data dataLogDir.../zookeeper/dataLog clientPort2181 initLimit5 syncLimit2 server.1server1:2888:3888 server.2server2:2888:3888 server.3server3:2888:3888 •tickTime&#…

ionic2开发的仿外卖点餐系统(Ionic2+Angular2

github上的项目源码 Run this Project&#xff08;运行该项目&#xff09; first&#xff08;首先&#xff09;: make sure your computer install ionic 确保你的电脑安装了ionic2,不懂自行百度 second&#xff08;其次&#xff09;:$ ionic start wechat_restaurant tutorial…

node搭建服务器,写接口,调接口,跨域

刚开始学node&#xff0c;今天做这个也是累死宝宝了&#xff0c;以后可以自己写接口自己用了&#xff0c;再也不用麻烦人家后台人员了&#xff0c;这些年我们欠他们的太多了&#xff0c;说多了都是泪&#xff0c;不多说&#xff0c;往下看吧。。。 服务端项目目录下&#xff1a…

ThreadPoolExcutor 线程池 异常处理 (上篇)

前言 最近看到crossoverJie的一篇文章&#xff1a;一个线程罢工的诡异事件 首先感谢原作者的分享&#xff0c;自己获益匪浅。然后是回想到自己的一次面试经历&#xff0c;面试官提问了线程池中的线程出现了异常该怎样捕获&#xff1f;会导致什么样的问题&#xff1f; 示例代码 …