(数据结构)串及各种算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
21:53
15/25
二种字符串处理方法
① 字符数组(C/C++ 支持)
编译系统提供大量的库函数处理字符串 注意:字符串最后用 '\0' 表示串结束 ② string 类(C++ 支持)—— 功能更强大,使用更方便 —— C++ 提供 string 类,使用时创建 string 对象 —— 用它的成员函数或关系运算符完成有关处理
T : t0 ... ti ... ti j ... ti m1 ... tn1
P:
p0 ... p j ... pm1
t n m ... t n 1
m个 开始位置:p0 与 t0 对齐 结束位置:pm-1 与 tn-1对齐,p0 与 tn-m 对齐 移动循环:每次移动一个字符 比较循环:每次移动后,逐个比较对应字符 比较次数:与 n 和 m 都有关,最坏 O(m*n)
GBK(汉字内码扩展规范)
21003 个汉字,883 个字符,主要扩展对繁体的支持 1995年,并非国家正式标准,技术规范指导性文件
21:53
6/25
Big5 (大五码)—— 繁体中文编码
1984 年,台湾五大厂商制定的一种繁体中文编码 使用:台湾、香港、澳门、海外华人 收录:繁体汉字13053 个,808 个符号。16 位编码
21:53
美国信息交换标准编码,8 位编码(单字节编码) 包括英文大小写字母,0~9,一些常用符号 标准:ASCII , 7 位,128 个字符。ISO 646 扩展:EASCII , 8 位,256 个字符。ISO 2022
21:53
5/25
汉字国标码
ASCII 不适用于汉字( HZ)字符(数量多) 中国国家标准总局发布的一系列汉字字符集国家标准
编码,统称为 GB 码或国标码
GB 2312-1980(首个汉字编码标准)
1980 年发布, 6763 个常用汉字和 682 个字符 多字节编码:16 位,最多表示 216 = 65536 个汉字 划分为2 级:一级常用汉字3755个,二级汉字3008 个 未收录:繁体中文汉字和一些生僻字
21:53
18/25
Βιβλιοθήκη Baidu
蛮力/朴素算法
int BruteForceStringMatch( T[0…n-1], P[0…m-1] ) { for( i = 0; i <= n-m; i ++) // 移动,最多 n-m+1 次 { for( j = 0; j < m; j++) // 比较,最多 m 次 if ( P[j] != T[i+j] ) break ; if ( j == m ) return (i) ; } return (-1) // 没找到 ,最坏 (n-m+1)*m 次,O(n*m) }
21:53
9/25
ADT String { 数据对象:D = { ai | ai∈CharacterSet, i = 1,2,…,n, n>0 } 数据关系:R = { <ai-1, ai> | ai-1 , ai∈D, i = 2 , …, n } 数据操作: 串赋值: StringAssign(S, T) 串比较: StringCompare(S, T) 求串长: StringLength(S) 串联接: StringConcat(S, T) 求子串: SubString(S, start, length) 子串定位:Index(S, T) 插入子串:StringInsert(S, start, T) 删除子串:StringDelete(S, start, length) ……………… } ADT String
21:53
19/25
回溯—— 朴素法较慢的原因,不必要
T: a b a c a a b a c c a b a c a b a a P: a b a c a b 第一趟比较(左→右,逐个比较) p5 ≠ t5 , P 右移一位 T: a b a c a a b a c c a b a c a b a a 【问】有多余比较? P: a b a c a b 第二趟比较 p0 ≠ p1 → p0 ≠ t1 p0 ≠ t1 , P 右移一位 【答】 T: a b a c a a b a c c a b a c a b a a 第二趟必不匹配 P: a b a c a b 第三趟比较 —— 冗余 p1 ≠ t3 , P 右移一位 T: a b a c a a b a c c a b a c a b a a 【问题】 P右移几位合适? P: abacab …….
字符都相等)
21:53
3/25
字符(char)
字符:组成字符串的基本单位 取值:取决于字符集 Σ
字符集(charset)
二进制:Σ = { 0, 1 } 数字: Σ = { 0~9 } 英语:Σ = { (a~z, A~Z) , 标点符号 } 中文:GB2312 …………
21:53
4/25
21:53
10/25
顺序串
用一组地址连续的存储单元依次存储串的字符序列 实现:字符数组 分配内存:静态分配、动态分配
静态分配
const int MAXSIZE = 1024 ; ∥最大长度 typedef struct { char ch[MAXSIZE] ; ∥存放串的数组 int length ; ∥串的长度 } STring ;
GB18030(信息交换用汉字编码字符集基本集的扩充)
覆盖中文、日文、朝鲜语和中国少数民族文字。满足
中国大陆、香港、台湾、日本和韩国等东亚地区信息 交换统一编码的要求。 单字节、双字节、四字节三种编码混合 GB18030-2000:2001.01 正式强制执行,取代GBK . 收录:27533 个汉字(包括部首、部件等) GB18030-2005:增加了42711个汉字和多种少数民族的 文字编码,增加的为非强制性。
关系运算符: < , > , <= , >= , == , != —— 通过运算符重载对运算符赋予新的功能 串长度不固定,由系统动态管理 不同的编译系统,还提供额外的字符串类
复习 C++ 有关章节
21:53
16/25
子串定位(查找/ 检索)
C++ 库函数提供的子串查找函数: 原型:char * strstr(const char T[ ], const char P[ ]) 功能:在主串 T 中查找子串 P (模式, Pattern) . 成功:返回 P 在 T 中第一次出现的位置(指针) 失败:返回 NULL
21:53
8/25
比较字符串的大小
两个字符串:X = 'x1x2…xm' , Y = 'y1y2…yn' 比较串大小:逐个比较串中对应字符的编码 ①X=Y m = n 且 xi = yi , i = 1, 2, …, m 串值相等:串长相等且对应字符都相等 ②X<Y 1 ) 设 m < n , k ≤ MIN(m, n) 2 ) k ≤ MIN(m, n) , xi = yi , i = 1, 2, …, k–1 , xk < yk ③X>Y 与②不同之处: xk > yk
1/25
21:53
2/25
串(String)定义
字符串(简称串):元素为字符的线性表 记为: S ' s s s ' , n 0
1 2 n
术语
串长度:串中字符的个数 n 空串(Null String):0 个字符的串, n = 0 空白串(Blank String):空格组成的串 串值:s1 s2 sn 子串:串中任意个连续的字符组成的子序列 主串:包含子串的串 串相等:两个串的值相等(长度相等,且对应位置的
用法
char T[ ] = "I love China & you !" char P[ ] = "in" ; char *pt = strstr(T, P) ; cout << pt ;
21:53
17/25
蛮力法(Brute Force), 或称朴素法
实现子串定位或匹配(Pattern Matching) 算法思想(穷举法)
21:53
7/25
Unicode(Universal Multiple-Octet Coded Character Set )
1994 年正式公布,不断升级完善 多种编码的问题
同一个二进制数代表不同的符号。如:打开一个文本 文件,要知道编码方式,安装编码表,否则乱码 目标:整合全世界语言文字,为每种语言的每个字符 编制统一且唯一的二进制码 容量:100 多万个字符 三种编码:UTF-8, UTF-16, UTF-32 ,通常指UTF-16. UTF-8:双字节Unicode 字符能在单字节系统正确处理 多字节编码:英文8 位,中文24 位。 C++ 等提供了专门处理Unicode 字符集的函数
21:53
13/25
压缩(紧凑)存储格式
单链表的每个结点存放多个字符,块链形式 连续存储与链式相结合的混合结构
结点数据用字符数组存放,结点关系是链式结构
'He is a student.'
He i s a s t u d e n t . \0 # ٨
'He is a bright student.'
优点:提高了空间效率 缺点:操作变复杂,有可能降低时间效率
21:53
14/25
const int CHUNKSIZE = 80 ; // 自定义块大小 typedef struct chunk // 结点结构 { char ch[CHUNKSIZE] ; // 结点的数组 chunk *next ; // 结点的链式关系 } Chunk ; typedef struct { Chunk *head , *tail ; int length ; // 串长度 } LString ;
21:53
20/25
改进策略
蛮力法的低效在于回溯
每趟失配时,主串 T 右移一位与模式 P 的 p0 比较 没有考虑模式本身的信息 改进策略(无回溯) 匹配过程中一旦发现 pj ≠ ti 不等,确定 P 右移几位 继续比较过程(从P的哪个字符 pk 开始与 ti 比较) T: a b a c a a b a c c a b a c a b a a P: a b a c a b p5 ≠ t5 , k = ? 确定滑动距离 k 的两点要求 ① 滑动距离应尽可能远(减少比较次数) ② 保证匹配过程无遗漏(不能漏掉可能的匹配)
21:53
11/25
动态分配
typedef struct { char * str ; int length ; } STRING ; //------------------------------------// STRING myString = new STRING[n] ; STRING myString ; myString.str = new char[n] ; myString.str[0] = '\0' ;
字符编码(机内码、内码)
在计算机内部,用一个数值唯一表示一个字符 字符的大小:比较其编码的大小 有多种编码:不同国家或地区的文字 字符集(编码)不匹配,造成“乱码” 开发国际化软件,需考虑不同的字符集
ASCII, American Standard Code for Information Interchange
21:53
12/25
链串 —— 链式存储结构
用单链表存储的串,有两种存储方式
非压缩(非紧凑)存储格式
单链表每个结点只存放一个字符
…… 'x' 'b' 'c' '\0' 为方便操作,设置头尾两个指针 缺点:内存空间利用率较低 typedef struct typedef struct StrNode { char str ; //存放字符 { strNODE *head, *tail ; int length ; StrNode *next ; } LString ; } strNODE ;