数据结构串

串的逻辑结构和线性表相似,区别仅为串的数据对象约束为字符集
串的基本操作和线性表有很大差别,线性表的基本操作中大多以的“单个元素”作为操作对象;而串的基本操作中通常以“串的整体”作为
操作对象

串的表示:
1、定长顺序存储表示:
  超过预定义长度的串值则被舍弃,称为“截断”
  对串长的表示方法:在下标为0的数组分量存放串的实际长度;在串值后面加一个结束标记字符“\0”
2、堆分配存储表示:
  仍以一组地址连续的存储单元存放,但存储空间是在程序执行过程中动态分配的
  C中动态分配函数:malloc(),free()
3、串的块链存储表示:
  存在结点大小问题:每个结点可以存放1个字符,也可存放多个,则最后一个结点不一定被占满,通常补上“#”或其他非串值字符
  为便于进行串的操作,除头指针外还可附设一个尾指针,并给出当前串的长度
  一般情况下,只需要从头向尾顺序扫描,则对串值不必建立双向链表。设尾指针为了方便联结操作,联结时需处理第一个串尾的无
  效字符
  存储密度=串值所占存储位/实际分配存储位

串的模式匹配算法:详看严蔚敏视频12
S主串:a c a b a a b a a b c a c a a b c
T模式:a b a a b c a c
原始算法是一旦s[i]!=t[j],i(即主串)需要回退,但,存在某些浪费,比如上例,s[1]==t[1],s[2]!=t[2],所以i退回至1-1+2=2(i=i-j+1),s[2]!=t[1],很明显;另举一例,s[3]==t[1],s[4]==t[2],s[5]==t[3],s[6]==t[4],s[7]==t[5],s[8]!=t[6],于是i要回退很多,但这是没必要的,很明显s[4]!=t[1],所以设想,不进行这种无谓的回缩,i不动,j动行不行
这涉及j需要动多少的问题,则设置一个函数next,s[i]!=t[j]时,j=next[j],i不需要动
这个next函数就是对j进行考虑回缩的函数,j需要回缩到哪,考虑的是最大相同子串的问题
S主串:s1 s2 s3 ……si-j+1 …… si
T模式: t1 …… tj
Tnext: t1…tk
致使t1……tk这个子串和T模式中tj-k+1……tj相同,才会和S主串中si-k+1……si的串字符相同
next函数:

next[1]=0;i=1;j=0;
for(i<T[0])    //T[0]为T串的长度
{
  if(j==0 || t[i]==t[j])
  {
    i++;
    j++;
    t[i]=j;
  }
  else
  j=next[j];
}

KMP算法增进版:
next算法:

next[1]=0;
i=1;j=0;
for(i<t[0])
{
  if(j==0 || t[i]==t[j])
  {
  i++;
  j++;
  if(t[i]!=t[j])
    next[i]=j;
  else
    next[i]=next[j];
  }
  else
  j=next[j];
}
时间: 2024-08-05 02:16:46

数据结构串的相关文章

javascript实现数据结构: 串的块链存储表示

和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个"结点大小"的问题,即每个结点可以存放一个字符,也可以存放多个字符. 下面是结点大小为4(即每个结点存放4个字符)的链表: head --> (a) --> (b) --> (c) --> ... --> (i) 当结点大小大于1时,由于串长不一定是结点大小的整倍数,则链表中的最后一个结点不一定全被串值占满,此时通常补上

数据结构—串的堆分配

#include<stdio.h> #include<stdlib.h> typedef struct { char *ch; int length; }HString; void StrAssign(HString &T,char *chars); void StrLength(HString S); void StrCompare(HString S,HString T); void ClearString(HString &S); void Concat(HS

数据结构——串的相关算法实现

数据结构--串的相关算法实现 顺序串的插入函数实现 在进行顺序串的插入时,插入pos将串分为两个部分(假设为A.B,长度为LA.LB)及待插入部分(假设为C,长度为LC),则串由插入前的AB变为ACB,由于是顺序串,插入会引起元素的移动.可能会出现以下的三种情况: ①插入后串长度(LA+LC+LB)<=MAXLEN,则将B后移LC个元素位置,再将C插入: ②插入后串长度 >=MAXLEN 且 pos+LC <=MAXLEN,则 B 后移时会有部分字符被舍弃; ③插入后串长度>MAX

数据结构-串操作应用之词索引表

为书库创建查询索引表 建立词索引表基本步骤: 1.从书目文件中读入一个书目单. 2.从书目单中提取所有关键字插入词表. 3.对词表中的每一个关键字在索引表中进行查找并作相应的插入操作. 详细操作: 1.为识别从书名串中分离出来的单词是否是关键字,需要一张常用词表.顺序扫描书目单,首先分离单词,然后查找常用词表,若不和表中任一词相等,则为关键字,插入临时存放关键字的词表中. 2.在索引表中查询关键字时可能出现两种情况:其中一种是索引表上已经有此关键词的索引项,只要在该项中插入书号索引即可:其二是需

数据结构-串

串,字符串是由零个或多个字符组成的有限序列.字符的数目称为串的长度.长度为零的串称为空串.串中任意个连续的字符组成的子序列称为该串的子串.包含子串的串称为主串.字符在串中的序号称为该字符在串中的位置. 串相等,只有长度相同,对应位置字符相同的串是相等串. 对于串的操作很多,在这里仅列出以下几种: 1.串比较 equals() 判断串是否相等. compareTo() 比较串的大小. compareToIgnoreCase(String int) 忽略字母大小写比较. == 判断串与地址是否相同.

数据结构 - 串的性质和基本操作(一)

串的概念 什么是串呢? 串(String):由零个或多个字符组成的有限序列.记为:s='a1a2-an'(n≥0) s为串名, 'a1a2-an'为串值,n为串的长度. 子串在主串中的位置:以子串的第一个字符在主串中的位置来表示 串相等:当且仅当两个串的串值相等(两个串的长度相等,并且各个对应的字符也都相等 串的数据类型 ADT String { D={ ai |ai∈CharacterSet, i=1,2,...,n, n≥0 } R={ < ai-1, ai > | ai-1, ai ∈D

数据结构- 串的模式匹配算法:BF和 KMP算法

Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较. 2) 依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功. Brute-Force算法的实现 c语言实现: [cpp] vie

转载 数据结构 串的模式匹配

转载自http://www.cnblogs.com/dolphin0520/ 十分感谢作者大大 KMP算法 KMP算法 在介绍KMP算法之前,先介绍一下BF算法. 一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果. 举例说明: S:  ababcababa P:  ababa  BF算法匹配的步骤

数据结构-串的堆分配存储

串的堆分配存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的.使用动态分配函数malloc()和函数free()来管理存储空间的大小. 串的堆分配存储方法具有顺序存储的特点,又弥补了定长存储的大小限制,多以多被采用. 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 typedef int Status; 6 #define O