数据结构之串和数组基本知识和问题
★★ 串
1. 串(又称字符串)是一种特殊的线性表,它的每个结点仅由一个字符组成。
从数据结构的观点来说,串是一种特殊的线性表;但就数据类型而言,串不是线性表。
**串( String )是零个或多个字符组成的有限序列。 一般记为s= “ a0a1a2...an-1 ”(n≥0,下标从0开始),其中s是串的名,用双引号括起来的字符序列是串的值。
将串值括起来的单引号本身不属于串 , 它的作用是避免串与常数或与标识符 混淆。
2. 长度为零的串称为空串( Empty String ),它不包含任何字符。 仅由一个 或多个空格组成的串称为空白串
串的长度:串中字符的数目n(n ≥ 0)。
3. 串中任意个连续字符组成的子序列称为该串的子串。包含子串的串相应地称为主串
** ①空串是任意串的子串** ②任意串是其自身的子串
字符在串中的位置:字符在序列中序号。 子串在主串中的位置:子串的第0个字符在主串中的位置。例如:a="BEI",b= "JING ",c="BEIJING",d="BEI JING" //串长分别为3,4,7,8,且a,b都是c,d的子串。 两串相等:两个串对应位置的字符相等且长度相等。 两个串的比较:从第一个字符开始,每个字符按照ASCII比较,整体按照英语字典的顺序(前小,后大)。
串的逻辑结构和线性表的区别:
-
串的数据对象约束为字符集。
-
线性表的基本操作大多以“单个元素”为操作对象,而串的基本操作通常以“串的整体”作为操作对象。
串的模式匹配算法(模式匹配(Pattern Matching) 即子串定位运算(Index函数)—)
算法目的:确定主串中所含子串第一次出现的位置(定位) ——即如何实现Index(S,T,pos)函数
BF算法 (又称古典的、经典的、朴素的、穷举的) KMP算法 (特点:速度快)
初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(s) 操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。
BF算法设计思想:
将主串的第pos个字符和模式的第1个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串的下一字符(pos+1)起,重新与第一个字符比较。 直到主串的一个连续子串字符序列与模式相等 。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。 否则,匹配失败,返回值 0 .
数组的顺序表示和实现 用一组连续的存储单元存放数组的数据元素。 有两种顺序映象的方式: 1)以行序为主序的存储方式(低下标优先) 2)以列序为主序的存储方式(高下标优先) 以“行序为主序”的存储映象介绍: 设二维数组Am中每个元素占L个存储单元,则任一元素ai,j 的存储位置: LOC(i,j) = LOC(0,0) + (n×i+j)×L
“数组的处理比其它复杂的结构要简单”
对的。因为: ① 数组中各元素具有统一的类型; ② 数组元素的下标一般具有固定的上界和下界,即数组一旦被定义,它的维数和维界就不再改变。 ③数组的基本操作比较简单,除了结构的初始化和销毁之外,只有存取元素和修改元素值的操作
三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、列下标和元素值
若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种说法正确吗?
肯定不正确! 除了: (1) 每个元素的行下标和列下标互换(即三元组中的i和j互换); 还应该 (2) T的总行数mu和总列数nu与M值不同(互换); (3) 重排三元组内元素顺序,使转置后的三元组也按行(或列)为主序有规律的排列。 难点在3可以使用 压缩转置或者 (压缩)快速转置 解决思路:只要做到 将矩阵行、列维数互换 将每个三元组中的i和j相互调换 重排三元组次序,使mb中元素以N的行(M的列)为主序