数据结构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…

JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。

JDK1.6版添加了新的ScriptEngine类&#xff0c;允许用户直接执行js代码。在Java中直接调用js代码 不能调用浏览器中定义的js函数&#xff0c;会抛出异常提示ReferenceError: “alert” is not defined。[java] view plaincopypackage com.sinaapp.manjushri; import javax.sc…

数据结构05数组和广义表

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

k8s的ingress使用

ingress 可以配置一个入口来提供k8s上service从外部来访问的url、负载平衡流量、终止SSL和提供基于名称的虚拟主机。 配置ingress的yaml&#xff1a; 要求域名解析无误 要求service对应的pod正常 一、test1.domain.com --> service1:8080 apiVersion: extensions/v1beta1…

JDK1.8中如何用ScriptEngine动态执行JS

JDK1.8中如何用ScriptEngine动态执行JS jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持。这无疑是一个很好的功能&#xff0c;毕竟Java的语法不是适合成为动态语言。而JDK通过执行JavaScript脚本可以弥补这一不足。这也符合“Java虚拟机不仅仅是Java一种语言的虚拟机…

数据结构06树和二叉树

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

2019.03.20 mvt,Django分页

MVT模式 MVT各部分的功能: M全拼为Model&#xff0c;与MVC中的M功能相同&#xff0c;负责和数据库交互&#xff0c;进行数据处理。 V全拼为View&#xff0c;与MVC中的C功能相同&#xff0c;接收请求&#xff0c;进行业务处理&#xff0c;返回响应。 T全拼为Tem…

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的纯净…

[Objective-C语言教程]结构体(17)

Objective-C数组可定义包含多个相同类型的数据项的变量类型&#xff0c;但结构体是Objective-C编程中的另一个用户定义数据类型&#xff0c;它可组合不同类型的数据项。 结构体用于表示记录&#xff0c;假设要图书馆中跟踪书籍信息。可能希望跟踪每本书的以下属性 - 标题作者学…

Scala01入门

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

架构师之路17年精选80篇

【架构必备】 《互联网架构如何实现“高并发”》4W 《TCP接入层的负载均衡、高可用、扩展性架构设计》2.2W 《配置中心架构设计演进》1.7W 《跨公网调用的大坑与架构优化》1.4W 《DNS在架构设计中的巧用》1.9W 《消息如何在网络上安全传输》1.2W 《10W定时任务&#xff0c;如何…

iphone手机型号获取

#import <sys/utsname.h> //手机型号 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

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 数模、…

apache的产品分类说明

分类 项目名 说明 开发语言 服务器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服务器C/CTomcatJava的Web服务器JavaJames邮件服务器JavaSpamAssassin反垃圾邮件C/CPerlApache的Perl编程语言支持C/CTclTCL脚本语言C/CDirectory Server超级目录服务器JavaAxisW…

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开发过程中&#xff0c;很多场景下都会碰到或要用到单例模式&#xff0c;在设计模式里也是经常作为指导学习的热门模式之一&#xff0c;相信每位开发童鞋都用到过。我们总是沿着前辈的足迹去做设定好的思路&#xff0c;往往没去探究为何这么做&#xff0c;所以这篇文章对…