大话《数据结构》
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现算法: (略)
基本操作在链式结构上的实现
操作一:strcopy(s,t) 操作二:strequal(s,t) 操作三:strlength(s) 操作四:strconcat(s,t) 操作五:strsub(s,i,j) 操作六:strdelsub(s,i,j) 操作七:strins(s1,i,s2) 操作八:strrep(s,i,j,t)
实现算法:(略)
操作五:strsub(s,i,j)
分析:求s中从第i个字符开始长度为j的子串。需判 定所给的i (i>=1&&i<=s.len) 、j (j>=0&&j<=s.len-i+1)范 围是否合法。
实现算法:(略)
操作六:strdelsub(s,i,j)
分析:串s中的字符是连续存储的,所以当删除从i 到j的子串后要求将后面的字符全部前移j个单元,在删 除之前需要判断i (i>=1&&i<=s.len) 、j (j>=0&&j<=s.leni+1)是否合法。
链串结点大小的选择将直接影响到串处理的效率。
存储密度=串值所占存储容量 / 实际分配存储容量
链串的类型定义如下:
typedef struct Lnode
{ char
data ;
//存放字符
struct Lnode * next ;
}*Linkstring ;
朴素的模式匹配算法
论文查询,索引,关键词
操作二:strequal(s,t)
分析:判断s和t两个串是否相等,如果串长不相等则两 个串不相等,返回标志0,如果串长相等且串中的各个 字符对应相等则两个串相等,返回标志1;如果有字符 不相等,则表明两字符串不相等,返回标志0。 实现算法:(略)
操作三:strlength(s)
分析:求串长度,直接返回s.len 的值。 实现算法:(略)
实现算法: (略)
操作三:strlength(s)
分析:遍历单链表,得到结点个数,即串的长度。 实现算法:(略)
操作四:strconcat(s,t)
分析:链式存储的串只需将两个链表的首尾相连, 不需要判断合并后存储空间的容量。
实现算法:(略)
操作五:strsub(s,i,j)
分析:返回s串中从第i个结点开始,长度为j的一 个子串。
KMP算法
思想:设s为目标串,t为模式串,并设i指针和j指针 分别指示目标串和模式串中正待比较的字符,令i和j的初 值均为0。若有si=tj,则i和j分别增1;否则,i不变,j退回 到j=next[j]的位置(即模式串右滑),比较si和tj,若相等 则指针各增1,否则j再退回到下一个j=next[j]的位置(即 模式串继续右滑),再比较si和tj。依次类推,直到下列 两种情况之一:第一种情况是j退回到某个j=next[j]时有 si=tj,则指针各增1后继续匹配;另一种情况是j退回到j=1时,此时令指针各增1,即下一次比较si+1和t0。
操作一:strcopy(s,t)串拷贝
分析:将t所指串中的内容拷贝到s串中。 实现算法:
void strcopy(string &s,string t) { int i; for(i=0;i<t.len;i++) s.ch[i]=t.ch[i]; s.len=t.len; s.ch[s.len]='\0'; // '\0'表示串的结束 }
第五章:串
我亦当年不出户, 为天下惜此人物。 秀应本州计入洛, 莲沼水从双涧入。
算法和数据结构
4
5.2 串的定义 5.3 串的比较 5.4 串的抽象数据类型 5.5 串的存储结构 5.6 朴素的模式匹配算法 5.7 KMP模式匹配算法 5.8 本或多个字符组成的有穷序
实现算法: (略)
下课!
空间利用率低
处理字符速度低
顺序串的类型定义描述如下:
# define maxlen maxsize //maxsize为给定的最大长度
struct string { char ch[ maxlen ] ;
//maxlen为数组中存储空间的最大数量 int len ; };
串的链式存储
链串与一般的链表类似,链串中的一个结点可以存储一个或多 个字符。
操作四:strconcat(s,t)
分析:进行串连接时,由于存储空间有限,连接后的串 的长度不确定,所以存在三种情况: (1)两个串的长度之和小于最大存储量:将两个串进 行连接。 (2)两个串的长度之和大于最大存储值,但第一个串 的长度比最大存储值要小:将第二个串的部分进行连接 ,长出的部分采用截尾法处理。 (3)连接时第一个串就已将存储空间用完:不进行连 接。
操作一:strcopy(s,t)
分析:对于串的链接存储结构,其操作结果和顺序 存储一样,使s串和t串内容相同。
实现算法:(略)
操作二:strequal(s,t)
分析:判定两个串是否从第一个字符到最后一个字 符都相同,如果相同则两个串相等,返回标志1,如果 有不相同的字符或一个串比较结束而另一个串还有字符 没被比较,则s和t不相等,返回标志0。
基本操作在顺序结构上的实现
操作一:strcopy(s,t) 操作二:strequal(s,t) 操作三:strlength(s) 操作四:strconcat(s,t) 操作五:strsub(s,i,j) 操作六:strdelsub(s,i,j) 操作七:strins(s1,i,s2) 操作八:strrep(s,i,j,t)
崔基哲 ▪清华大学的教授 ▪哈尔滨工业大学的教授 ▪朝鲜军队的 ▪上海开公司的/LG电子研究所所长 ▪等等… (张三,李四)
Brute—Force算法:
思想:从目标串s=“s0s1…sn- 1”的第一个字符开始和模式串 t=“t0t1…t m-1”中的第一个字符 比较,若相等,则继续比较后 面的字符;否则从目标串s的第 二个字符开始重新与模式串t的 第一个字符进行比较。依次类 推,若存在一个每个字符依次 与目标串中的对应字符相等的 连续字符序列,则匹配成功, 函数返回t中的第一个字符在s 中的位置;否则,匹配失败, 函数返回0。
C语言中,存储串时,每个字符在内存占用一个字 节,并用特殊字符“\0”标记串结束。
注意:空格串与空串是不相同的。空串的长度为0,空格 串的长度为串中空格字符的个数。
算法和数据结构
6
串的比较
ASCII编码 128(7位)->特殊字符->256个字符(8位) Unicode编码(中文,韩文,日文等) ▪ 16位数,约2^16, 65万个字符 排序问题 大小问题
串的抽象数据类型
5.5 串的存储结构
1 串的顺序存储 2 串的链式存储
串的顺序存储
顺序存储实现:在顺序串中,每个字符依次存 放在一组连续的存储单元中。
串的顺序存储有两种方法:一种是每个存储单 元只存一个字符,称为非紧缩格式。第二种, 在每个存储单元中存放多个字符,称为紧缩 格式。
处理字符的速度高, 节省存储空间,
实现算法:(略)
操作六:strdelsub(s,i,j)
分析:删除s串中从第i个结点开始的连续j个结点 。
实现算法: (略)
操作七:strins(s1,i,s2)
分析:只需将s2链表插入到s1的第i个结点的位置。 实现算法:(略)
操作八:strrep(s,i,j,t)
分析:先删除s串中从第i个字符开始的连续j个结 点,再将t串插入到第i个结点的位置。
实现算法: (略)
操作七:strins(s1,i,s2)
分析:向s1中第i个位置插入s2,当两个串的长度之 和小于存储总长度时,需要将s1串中第i个字符后的所 有字符全部向后移动strlength(s2)个单元。
实现算法:(略)
操作八:strrep(s,i,j,t)
分析:s串中从第i个字符开始的j个连续字符将被t字 符串替换,这时s串中被替换部分后面的所有字符要相 应的移动连接在替换部分的后面,保证替换后的字符串 仍然是连续存储。
算法和数据结构
1
第一章 绪论 第二章 算法 第三章 线性表 第四章 栈和队列 第五章 串 第六章 树 第七章 图 第八章 查找 第九章 排序
算法和数据结构
2
串
羊肉串 一(串)葡萄 Lover, friend,
▪ Lover也有Over ▪ Friend也有end ▪ Believe也有lie
我画蓝江水悠悠, 爱晚亭上枫叶愁。 秋月溶溶照佛寺, 香烟袅袅绕经楼。
列。一般记作:s="a0
a1
a2…a
"
n-1
(n≥0)。
用双引号括起来的字符序列是串值,双引号是串标志
,串中所含字符个数n称为该串的长度(或串长)。
含零个字符的串称为空串,用Φ表示。字符在序列中的 序号为该字符在串中的位置。
串中任意个连续字符组成的子序列称为该串的子串 。包含子串的串相应地被称为主串。
基本操作在链式结构上的实现
操作一:strcopy(s,t) 操作二:strequal(s,t) 操作三:strlength(s) 操作四:strconcat(s,t) 操作五:strsub(s,i,j) 操作六:strdelsub(s,i,j) 操作七:strins(s1,i,s2) 操作八:strrep(s,i,j,t)
实现算法:(略)
操作五:strsub(s,i,j)
分析:求s中从第i个字符开始长度为j的子串。需判 定所给的i (i>=1&&i<=s.len) 、j (j>=0&&j<=s.len-i+1)范 围是否合法。
实现算法:(略)
操作六:strdelsub(s,i,j)
分析:串s中的字符是连续存储的,所以当删除从i 到j的子串后要求将后面的字符全部前移j个单元,在删 除之前需要判断i (i>=1&&i<=s.len) 、j (j>=0&&j<=s.leni+1)是否合法。
链串结点大小的选择将直接影响到串处理的效率。
存储密度=串值所占存储容量 / 实际分配存储容量
链串的类型定义如下:
typedef struct Lnode
{ char
data ;
//存放字符
struct Lnode * next ;
}*Linkstring ;
朴素的模式匹配算法
论文查询,索引,关键词
操作二:strequal(s,t)
分析:判断s和t两个串是否相等,如果串长不相等则两 个串不相等,返回标志0,如果串长相等且串中的各个 字符对应相等则两个串相等,返回标志1;如果有字符 不相等,则表明两字符串不相等,返回标志0。 实现算法:(略)
操作三:strlength(s)
分析:求串长度,直接返回s.len 的值。 实现算法:(略)
实现算法: (略)
操作三:strlength(s)
分析:遍历单链表,得到结点个数,即串的长度。 实现算法:(略)
操作四:strconcat(s,t)
分析:链式存储的串只需将两个链表的首尾相连, 不需要判断合并后存储空间的容量。
实现算法:(略)
操作五:strsub(s,i,j)
分析:返回s串中从第i个结点开始,长度为j的一 个子串。
KMP算法
思想:设s为目标串,t为模式串,并设i指针和j指针 分别指示目标串和模式串中正待比较的字符,令i和j的初 值均为0。若有si=tj,则i和j分别增1;否则,i不变,j退回 到j=next[j]的位置(即模式串右滑),比较si和tj,若相等 则指针各增1,否则j再退回到下一个j=next[j]的位置(即 模式串继续右滑),再比较si和tj。依次类推,直到下列 两种情况之一:第一种情况是j退回到某个j=next[j]时有 si=tj,则指针各增1后继续匹配;另一种情况是j退回到j=1时,此时令指针各增1,即下一次比较si+1和t0。
操作一:strcopy(s,t)串拷贝
分析:将t所指串中的内容拷贝到s串中。 实现算法:
void strcopy(string &s,string t) { int i; for(i=0;i<t.len;i++) s.ch[i]=t.ch[i]; s.len=t.len; s.ch[s.len]='\0'; // '\0'表示串的结束 }
第五章:串
我亦当年不出户, 为天下惜此人物。 秀应本州计入洛, 莲沼水从双涧入。
算法和数据结构
4
5.2 串的定义 5.3 串的比较 5.4 串的抽象数据类型 5.5 串的存储结构 5.6 朴素的模式匹配算法 5.7 KMP模式匹配算法 5.8 本或多个字符组成的有穷序
实现算法: (略)
下课!
空间利用率低
处理字符速度低
顺序串的类型定义描述如下:
# define maxlen maxsize //maxsize为给定的最大长度
struct string { char ch[ maxlen ] ;
//maxlen为数组中存储空间的最大数量 int len ; };
串的链式存储
链串与一般的链表类似,链串中的一个结点可以存储一个或多 个字符。
操作四:strconcat(s,t)
分析:进行串连接时,由于存储空间有限,连接后的串 的长度不确定,所以存在三种情况: (1)两个串的长度之和小于最大存储量:将两个串进 行连接。 (2)两个串的长度之和大于最大存储值,但第一个串 的长度比最大存储值要小:将第二个串的部分进行连接 ,长出的部分采用截尾法处理。 (3)连接时第一个串就已将存储空间用完:不进行连 接。
操作一:strcopy(s,t)
分析:对于串的链接存储结构,其操作结果和顺序 存储一样,使s串和t串内容相同。
实现算法:(略)
操作二:strequal(s,t)
分析:判定两个串是否从第一个字符到最后一个字 符都相同,如果相同则两个串相等,返回标志1,如果 有不相同的字符或一个串比较结束而另一个串还有字符 没被比较,则s和t不相等,返回标志0。
基本操作在顺序结构上的实现
操作一:strcopy(s,t) 操作二:strequal(s,t) 操作三:strlength(s) 操作四:strconcat(s,t) 操作五:strsub(s,i,j) 操作六:strdelsub(s,i,j) 操作七:strins(s1,i,s2) 操作八:strrep(s,i,j,t)
崔基哲 ▪清华大学的教授 ▪哈尔滨工业大学的教授 ▪朝鲜军队的 ▪上海开公司的/LG电子研究所所长 ▪等等… (张三,李四)
Brute—Force算法:
思想:从目标串s=“s0s1…sn- 1”的第一个字符开始和模式串 t=“t0t1…t m-1”中的第一个字符 比较,若相等,则继续比较后 面的字符;否则从目标串s的第 二个字符开始重新与模式串t的 第一个字符进行比较。依次类 推,若存在一个每个字符依次 与目标串中的对应字符相等的 连续字符序列,则匹配成功, 函数返回t中的第一个字符在s 中的位置;否则,匹配失败, 函数返回0。
C语言中,存储串时,每个字符在内存占用一个字 节,并用特殊字符“\0”标记串结束。
注意:空格串与空串是不相同的。空串的长度为0,空格 串的长度为串中空格字符的个数。
算法和数据结构
6
串的比较
ASCII编码 128(7位)->特殊字符->256个字符(8位) Unicode编码(中文,韩文,日文等) ▪ 16位数,约2^16, 65万个字符 排序问题 大小问题
串的抽象数据类型
5.5 串的存储结构
1 串的顺序存储 2 串的链式存储
串的顺序存储
顺序存储实现:在顺序串中,每个字符依次存 放在一组连续的存储单元中。
串的顺序存储有两种方法:一种是每个存储单 元只存一个字符,称为非紧缩格式。第二种, 在每个存储单元中存放多个字符,称为紧缩 格式。
处理字符的速度高, 节省存储空间,
实现算法:(略)
操作六:strdelsub(s,i,j)
分析:删除s串中从第i个结点开始的连续j个结点 。
实现算法: (略)
操作七:strins(s1,i,s2)
分析:只需将s2链表插入到s1的第i个结点的位置。 实现算法:(略)
操作八:strrep(s,i,j,t)
分析:先删除s串中从第i个字符开始的连续j个结 点,再将t串插入到第i个结点的位置。
实现算法: (略)
操作七:strins(s1,i,s2)
分析:向s1中第i个位置插入s2,当两个串的长度之 和小于存储总长度时,需要将s1串中第i个字符后的所 有字符全部向后移动strlength(s2)个单元。
实现算法:(略)
操作八:strrep(s,i,j,t)
分析:s串中从第i个字符开始的j个连续字符将被t字 符串替换,这时s串中被替换部分后面的所有字符要相 应的移动连接在替换部分的后面,保证替换后的字符串 仍然是连续存储。
算法和数据结构
1
第一章 绪论 第二章 算法 第三章 线性表 第四章 栈和队列 第五章 串 第六章 树 第七章 图 第八章 查找 第九章 排序
算法和数据结构
2
串
羊肉串 一(串)葡萄 Lover, friend,
▪ Lover也有Over ▪ Friend也有end ▪ Believe也有lie
我画蓝江水悠悠, 爱晚亭上枫叶愁。 秋月溶溶照佛寺, 香烟袅袅绕经楼。
列。一般记作:s="a0
a1
a2…a
"
n-1
(n≥0)。
用双引号括起来的字符序列是串值,双引号是串标志
,串中所含字符个数n称为该串的长度(或串长)。
含零个字符的串称为空串,用Φ表示。字符在序列中的 序号为该字符在串中的位置。
串中任意个连续字符组成的子序列称为该串的子串 。包含子串的串相应地被称为主串。