串的逻辑结构
字符串:零个或多个字符组成的有限序列。
字符串中任意个连续字符组成的子序列称为该串的子串。
子串第一个字符在主串中的序号称为子串在主串中的位置。
非空串通常记为:
S=" s1 s2…… sn "
其中:S是串名,双引号是定界符,双引号引起来的部分是串值 ,si(1≤i≤n)是一个任意字符。
微机上常用的字符集是标准ASCII码,由 7 位二进制数表示一个字符,总共可以表示 128 个字符。扩展ASCII码由 8 位二进制数表示一个字符,总共可以表示 256 个字符,足够表示英语和一些特殊符号,但无法满足国际需要。Unicode由 16 位二进制数表示一个字符,总共可以表示 216个字符,即6万5千多个字符,能够表示世界上所有语言的所有字符,包括亚洲国家的表意字符。为了保持兼容性,Unicode字符集中的前256个字符与扩展ASCII码完全相同。
串的数据对象约束为某个字符集
串的比较:通过组成串的字符之间的比较来进行的。
给定两个串:X="x1x2…xn"和Y="y1y2…ym",则:
1. 当n=m且x1=y1,…,xn=ym时,称X=Y;
2. 当下列条件之一成立时,称X<Y:
⑴ n<m且xi=yi(1≤ i≤n);
⑵存在k≤min(m,n),使得xi=yi(1≤i≤k-1)且xk<yk。
串的抽象数据类型定义
⑴ StrLength (s):求串s的长度。
⑵ StrAssign (s1, s2):赋值,将s2的值赋值给串s1。
⑶ StrConcat (s1, s2, s):连接,将串s2放在串s1的后面连接成一个新串s。
⑷ SubStr (s, i, len):求子串,返回从串s的第i个字符开始取长为 len 的子串。
⑸ StrCmp (s1, s2):串比较,若s1=s2,返回0;若s1<s2, 返回-1;若s1>s2, 返回1。
⑹ StrIndex (s, t):定位,返回子串t在主串s中首次出现的位置。若t不是s的子串,则返回0。
⑺ StrInsert (s, i, t):插入,将串t插入到串s中的第i个位置。
⑻ StrDelete (s, i, len):删除,在串s中删除从第i个字符开始的连续len个字符。
⑼ StrRep (s, t, r):替换,在串s中用串r替换所有与串t相等的子串。
模式匹配:给定主串S="s1s2…sn"和模式T="t1t2…tm",在S中寻找T的过程称为模式匹配。如果匹配成功,返回T 在S中的位置,如果匹配失败,返回0。
基本思想:从主串S的第一个字符开始和模式T 的第一个字符进行比较,若相等,则继续比较两者的后续字符;否则,从主串S的第二个字符开始和模式T的第一个字符进行比较,重复上述过程,直到T 中的字符全部比较完毕,则说明本趟匹配成功;或S中字符全部比较完,则说明匹配失败。
模式匹配问题的特点:
⑴ 算法的一次执行时间不容忽视:问题规模通常很大,常常需要在大量信息中进行匹配;
⑵ 算法改进所取得的积累效益不容忽视:模式匹配操作经常被调用,执行频率高。
给定两个字符串S和T,在主串S中寻找子串T的过程称为模式匹配。T称为模式。
BF算法:int BF(char S[ ], char T[ ])
{
i=0; j=0;
while (S[i]!='\0'&&T[j]!='\0')
{
if (S[i]==T[j]) {
i++; j++;
}
else {
i=i-j+1; j=0;
}
}
if (T[j]=='\0') return (i-j+1);
else return 0;
}
和int BF(charS[ ], char T[ ])
{
i=0; j=0;start=0;
while (S[i]!='\0'&&T[j]!='\0')
{
if (S[i]==T[j]) {
i++; j++;
}
else {
start++; i=start; j=0;
}
}
if (T[j]=='\0') returnstart;
else return 0;
}
数组是由类型相同的数据元素构成的有序集合。
数组一般不执行插入和删除操作。
数组的基本操作:存取和修改。这两种操作在根本上对应一种操作,即寻址。
特殊矩阵:在矩阵中有很多值相同的元素并且它们的分布有一定的规律。
稀疏矩阵:矩阵中有很多零元素。
压缩存储的基本思想:为多个值相同的元素只分配一个存储空间。对零元素不分配存储空间。