数据结构-Python语言描述课件第4章
合集下载
Python基础及应用ppt课件第4章
译 我们可以通过一个 for 循环或者 while 循环直接顺序访问元组 的内容。 显然for循环不仅可读性高而且更加简单,在大多数情 况下应该优先采用for循环。
译 另外值得一提的是,之所以Tuple可以这样用for遍历是因为 Tuple包括后面马上要提到的List和Dict对象本身是一个可迭代 的对象,这个概念之后会细讲,这里只要学会for循环的用法就
还有 extend 和 insert可以用于添加元素,比如:
溅 这段代码会输出:
22
添加
溅 extend接收一个参数,内容为要合并进这个list的一个可迭代对 象,所以这里可以传入一个List或者Tuple。
溅 insert接收两个参数,分别是下标和被插入的对象,可以在指 定下标位置插入指定对象。
35
推导式
观 列表推导式是一种可以快速生成 List 的方法。 观 比如生成一个含有 0-100 中所有偶数的列表:
观 怎么理解这个语法呢?这里的语法很像经典集合论中对集合的 定义,其中最开始的 i 是代表元素,而后面的for i in range(101) 说明了这个元素的取值范围,最后的一个 if 是限 制条件。
25
删除: pop 方法
溅 pop方法没有参数,默认删除最后一个元素,比如:
溅 这段代码会输出:
26
删除: remove 方法
溅 remove方法接收一个参数, 为被删除的对象,比如:
溅 这段代码会输出: 溅 同时我们也可以看出remove是从前往后查找,删除遇到第一个
相等的元素。
27
修改
溅 List可以在原位进行修改,直接用下标访问就可以,比如:
行了。
查找
阶 在 Tuple 中查找元素可以用 in,比如:
译 另外值得一提的是,之所以Tuple可以这样用for遍历是因为 Tuple包括后面马上要提到的List和Dict对象本身是一个可迭代 的对象,这个概念之后会细讲,这里只要学会for循环的用法就
还有 extend 和 insert可以用于添加元素,比如:
溅 这段代码会输出:
22
添加
溅 extend接收一个参数,内容为要合并进这个list的一个可迭代对 象,所以这里可以传入一个List或者Tuple。
溅 insert接收两个参数,分别是下标和被插入的对象,可以在指 定下标位置插入指定对象。
35
推导式
观 列表推导式是一种可以快速生成 List 的方法。 观 比如生成一个含有 0-100 中所有偶数的列表:
观 怎么理解这个语法呢?这里的语法很像经典集合论中对集合的 定义,其中最开始的 i 是代表元素,而后面的for i in range(101) 说明了这个元素的取值范围,最后的一个 if 是限 制条件。
25
删除: pop 方法
溅 pop方法没有参数,默认删除最后一个元素,比如:
溅 这段代码会输出:
26
删除: remove 方法
溅 remove方法接收一个参数, 为被删除的对象,比如:
溅 这段代码会输出: 溅 同时我们也可以看出remove是从前往后查找,删除遇到第一个
相等的元素。
27
修改
溅 List可以在原位进行修改,直接用下标访问就可以,比如:
行了。
查找
阶 在 Tuple 中查找元素可以用 in,比如:
数据结构与算法Python语言描述【共37张PPT】
}
// 加工型——map操作! void TraverseList(List &L,
void (*visit)(&ElemType)){ for (i = 0; i < L.length; i++)
(*visit)(L.elem[i]); }
// 注意引用参数的使用!!!
Status GetElem(List L, int i, ElemType &e) {
线性表的顺序表示和实现
GetElem( L, i, &e ) //取线性表中第i个数据元素
初始条件:线性表L已存在。
操作结果:依次对L的每个元素调用函数visit()。
• 直接前驱、直接后继 操作结果:用e返回L中第i个元素的值。
操作结果:若cur_e是L的元素,但不是最后一个,则用next_e
for(i = 1; i <= Lb_len; i++){
• 线性表的顺序表示和实现
• 线性表的链式表示和实现
线性表的顺序表示
• 是指用一组地址连续的存储单元依次存放线性表 的数据元素
以元素在计算机内“物理位置相邻”来表示线性表中数 据元素之间的逻辑相邻
线性表的顺序表示和实现
• 是指用一组地址连续的存储单元依次存放线性表 的数据元素
设每个数据元素需占用C个存储单元 – LOC(ai) = LOC(ai-1) + C – LOC(ai) = LOC(a1) + (i-1)×C
i = 1; p = L.elem;
//在有效范围内查询 while(i <= L.length && !(*compare)(*p++, e))
// 加工型——map操作! void TraverseList(List &L,
void (*visit)(&ElemType)){ for (i = 0; i < L.length; i++)
(*visit)(L.elem[i]); }
// 注意引用参数的使用!!!
Status GetElem(List L, int i, ElemType &e) {
线性表的顺序表示和实现
GetElem( L, i, &e ) //取线性表中第i个数据元素
初始条件:线性表L已存在。
操作结果:依次对L的每个元素调用函数visit()。
• 直接前驱、直接后继 操作结果:用e返回L中第i个元素的值。
操作结果:若cur_e是L的元素,但不是最后一个,则用next_e
for(i = 1; i <= Lb_len; i++){
• 线性表的顺序表示和实现
• 线性表的链式表示和实现
线性表的顺序表示
• 是指用一组地址连续的存储单元依次存放线性表 的数据元素
以元素在计算机内“物理位置相邻”来表示线性表中数 据元素之间的逻辑相邻
线性表的顺序表示和实现
• 是指用一组地址连续的存储单元依次存放线性表 的数据元素
设每个数据元素需占用C个存储单元 – LOC(ai) = LOC(ai-1) + C – LOC(ai) = LOC(a1) + (i-1)×C
i = 1; p = L.elem;
//在有效范围内查询 while(i <= L.length && !(*compare)(*p++, e))
数据结构四PPT课件
pos len
堆分配存储特点:仍用一组连续的存储单元来存放串,
但存储空间是在程序执行过程中动态分配而得。
思路:利用malloc函数合理预设串长空间。
有的语言允许对串常量命名,以使程序易读、易写。 【例】C++中,可定义串常量path
const char path[]="dir/bin/appl";
5
练1:串是由
字符组成的序
列,一般0记个或多个
为 S=’a1a2……an’
练2:现。有以下4个字符串:
a =‘BEI’
b =‘JING’ c = ‘BEIJING’
数据结构课程的内容
第4章 串 (String)
1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
4.1 串类型的定义
4.2 串的表示和实现 4.3 串的模式匹配算法
4.1 串类型的定义
串即字符串,是由零个或多个字符组成的有限序列,是数据 元素为单个字符的特殊线性表。
记为: s =‘ a1 , a2 , …….. , an’ (n≥0 )
讨论:想存放超长字符串怎么办?——静态数组有缺陷!
改用动态分配的一维数组—— “堆”!
例:用顺序存储方式实现求子串函数SubString(&Sub, S, pos,
len)
将串S中从第pos个字符开始长度为len的字符序列复 制到串Sub中(注:串Sub的预留长度与Ssub, SString S, int pos, int len )
d
= ‘问B:EI①JI他NG们’各自的长度? a =3,b =4,c = 7,d=8
② a是哪个串的子串?在主串中的位置是多少?
数据结构(Python版)PPT
一个数据元素可由若干个数据项组成。 数据项是数据的不可分割的最小单位。 数据对象(Data Object):是性质相同的数据 元素的集合。是数据的一个子集。 数据结构(Data Structure):是相互之间存在 一种或多种特定关系的数据元素的集合。
数据在计算机中的表示称为数据的物理 结构,又称为存储结构。
所有能被输入到计算机中,且能被计算机处理的符号的集合。
是计算机操作的对象的总称。 是计算机处理的信息的某种特定的符号表示形式。
数据元素:
是数据(集合)中的一个“个体”
是数据结构中讨论的基本单位
数据结构主要指逻辑结构和物理结构 数据之间的相互关系称为逻辑结构。通常分
为四类基本结构: 一、集合 结构中的数据元素除了同属于一种 类型外,别无其它关系。 二、线性结构 结构中的数据元素之间存在一 对一的关系。 三、树型结构 结构中的数据元素之间存在 一对多的关系。 四、图状结构或网状结构 结构中的数据元素 之间存在多对多的关系。
位置上进行。栈顶指针就是链表的头指针。 top
∧
3.3 队列 3.3.1 队列的定义
队列(Queue)也是一种运算受限的线性表。它只允许在表的
一端进行插入,而在另一端进行删除。允许删除的一端称为 队头(front),允许插入的一端称为队尾(rear)。
(1)有穷性 一个算法必须总是在执行有穷步之后结束,且每 一步都在有穷时间内完成。 (2)确定性 算法中每一条指令必须有确切的含义。不存在二义 性。 (3)可行性 一个算法是可行的。即算法描述的操作都是可以通 过已经实现的基本运算执行有限次来实现的。 (4)输入 一个算法有零个或多个输入,这些输入取自于某个特 定的对象集合。 (5)输出 一个算法有一个或多个输出,这些输出是同输入有着 某些特定关系的量。
Python基础编程与实践教学课件第4章 典型数据结构
(4)对于集合可以判断集合关系,也可以进行各种集合运算,这些 都是集合所特有的。
根据需要,也可以在集合和列表之间进行相互转换。如果将一个集 合作为参数传入list()函数,则可以返回一个列表对象。
4.4 字典
4.4.1 创建字典
字典就是用花括号括起来的一组“关键字:值”对,每个“关键字: 值”对就是字典中的一个元素或条目。
1. 创建可变集合
创建可变集合的最简单方法是使用逗号分隔一组数据并放在一对花 括号中。
2. 创建不可变集合
不可变集合可以通过调用frozenset()函数来创建,调用格式如下:
frozenset([iterable])
4.3.2 集合的基本操作
1. 传统的集合运算 (1)计算求交集:使用运算符“&”。 (2)计算并集:使用运算符“|”。 (3)计算差集:使用运算符“-”。 (4)计算对称差集:使用运算符“^”。 2. 集合的比较 (1)判断相等:使用运算符“==”。 (2)判断不相等。使用运算符“!=”。 (3)判断真子集:使用运算符“<”。 (4)判断子集:使用运算符“<=”。 (5)判断真超集:使用运算符“>”。 (6)判断超集:使用运算符“>=”。 3. 集合的并入 对于可变集合,可以使用运算符“|=”将一个集合并入另一个集合中。 4. 集合的遍历 使用for循环可以遍历集合中的所有元素。
4.3.3 集合的常用方法(2)
2. 仅适用于可变集合的方法 (1)set1.add(x):在集合set1中添加元素x。 (2)set1.update(set2, set3, ..., setn):该方法使用集合set2, set3, ..., setn拆分成单个数据项并添加到集合set1中。 ( 3 ) set1.intersection_update(set2, set3, ..., setn) : 求 出 集合set1, set2, set3, ..., setn集合的交集并将结果赋值给set1。 (4)set1.difference_update(set2, set3, ..., setn):求出属 于集合set1但不属于集合set2, set3, ..., setn的元素并将赋值给 set1。 (5)set1.symmetric_difference_update(set2):求出集合set1和 set2的对称差集并将结果赋值给set1。 (6)set1.remove(x):从集合set1中删除元素x。 (7)set1.discard(x):从集合set1中删除元素x。 (8)set1.pop():该方法从集合set1中弹出一个元素。 (9)set1.clear():删除集合set1中的所有元素。
根据需要,也可以在集合和列表之间进行相互转换。如果将一个集 合作为参数传入list()函数,则可以返回一个列表对象。
4.4 字典
4.4.1 创建字典
字典就是用花括号括起来的一组“关键字:值”对,每个“关键字: 值”对就是字典中的一个元素或条目。
1. 创建可变集合
创建可变集合的最简单方法是使用逗号分隔一组数据并放在一对花 括号中。
2. 创建不可变集合
不可变集合可以通过调用frozenset()函数来创建,调用格式如下:
frozenset([iterable])
4.3.2 集合的基本操作
1. 传统的集合运算 (1)计算求交集:使用运算符“&”。 (2)计算并集:使用运算符“|”。 (3)计算差集:使用运算符“-”。 (4)计算对称差集:使用运算符“^”。 2. 集合的比较 (1)判断相等:使用运算符“==”。 (2)判断不相等。使用运算符“!=”。 (3)判断真子集:使用运算符“<”。 (4)判断子集:使用运算符“<=”。 (5)判断真超集:使用运算符“>”。 (6)判断超集:使用运算符“>=”。 3. 集合的并入 对于可变集合,可以使用运算符“|=”将一个集合并入另一个集合中。 4. 集合的遍历 使用for循环可以遍历集合中的所有元素。
4.3.3 集合的常用方法(2)
2. 仅适用于可变集合的方法 (1)set1.add(x):在集合set1中添加元素x。 (2)set1.update(set2, set3, ..., setn):该方法使用集合set2, set3, ..., setn拆分成单个数据项并添加到集合set1中。 ( 3 ) set1.intersection_update(set2, set3, ..., setn) : 求 出 集合set1, set2, set3, ..., setn集合的交集并将结果赋值给set1。 (4)set1.difference_update(set2, set3, ..., setn):求出属 于集合set1但不属于集合set2, set3, ..., setn的元素并将赋值给 set1。 (5)set1.symmetric_difference_update(set2):求出集合set1和 set2的对称差集并将结果赋值给set1。 (6)set1.remove(x):从集合set1中删除元素x。 (7)set1.discard(x):从集合set1中删除元素x。 (8)set1.pop():该方法从集合set1中弹出一个元素。 (9)set1.clear():删除集合set1中的所有元素。
Python第四章ppt
第四章 Python控制流
• 课程概要
➢ Python的三种控制流 ➢ 认识分支结构if ➢ 认识循环结构while ➢ 认识循环结构for ➢ Break语句 ➢ Continue语句
一、Python的三种控制流
1、什么是控制流?
Python中程序代码的执行是有顺序的,有的程 序代码会从上到下按顺序执行,有的程序代码 会跳转着执行,有的程序代码会选择不同的分 支去执行,有的程序代码会循环地执行。那么 到底什么样的程序应该自上而下执行,什么样 的程序应该选择分支执行,什么样的程序应该 循环着执行呢?在Python中是有相应的控制语 句进行标识的,控制语句它能控制某些代码段 的执行方式,我们把这些不同功能的控制语句 称为控制流。
2、Break语句的使用 Python中Break语句的使用是有规律的。
六、Continue语句
1、什么是Continue语句 Continue语句的功能是强制停止循环中的 这一次执行,直接跳到下一次执行。
2、Continue语句的使用方法 3、Break语句与Continue语句的区别
四、认识循环结构---for语句
1、什么是for语句 Python中for语句是另外一种循环语句。
2、for语句的使用 Python中for语句的使用是有规律的。
五、Bre执行 的。Break语句常用于循环结构中,在循 环结构中出现Break语句的时候,能将该 循环强制停止,然后退出该循环。
2、while语句的使用 Python中while语句的使用是有规律的。
四、认识循环结构---for语句
1、什么是for语句 Python中for语句是另外一种循环语句。
2、for语句的使用 Python中for语句的使用是有规律的。
• 课程概要
➢ Python的三种控制流 ➢ 认识分支结构if ➢ 认识循环结构while ➢ 认识循环结构for ➢ Break语句 ➢ Continue语句
一、Python的三种控制流
1、什么是控制流?
Python中程序代码的执行是有顺序的,有的程 序代码会从上到下按顺序执行,有的程序代码 会跳转着执行,有的程序代码会选择不同的分 支去执行,有的程序代码会循环地执行。那么 到底什么样的程序应该自上而下执行,什么样 的程序应该选择分支执行,什么样的程序应该 循环着执行呢?在Python中是有相应的控制语 句进行标识的,控制语句它能控制某些代码段 的执行方式,我们把这些不同功能的控制语句 称为控制流。
2、Break语句的使用 Python中Break语句的使用是有规律的。
六、Continue语句
1、什么是Continue语句 Continue语句的功能是强制停止循环中的 这一次执行,直接跳到下一次执行。
2、Continue语句的使用方法 3、Break语句与Continue语句的区别
四、认识循环结构---for语句
1、什么是for语句 Python中for语句是另外一种循环语句。
2、for语句的使用 Python中for语句的使用是有规律的。
五、Bre执行 的。Break语句常用于循环结构中,在循 环结构中出现Break语句的时候,能将该 循环强制停止,然后退出该循环。
2、while语句的使用 Python中while语句的使用是有规律的。
四、认识循环结构---for语句
1、什么是for语句 Python中for语句是另外一种循环语句。
2、for语句的使用 Python中for语句的使用是有规律的。
数据结构--第四章--课件
串的实际长度可在这个预定义长 度的范围内随意设定,超过予定义 长度的串值则被舍去,称之为“截 断按”这种串的表示方法实现的串的 运算时,其基本操作为 “字符序列 的复制”
例如:串的联接算法中需分三种情况处理:
Status Concat(SString S1, SString S2, SString &T) {
Replace (&S, T, V)
初始条件:串S, T和 V 均已存在, 且 T 是非空串。
操作结果:用 V 替换主串 S 中出 现的所有与(模式串)T 相等的不重叠的子串。
例如: 假设 S = abcaabbcaaabbca , T = bca 若 V = x , 则经置换后得到
数 据 结 构
4.1 串的抽象数据类型的定义 4.2 串的表示和实现
4.1 串的抽象数据类型的定义
• 串:是由零个或多个字符组成的有限序列。 s=′a1a2···an′
• 空串:零个字符的串。 • 长度:串中字符的数目。 • 子串:串中任意个连续的字符组成的子序列。 • 主串:包含子串的串。 • 位置:通常称字符在序列中的序号为
Index (S, T, pos) Replace (&S, T, V)
StrInsert (&S, pos, T)
StrDelete (&S, pos, len) } ADT String
StrEmpty (S)
初始条件:串S存在。 操作结果:若 S 为空串,则返回 true,
否则返回 false。
int curlen; // 串的当前长度 } LString;
实际应用时,可以根据问题所需来 设置结点的大小。
例如: 在编辑系统中,整个文本编辑区 可以看成是一个串,每一行是一个子串, 构成一个结点。即: 同一行的串用定长结构 (80个字符), 行和行之间用指针相联接。
例如:串的联接算法中需分三种情况处理:
Status Concat(SString S1, SString S2, SString &T) {
Replace (&S, T, V)
初始条件:串S, T和 V 均已存在, 且 T 是非空串。
操作结果:用 V 替换主串 S 中出 现的所有与(模式串)T 相等的不重叠的子串。
例如: 假设 S = abcaabbcaaabbca , T = bca 若 V = x , 则经置换后得到
数 据 结 构
4.1 串的抽象数据类型的定义 4.2 串的表示和实现
4.1 串的抽象数据类型的定义
• 串:是由零个或多个字符组成的有限序列。 s=′a1a2···an′
• 空串:零个字符的串。 • 长度:串中字符的数目。 • 子串:串中任意个连续的字符组成的子序列。 • 主串:包含子串的串。 • 位置:通常称字符在序列中的序号为
Index (S, T, pos) Replace (&S, T, V)
StrInsert (&S, pos, T)
StrDelete (&S, pos, len) } ADT String
StrEmpty (S)
初始条件:串S存在。 操作结果:若 S 为空串,则返回 true,
否则返回 false。
int curlen; // 串的当前长度 } LString;
实际应用时,可以根据问题所需来 设置结点的大小。
例如: 在编辑系统中,整个文本编辑区 可以看成是一个串,每一行是一个子串, 构成一个结点。即: 同一行的串用定长结构 (80个字符), 行和行之间用指针相联接。
Python程序设计课件第4章 Python的四种典型序列结构
print("hit" in c) 运行结果: True
6 计算序列的长度、最大值和最小值
序列
计算序列的长度、最大值和最小值:在Python中,提供了内置函数计算序 列的长度、最大值和最小值。
➢ 使用len()函数计算序列的长度 ➢ 使用max()函数返回序列中的最大元素 ➢ 使用min()函数返回序列中的最小元素 【例】定义一个包括9个元素的列表,并通过len()函数计算列表的长度,最大元素 、最小元素。
1 索引
序列
索引:列中的每一个元素都有一个编号,也称为索引。这个索 引是从0开始递增的,即下标为0表示第一个元素,下标为1表 示第2个元素,依此类推:
元素1
元素2
元素3
0
1
2
Python的索引可以是负数:
元素1 -n
元素2 -(n-1)
元素3 -(n-2)
元素4 3
元素4 -(n-3)
元素… …
元素n n-1
将列表转化为元组。
3元组与列表的区别与相互转换
元组
1.元组与列表的区别 (1)表属于可变序列,它的元素可以随时修改或者删除:元组属于不可
变序列,其中的元素不可以修改,除非整体替换。 (2)列表可以使用append()、extend()、insert()、remove()和pop()
等方法实现添加和修改列表元素:而元组则没有这几个方法,因为不能向 元组中添加和修改元素,同样也不能删除元素。
1元组的创建与删除
元组
4.删除元组:元组中的元素值是不允许删除的,但我们可以使用del语句来删 除整个元组。对于已经创建的元组,不再使用时,可以使用del语句将其删 除。 5.整体修改元组元素:元组是不可变序列,所以不能对它的单个元素值进行 修改。但是元组也不是完全不能修改,可以对元组进行重新赋值。
6 计算序列的长度、最大值和最小值
序列
计算序列的长度、最大值和最小值:在Python中,提供了内置函数计算序 列的长度、最大值和最小值。
➢ 使用len()函数计算序列的长度 ➢ 使用max()函数返回序列中的最大元素 ➢ 使用min()函数返回序列中的最小元素 【例】定义一个包括9个元素的列表,并通过len()函数计算列表的长度,最大元素 、最小元素。
1 索引
序列
索引:列中的每一个元素都有一个编号,也称为索引。这个索 引是从0开始递增的,即下标为0表示第一个元素,下标为1表 示第2个元素,依此类推:
元素1
元素2
元素3
0
1
2
Python的索引可以是负数:
元素1 -n
元素2 -(n-1)
元素3 -(n-2)
元素4 3
元素4 -(n-3)
元素… …
元素n n-1
将列表转化为元组。
3元组与列表的区别与相互转换
元组
1.元组与列表的区别 (1)表属于可变序列,它的元素可以随时修改或者删除:元组属于不可
变序列,其中的元素不可以修改,除非整体替换。 (2)列表可以使用append()、extend()、insert()、remove()和pop()
等方法实现添加和修改列表元素:而元组则没有这几个方法,因为不能向 元组中添加和修改元素,同样也不能删除元素。
1元组的创建与删除
元组
4.删除元组:元组中的元素值是不允许删除的,但我们可以使用del语句来删 除整个元组。对于已经创建的元组,不再使用时,可以使用del语句将其删 除。 5.整体修改元组元素:元组是不可变序列,所以不能对它的单个元素值进行 修改。但是元组也不是完全不能修改,可以对元组进行重新赋值。
数据结构第4章PPT课件
• (12)StrReplace(S,T,pos,len):串替换操作。当1≤pos≤StrLength(S)且0≤len≤StrLength(S)pos+1时,用串T替换串S中从第pos个字符开始的len个字符。
• (13)StrDestroy(S):串销毁操作。销毁串S。
10
第10页/共33页
4.2 串的存储结构
4.1 串的定义及基本操作
• 串即字符串,计算机处理的对象分为数值数据和非数值数据,字符串是最基本的非数值数据。 • 字符串的应用非常广泛,它是许多软件系统(如字符编辑、情报检索、词法分析、符号处理、自然语言翻译
等系统)的操作对象。 • 在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规格等一般也是作为字符串处理的。字符
• 线性表的顺序和链式存储结构对于串都是适用的。但任何一种存储结构对于串的不同运 算并非都是十分有效的。
• 对于串的插入和删除操作,顺序存储结构是不方便的,而链式存储结构则显得方便些。 如果访问串中单个字符,对链表来说是不困难的;当要访问一组连续的字符时,用链式 存储结构要比用顺序存储结构麻烦。
11
9
第9页/共33页
串的基本操作
• (10)SubString(Sub,S,pos,len):求子串操作。若存在位置1≤pos≤StrLength(S)且 1≤len≤StrLength(S)-pos+1,则用Sub返回串S的第pos个字符起长度为len的子串。
• (11)StrIndex(S,T):串定位操作。若串S中存在和串T相同的子串,则返回它在串S中第一次出现的位 置;否则返回0。
•
同样存储S="
String Structure",用
紧凑格式一个地址能存四
• (13)StrDestroy(S):串销毁操作。销毁串S。
10
第10页/共33页
4.2 串的存储结构
4.1 串的定义及基本操作
• 串即字符串,计算机处理的对象分为数值数据和非数值数据,字符串是最基本的非数值数据。 • 字符串的应用非常广泛,它是许多软件系统(如字符编辑、情报检索、词法分析、符号处理、自然语言翻译
等系统)的操作对象。 • 在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规格等一般也是作为字符串处理的。字符
• 线性表的顺序和链式存储结构对于串都是适用的。但任何一种存储结构对于串的不同运 算并非都是十分有效的。
• 对于串的插入和删除操作,顺序存储结构是不方便的,而链式存储结构则显得方便些。 如果访问串中单个字符,对链表来说是不困难的;当要访问一组连续的字符时,用链式 存储结构要比用顺序存储结构麻烦。
11
9
第9页/共33页
串的基本操作
• (10)SubString(Sub,S,pos,len):求子串操作。若存在位置1≤pos≤StrLength(S)且 1≤len≤StrLength(S)-pos+1,则用Sub返回串S的第pos个字符起长度为len的子串。
• (11)StrIndex(S,T):串定位操作。若串S中存在和串T相同的子串,则返回它在串S中第一次出现的位 置;否则返回0。
•
同样存储S="
String Structure",用
紧凑格式一个地址能存四
python_04
– Invoked by a function call
• Specifies the function name and its arguments
– Arguments
• Additional information the function needs to compete its task
– The return task
– Calling a function
• functionName ( argument1, argument2 )
– The import keyword is used to include a module
– Invoking functions from a module
• Use the module name followed by the dot operator (.) • moduleName.functionName( argument )
2002 Prentice Hall. All rights reserved.
11
4.5 Function Definitions
• Definitions
– Functions must be defined before they are used – def functionName ( paramList ):
• Purpose
– – – – Functions support the divide and conquer strategy Help enhance software reusability Acts as building blocks for the program Avoids code repetition
• Specifies the function name and its arguments
– Arguments
• Additional information the function needs to compete its task
– The return task
– Calling a function
• functionName ( argument1, argument2 )
– The import keyword is used to include a module
– Invoking functions from a module
• Use the module name followed by the dot operator (.) • moduleName.functionName( argument )
2002 Prentice Hall. All rights reserved.
11
4.5 Function Definitions
• Definitions
– Functions must be defined before they are used – def functionName ( paramList ):
• Purpose
– – – – Functions support the divide and conquer strategy Help enhance software reusability Acts as building blocks for the program Avoids code repetition
数据结构-Python语言描述课件第4章
链串的优缺点:
在串的链式存储结构中,单字符链表的插入、删除操作较为简单,但存储效率低。块链表虽然存 储效率较高但插入、删除操作需要移动字符,较为复杂。此外,与顺序串相比,链串需要从头部 开始遍历才能访问某个位置的元素。 所以用户在应用中需要根据实际情况选择合适的存储结构。
4.2
串的模式匹配
——4.2 串的模式匹配——
4.3
数组的概念、特性和遍历
——4.3.1 数组的基本概念——
数组是n个具有相同数据类型的数据元素构成的集合,数组元素按某种次序存储在 地址连续的存储单元中,是顺序存储的随机存储结构。
数组元素在数组中的位置称为数组元素的下标,用户通过下标可以访问相应的数组
元素。数组下标的个数是数组的维数,具有一个下标的数组叫一维数组,具有两个
因为二维数组可以看成数组元素是一维数组的数组,所以二维数组也可看成线性表,即 A=(a0,a1,…,an-1),其中每个数据元素ai是一个列向量的线性表,即ai=(a0i,a1i,…,am-1i);或者 表述为A=(a0,a1,…,am-1),其中每个数据元素ai是一个行向量的线性表,即ai=(a0i,a1i,…,an1i)。其中,每个元素同时属于两个线性表,第i行的线性表和第j列的线性表,具体可以分析如下:
(1) 计算模式串的next[]函数值。
(2) i为主串的比较字符位序号, j为模式串的比较字符位序号。 当字符相等时,i、j分别加1后 继续比较; 否则i的值不变, j=next[ j],继续比较。
(3) 重复步骤(2),直到j等于模 式串的长度时匹配成功,否则 匹配失败。
——4.2.2 KMP 算法——
(1) 判断参数i是否满足0≤i≤n,若不 满足,则抛出异常。
(2) 重新分配存储空间为n+m,m为 插入的字符串str的长度。
在串的链式存储结构中,单字符链表的插入、删除操作较为简单,但存储效率低。块链表虽然存 储效率较高但插入、删除操作需要移动字符,较为复杂。此外,与顺序串相比,链串需要从头部 开始遍历才能访问某个位置的元素。 所以用户在应用中需要根据实际情况选择合适的存储结构。
4.2
串的模式匹配
——4.2 串的模式匹配——
4.3
数组的概念、特性和遍历
——4.3.1 数组的基本概念——
数组是n个具有相同数据类型的数据元素构成的集合,数组元素按某种次序存储在 地址连续的存储单元中,是顺序存储的随机存储结构。
数组元素在数组中的位置称为数组元素的下标,用户通过下标可以访问相应的数组
元素。数组下标的个数是数组的维数,具有一个下标的数组叫一维数组,具有两个
因为二维数组可以看成数组元素是一维数组的数组,所以二维数组也可看成线性表,即 A=(a0,a1,…,an-1),其中每个数据元素ai是一个列向量的线性表,即ai=(a0i,a1i,…,am-1i);或者 表述为A=(a0,a1,…,am-1),其中每个数据元素ai是一个行向量的线性表,即ai=(a0i,a1i,…,an1i)。其中,每个元素同时属于两个线性表,第i行的线性表和第j列的线性表,具体可以分析如下:
(1) 计算模式串的next[]函数值。
(2) i为主串的比较字符位序号, j为模式串的比较字符位序号。 当字符相等时,i、j分别加1后 继续比较; 否则i的值不变, j=next[ j],继续比较。
(3) 重复步骤(2),直到j等于模 式串的长度时匹配成功,否则 匹配失败。
——4.2.2 KMP 算法——
(1) 判断参数i是否满足0≤i≤n,若不 满足,则抛出异常。
(2) 重新分配存储空间为n+m,m为 插入的字符串str的长度。
数据结构课件--第四章
HString *s; char *tval;
{int len,i=0;
if (s->ch!=NULL) free(s->ch);
while (tval[i]!='\0') i++;
len=i;
if (len) {s->ch=(char *)malloc(len);
if (s->ch==NULL) return(0); for (i=0;i<len;i++) s->ch[i]=tval[i];
返回主目录
2021/8/5
21
堆串的存储映象示例 a='a program',b='string ',c='process',free=23。
Heap[MAXSIZE]
free=23
a p r o g r a ms t r i n g
pr oc e s s
符号表
符号名 len
a9
b7
c
7
start 0 9 16
2021/8/5
6
(8)StrClear(S)
初始条件: 串S存在
操作结果:将S清为空串 (9)StrCat(S,T)
初始条件: 串S和T存在
操作结果:将串T的值连接在串S的后面
(10)SubString(Sub,S,pos,len)
初 始 条 件 : 串 S 存 在 , 1≤pos≤StrLength(S) 且
for (i=s->len;i<MAXLEN;i++)
s->ch[i]=t.ch[i-s->len];s->len=MAXLEN;flag=0; } else flag=0;// 串s的长度等于MAXLEN ,串t不被连接
《数据结构课件、代码》第4章 树和二叉树
ppt课件
9
注意二:二叉叉树树或是为有空序树树, 或,它是的由子一树个有根左结右点之加分上。两
棵二分叉别树称的为度左数子不树超和过右二子,但树度的数、不互超不过交二的的二树叉
树未组必成是。二叉树。
根结点
A
右子树
B
E
左子树
C D
ppt课件
F G
HK
10
二叉树的五种基本形态:
空树
只含根结点
N
右子树为空树 左子树为空树
树根
T1
T2 ppt课件
T3
3
2. 树的表示法:
(1). 树型图示 (2).嵌套集合 (3).凹入(书目) (4). 广义表(用根作为表的名字写在表的左边)
KE B A
L
F
D MH J
I GC
ppt课件
A -----------B ---------E -------K -----L -----F -------C ---------G -------D ---------H -------M -----I --------
20+21+ +2k-1 = 2k-1
ppt课件
13
性质 3 :
对任何一棵二叉树,若它含有n0 个叶子结点、n2 个 度为 2 的结点, 则必存在关系式:n0 = n2+1。
证明:
也可以用归纳法证明
设 二叉树上结点总数: n = n0 + n1 + n2
再根据树的性质:
b = n-1 = n0 + n1 + n2 - 1
N
N
左右子 树均非
空树
N
L
数据结构(Python语言描述)-第4章栈
❖ Other examples…弹夹装卸子弹,桌子上的一盒抽纸,叠在一起的靠背椅。 ❖栈) empty(判空) top(取栈顶元素) size init
❖ Important property : Last in , first out ---LIFO 7
@abstractmethod def push(self, item):
""" 入栈一个元素
""" @abstractmethod def pop(self):
""" 出栈一个元素
"""
@abstractmethod def get_top(self):
""" 读取栈顶元素
"""
11
栈的存储
❖ 顺序存储 ❖ 链式存储
图示
❖ 可以用一个来开口向上的容器表示一个栈,对这个容器,用 户可见的位置只有栈顶位置,只能在此位置进行插入和删除 操作。
❖ 栈的插入和删除一般分别被称为push和pop操作。
栈结构示意图
8
问题
假设有5个元素abcde顺序进栈(进栈过程中可以出栈),出栈 序列为dceba,则该栈容量必定不小于多少。
9
栈的抽象数据类型ADT
T类型元素构成的栈是由T类型元素构成的有限序列,并且具有以 下基本操作: (1)创建一个空栈(init) (2)判断栈是否为空(empty) (3)求栈的长度,即栈中元素个数(len) (4)入栈一个元素(push) (5)出栈一个元素(pop) (6)读取栈顶元素(get_top)
12
问题
❖ Python有没有内置的栈类?
❖ Important property : Last in , first out ---LIFO 7
@abstractmethod def push(self, item):
""" 入栈一个元素
""" @abstractmethod def pop(self):
""" 出栈一个元素
"""
@abstractmethod def get_top(self):
""" 读取栈顶元素
"""
11
栈的存储
❖ 顺序存储 ❖ 链式存储
图示
❖ 可以用一个来开口向上的容器表示一个栈,对这个容器,用 户可见的位置只有栈顶位置,只能在此位置进行插入和删除 操作。
❖ 栈的插入和删除一般分别被称为push和pop操作。
栈结构示意图
8
问题
假设有5个元素abcde顺序进栈(进栈过程中可以出栈),出栈 序列为dceba,则该栈容量必定不小于多少。
9
栈的抽象数据类型ADT
T类型元素构成的栈是由T类型元素构成的有限序列,并且具有以 下基本操作: (1)创建一个空栈(init) (2)判断栈是否为空(empty) (3)求栈的长度,即栈中元素个数(len) (4)入栈一个元素(push) (5)出栈一个元素(pop) (6)读取栈顶元素(get_top)
12
问题
❖ Python有没有内置的栈类?
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4) 连接操作 5) 比较操作
4) concat(str)是将串str插入到字符 串的尾部,此时调用insert(curLen,str) 即可实现。
5) 比较操作compareTo(str)是将字 符串与串str按照字典序进行比较。若 当前字符串较大,返回1; 若相等,返 回0。若当前字符串较小,返回-1。其 主要步骤如下:
(1) 基于顺序存储的实现, 为顺序串;
(2) 基于链式存储的实现, 为链串。
——4.1.3 顺序串——
1. 顺序串的描述: 顺序串与顺序表的逻辑结构相同,存储结构类似,均可用数组来存储数据元素。 但串具有独特的不同于线性表的操作,属于特殊类型的线性表。下图所示为顺序 串。
——4.1.3 顺序串——
——4.1.2 串的抽象数据类型描述——
字符串是数据元素类型为字 符的线性表,其抽象数据类 型描述与线性表相似,又根 据串在实际问题中的应用抽 象出串的基本操作,可得串 的抽象数据类型Python语言 描述如左边所示。
——4.1.2 串的抽象数据类型描述——
字符串的抽象数据类型 Python抽象类包含了串的主 要基本操作,如果要使用这 个接口,还需要具体的类来 实现。串的Python抽象类的 实现方法主要有以下两种:
实现IString抽象类的顺序串类的Python语言描述如下:
——4.1.3 顺序串——
2. 顺序串基本操作的实现 顺序串有许多基本操作,例如,求子串操作、插入操作、删用Python实现。
——4.1.3 顺序串——
1) 求子串操作
求 子 串 操 作 subString(begin,end) 是 返回长度为n的字符串中位序号从 begin 到 end-1 的 字 符 序 列 , 其 中 0≤begin≤n-1 , begin<end≤n 。 其 主 要步骤如下:
——4.2.2 KMP 算法——
2. K值的计算
代码实现:
——4.2.2 KMP 算法——
3. KMP算法步骤
设主串的长度为n、模式串的长度为m,求next[]的时间复 杂度为O(m)。在KMP中,因主串的下标不需要回退,比较 次数最多为n-m+1,所以KMP算法的时间复杂度为O(m+n)。
KMP算法的主要步骤如下。
4.3
数组的概念、特性和遍历
——4.3.1 数组的基本概念——
数组是n个具有相同数据类型的数据元素构成的集合,数组元素按某种次序存储在 地址连续的存储单元中,是顺序存储的随机存储结构。
数组元素在数组中的位置称为数组元素的下标,用户通过下标可以访问相应的数组
元素。数组下标的个数是数组的维数,具有一个下标的数组叫一维数组,具有两个
与线性表不同的是每个结点的数据域可以是一个字符或者多个字符。若每个结点的数据域为一个 字符,这种链表称为单字符链表; 若每个结点的数据域为多个字符,则称为块链表。在块链表中 每个结点的数据域不一定被字符占满,可通过添加空字符或者其他非串值字符来简化操作。如图 所示为两种不同类型的链串。
——4.1.4 链串——
链串的优缺点:
在串的链式存储结构中,单字符链表的插入、删除操作较为简单,但存储效率低。块链表虽然存 储效率较高但插入、删除操作需要移动字符,较为复杂。此外,与顺序串相比,链串需要从头部 开始遍历才能访问某个位置的元素。 所以用户在应用中需要根据实际情况选择合适的存储结构。
4.2
串的模式匹配
——4.2 串的模式匹配——
——4.2.1 Brute Force 算法——
Brute Force算法的实现简单,但效率非常低。m为模式串的长度,n为主串的长度。 (1) 最好情况: 第一次匹配即成功,比较次数为模式串的长度m,时间复杂度为O(m)。 (2) 最坏情况: 每次匹配比较至模式串的最后一个字符,并且比较了目标串中所有长度为m的子串, 此时的时间复杂度为O(m×n)。
(1) a0,0是起点,没有前驱元素; am-1,n-1是终点,没有后继元素。
(2) 边界元素ai,0和a0,j(1≤j<n,1≤i<m)只有一个前驱元素; ai,n-1和am-1,j(0≤j<n-
1,1≤i<m-1)只有一个后继元素。 (3) ai,j(1≤j<n-1,1≤i<m-1)有两个前驱元素和两个后继元素。
缺点:每次匹配没有利用前一次匹配的比较结果,使算法中存在较多的重复比较,降低了算法的效率;
如果利用部分字符匹配的结果,可将算法的效率提高。因此提出了KMP算法,在下一节进行介绍。
——4.2.2 KMP 算法——
1. 算法分析
设主串为s="aba bcabdabcabca"、模式串为p="abcabc",指针i、j分别指示主串 和模式串所比较字符的位序号。当某次匹配不成功时有si≠pj,并且si-jsi-j+1…si1=p0p1…pj-1。此时需要寻找前缀子串p0p1…pk-1=pj-kpj-k+1…pj-1,其中 0<k<j,这时候即满足si-ksi-k+1…si-1=p0p1…pk-1,下一次匹配可直接比较si和 pk。此外,为了减少比较次数,k应取最大值,即p0p1…pk-1应为满足此性质的最长 前缀子串。若k不存在,下一次匹配则直接比较si和p0。
(1) 计算模式串的next[]函数值。
(2) i为主串的比较字符位序号, j为模式串的比较字符位序号。 当字符相等时,i、j分别加1后 继续比较; 否则i的值不变, j=next[ j],继续比较。
(3) 重复步骤(2),直到j等于模 式串的长度时匹配成功,否则 匹配失败。
——4.2.2 KMP 算法——
——4.1.1 串的基本概念——
字符串中任意个连续字符组成的子序列称为字符串的子串,此字符串为该子串的 主串。子串在主串中的位置是指子串在主串中第一次出现时的第一个字符在主串 中的位置。空串是任意串的子串,每个字符串都是其自身的子串,除自身外,主 串的其他子串称为主串的真子串。 串的比较规则和字符的比较规则有关,字符的比较规则由所属的字符集的编码决 定。两个串相等是指串长度相同并且各对应位置上的字符也相同。两个串的大小 由对应位置上的首个不同字符的大小决定,字符比较次序是从头开始依次向后。 当两个串的长度不等而对应位置上的字符都相同时较长的串定义为较大。
(1) 判断参数i是否满足0≤i≤n,若不 满足,则抛出异常。
(2) 重新分配存储空间为n+m,m为 插入的字符串str的长度。
(3) 将第i个及之后的数据元素向后移 动m个存储单元。
(4) 将str插入到字符串从i开始的位置。
——4.1.3 顺序串——
3) 删除操作
删 除 操 作 delete(begin,end) 是 将 长 度 为 n 的 字 符 串 的 位 序 号 为 begin 到 end-1的元素删除,其中参数begin和 end 满 足 0≤begin≤curLen-1 和 begin<end≤curLen。其主要步骤如下:
第4章 串和数组
主要内容
• 4.1 串的基本概念、抽象描述和分类 • 4.2 串的模式匹配 • 4.3 数组的概念、特性、遍历 • 4.4 特殊矩阵的压缩存储 • 总结
4.1
串的基本概念、抽象描述 和分类
——4.1.1 串的基本概念——
字符串也叫串,是由字符组成的有限序列,是一种常用的非数值数据。串的逻辑结 构是线性表,串是一种特殊的线性表,其每个数据元素都是一个字符。但是串的操 作特点与线性表不同,主要是对子串进行操作,通常采用顺序存储结构存储。 字符串可以表示为str="a0a1…ai…an-1",其中str为串名,也叫串变量; i为字 符ai在串中的位序号; 双引号中的字符序列称为串值; n为串的长度; 当n=0时 字符串不包含任何字符,为空串; 当字符串由一个或多个空白字符组成时为空白串。
(1) 检查参数begin和end是否满足 0≤begin≤n-1 和 begin<end≤n , 若 不 满足,抛出异常。
(2) 返回位序号为begin到end-1的字 符序列。
代码如左图所示
——4.1.3 顺序串——
2) 插入操作
插入操作insert(i,str)是在长度为n的 字符串的第i个元素之前插入串str,其 中0≤i≤n。其主要步骤如下:
下标的数组叫二维数组。一维数组的逻辑结构是线性表,多维数组是线性表的扩展。
二维数组可以看成数组元素是一维数组的数组。下图所示为二维数组的矩阵表示。
a0,0
Amn
am1,0
a0,n1
am1,n1
——4.3.1 数组的基本概念——
二维数组中的每个数据元素ai,j都受到两个关系的约束,即行关系和列关系。ai.,j+1是ai,j在行关系 中的后继元素; ai+1,j是ai,j在列关系中的后继元素。
——4.2.2 KMP 算法——
2. K值的计算
通过前面的分析已知,每次模式串开始比较的位置(即k的值)仅与模式串本身有关。一般用next[ j]来 表示pj对应的k值。 初始时可定义next[0]=-1,next[1]=0。 设next[ j]=k,则p0p1…pk-1=pj-kpj-k+1…pj-1,k为满足等式的最大值。计算next[ j+1]的值。 (1) 若pk=pj,则存在p0p1…pk-1pk=pj-kpj-k+1…pj-1pj,此时next[j+1]=k+1。 (2) 若pk≠pj,可以把计算next[j]的值的问题看成新的模式匹配过程,主串为p,模式串为p的前缀子串。 出现不匹配,应将模式串的比较位置变为k′=next[k],若pj=p_(k^' ),则 next[ j+1]=k′+1=next[k]+1,否则继续执行步骤(2),直到pj=pk,或者当k=0并且pj≠pk时 next[ j+1]=0。
4) concat(str)是将串str插入到字符 串的尾部,此时调用insert(curLen,str) 即可实现。
5) 比较操作compareTo(str)是将字 符串与串str按照字典序进行比较。若 当前字符串较大,返回1; 若相等,返 回0。若当前字符串较小,返回-1。其 主要步骤如下:
(1) 基于顺序存储的实现, 为顺序串;
(2) 基于链式存储的实现, 为链串。
——4.1.3 顺序串——
1. 顺序串的描述: 顺序串与顺序表的逻辑结构相同,存储结构类似,均可用数组来存储数据元素。 但串具有独特的不同于线性表的操作,属于特殊类型的线性表。下图所示为顺序 串。
——4.1.3 顺序串——
——4.1.2 串的抽象数据类型描述——
字符串是数据元素类型为字 符的线性表,其抽象数据类 型描述与线性表相似,又根 据串在实际问题中的应用抽 象出串的基本操作,可得串 的抽象数据类型Python语言 描述如左边所示。
——4.1.2 串的抽象数据类型描述——
字符串的抽象数据类型 Python抽象类包含了串的主 要基本操作,如果要使用这 个接口,还需要具体的类来 实现。串的Python抽象类的 实现方法主要有以下两种:
实现IString抽象类的顺序串类的Python语言描述如下:
——4.1.3 顺序串——
2. 顺序串基本操作的实现 顺序串有许多基本操作,例如,求子串操作、插入操作、删用Python实现。
——4.1.3 顺序串——
1) 求子串操作
求 子 串 操 作 subString(begin,end) 是 返回长度为n的字符串中位序号从 begin 到 end-1 的 字 符 序 列 , 其 中 0≤begin≤n-1 , begin<end≤n 。 其 主 要步骤如下:
——4.2.2 KMP 算法——
2. K值的计算
代码实现:
——4.2.2 KMP 算法——
3. KMP算法步骤
设主串的长度为n、模式串的长度为m,求next[]的时间复 杂度为O(m)。在KMP中,因主串的下标不需要回退,比较 次数最多为n-m+1,所以KMP算法的时间复杂度为O(m+n)。
KMP算法的主要步骤如下。
4.3
数组的概念、特性和遍历
——4.3.1 数组的基本概念——
数组是n个具有相同数据类型的数据元素构成的集合,数组元素按某种次序存储在 地址连续的存储单元中,是顺序存储的随机存储结构。
数组元素在数组中的位置称为数组元素的下标,用户通过下标可以访问相应的数组
元素。数组下标的个数是数组的维数,具有一个下标的数组叫一维数组,具有两个
与线性表不同的是每个结点的数据域可以是一个字符或者多个字符。若每个结点的数据域为一个 字符,这种链表称为单字符链表; 若每个结点的数据域为多个字符,则称为块链表。在块链表中 每个结点的数据域不一定被字符占满,可通过添加空字符或者其他非串值字符来简化操作。如图 所示为两种不同类型的链串。
——4.1.4 链串——
链串的优缺点:
在串的链式存储结构中,单字符链表的插入、删除操作较为简单,但存储效率低。块链表虽然存 储效率较高但插入、删除操作需要移动字符,较为复杂。此外,与顺序串相比,链串需要从头部 开始遍历才能访问某个位置的元素。 所以用户在应用中需要根据实际情况选择合适的存储结构。
4.2
串的模式匹配
——4.2 串的模式匹配——
——4.2.1 Brute Force 算法——
Brute Force算法的实现简单,但效率非常低。m为模式串的长度,n为主串的长度。 (1) 最好情况: 第一次匹配即成功,比较次数为模式串的长度m,时间复杂度为O(m)。 (2) 最坏情况: 每次匹配比较至模式串的最后一个字符,并且比较了目标串中所有长度为m的子串, 此时的时间复杂度为O(m×n)。
(1) a0,0是起点,没有前驱元素; am-1,n-1是终点,没有后继元素。
(2) 边界元素ai,0和a0,j(1≤j<n,1≤i<m)只有一个前驱元素; ai,n-1和am-1,j(0≤j<n-
1,1≤i<m-1)只有一个后继元素。 (3) ai,j(1≤j<n-1,1≤i<m-1)有两个前驱元素和两个后继元素。
缺点:每次匹配没有利用前一次匹配的比较结果,使算法中存在较多的重复比较,降低了算法的效率;
如果利用部分字符匹配的结果,可将算法的效率提高。因此提出了KMP算法,在下一节进行介绍。
——4.2.2 KMP 算法——
1. 算法分析
设主串为s="aba bcabdabcabca"、模式串为p="abcabc",指针i、j分别指示主串 和模式串所比较字符的位序号。当某次匹配不成功时有si≠pj,并且si-jsi-j+1…si1=p0p1…pj-1。此时需要寻找前缀子串p0p1…pk-1=pj-kpj-k+1…pj-1,其中 0<k<j,这时候即满足si-ksi-k+1…si-1=p0p1…pk-1,下一次匹配可直接比较si和 pk。此外,为了减少比较次数,k应取最大值,即p0p1…pk-1应为满足此性质的最长 前缀子串。若k不存在,下一次匹配则直接比较si和p0。
(1) 计算模式串的next[]函数值。
(2) i为主串的比较字符位序号, j为模式串的比较字符位序号。 当字符相等时,i、j分别加1后 继续比较; 否则i的值不变, j=next[ j],继续比较。
(3) 重复步骤(2),直到j等于模 式串的长度时匹配成功,否则 匹配失败。
——4.2.2 KMP 算法——
——4.1.1 串的基本概念——
字符串中任意个连续字符组成的子序列称为字符串的子串,此字符串为该子串的 主串。子串在主串中的位置是指子串在主串中第一次出现时的第一个字符在主串 中的位置。空串是任意串的子串,每个字符串都是其自身的子串,除自身外,主 串的其他子串称为主串的真子串。 串的比较规则和字符的比较规则有关,字符的比较规则由所属的字符集的编码决 定。两个串相等是指串长度相同并且各对应位置上的字符也相同。两个串的大小 由对应位置上的首个不同字符的大小决定,字符比较次序是从头开始依次向后。 当两个串的长度不等而对应位置上的字符都相同时较长的串定义为较大。
(1) 判断参数i是否满足0≤i≤n,若不 满足,则抛出异常。
(2) 重新分配存储空间为n+m,m为 插入的字符串str的长度。
(3) 将第i个及之后的数据元素向后移 动m个存储单元。
(4) 将str插入到字符串从i开始的位置。
——4.1.3 顺序串——
3) 删除操作
删 除 操 作 delete(begin,end) 是 将 长 度 为 n 的 字 符 串 的 位 序 号 为 begin 到 end-1的元素删除,其中参数begin和 end 满 足 0≤begin≤curLen-1 和 begin<end≤curLen。其主要步骤如下:
第4章 串和数组
主要内容
• 4.1 串的基本概念、抽象描述和分类 • 4.2 串的模式匹配 • 4.3 数组的概念、特性、遍历 • 4.4 特殊矩阵的压缩存储 • 总结
4.1
串的基本概念、抽象描述 和分类
——4.1.1 串的基本概念——
字符串也叫串,是由字符组成的有限序列,是一种常用的非数值数据。串的逻辑结 构是线性表,串是一种特殊的线性表,其每个数据元素都是一个字符。但是串的操 作特点与线性表不同,主要是对子串进行操作,通常采用顺序存储结构存储。 字符串可以表示为str="a0a1…ai…an-1",其中str为串名,也叫串变量; i为字 符ai在串中的位序号; 双引号中的字符序列称为串值; n为串的长度; 当n=0时 字符串不包含任何字符,为空串; 当字符串由一个或多个空白字符组成时为空白串。
(1) 检查参数begin和end是否满足 0≤begin≤n-1 和 begin<end≤n , 若 不 满足,抛出异常。
(2) 返回位序号为begin到end-1的字 符序列。
代码如左图所示
——4.1.3 顺序串——
2) 插入操作
插入操作insert(i,str)是在长度为n的 字符串的第i个元素之前插入串str,其 中0≤i≤n。其主要步骤如下:
下标的数组叫二维数组。一维数组的逻辑结构是线性表,多维数组是线性表的扩展。
二维数组可以看成数组元素是一维数组的数组。下图所示为二维数组的矩阵表示。
a0,0
Amn
am1,0
a0,n1
am1,n1
——4.3.1 数组的基本概念——
二维数组中的每个数据元素ai,j都受到两个关系的约束,即行关系和列关系。ai.,j+1是ai,j在行关系 中的后继元素; ai+1,j是ai,j在列关系中的后继元素。
——4.2.2 KMP 算法——
2. K值的计算
通过前面的分析已知,每次模式串开始比较的位置(即k的值)仅与模式串本身有关。一般用next[ j]来 表示pj对应的k值。 初始时可定义next[0]=-1,next[1]=0。 设next[ j]=k,则p0p1…pk-1=pj-kpj-k+1…pj-1,k为满足等式的最大值。计算next[ j+1]的值。 (1) 若pk=pj,则存在p0p1…pk-1pk=pj-kpj-k+1…pj-1pj,此时next[j+1]=k+1。 (2) 若pk≠pj,可以把计算next[j]的值的问题看成新的模式匹配过程,主串为p,模式串为p的前缀子串。 出现不匹配,应将模式串的比较位置变为k′=next[k],若pj=p_(k^' ),则 next[ j+1]=k′+1=next[k]+1,否则继续执行步骤(2),直到pj=pk,或者当k=0并且pj≠pk时 next[ j+1]=0。