数据结构系列3------字符串

1:基本概念

串是字符串的简称。其结构也是一种特殊的线性表。由零个或零个以上的字符组成的优先序列,一般记为:

s="a1a2a3….an"(n≥0)

其中S为串名,n为串长度,代表字符串有n个字符,字符可以是数字、字母或其它ASCII字符,字符串用一对双引号包含,双引号本身不属于串,仅作为标识。

高级语言对字符串的操作进行了一定程度的封装。比如:赋值、求串长、串合并、插入、删除、替换、定位等。下面写几个例子。

1):字符串用事先给定的字母映射表进行加密,如:

a b c d e f g h i j k l m n o t y

q w e r t y u i o p a s d f g h j

按以上的对应关系,原字符串yamat 后的串应该是:jqdqh

如代码所示:

            var list = "abcdefghijklmnoty";

            var keys = "qwertyuiopasdfghj";

            string str = "yamat";

            var strKeys = "";

            for (int j = 0; j < str.Length; j++)

            {

                if (list.Contains(str[j]))

                    strKeys += keys.Substring(list.IndexOf(str[j]), 1);

            }

            Console.WriteLine(strKeys);

            Console.ReadLine();
 

2:字符串的存储

计算机的编址方式决定CPU访问存储器的存储单位大小,通常有两种存取方法,一种按字节编址(以字节为存取单位)和按字编址(以字为存取单位)。按字节的方式由于一个字符占用一个字节,因此,字符串中相邻的字符都是顺序存放在相邻的字节中,这样既节约空间,处理又方便,如图:

image
当计算机按字节为单位编址时,一个存储单元刚好存放一个字符,字符串中相邻的字符顺序存储在地址相邻的存储单元中;当计算机以字为单位编址时,一个存储单元由若干个字节组成。这时,顺序存储有紧凑格式和非紧凑格式两种存储方式。

1:紧凑型

紧凑型在存储单元中尽量多存储字符,例如:假设计算机的字长为32位,既4B,s=yamat computer,存储结构如图:

image 这种格式的优点是空间利用率高,缺点是处理字符效率低。

2:非紧凑型

非紧凑型是一个存储单元只存放一个字符,存储中多余的空间不用。如图:

image

优缺点刚好和紧凑型相反,实际运用中具体情况而定。

因为net中string默认最大为2G,所以一般情况不会出现溢出的情况。

3:字符串的匹配

字符串的匹配最原始的算法是BF(Brute-Force)算法,其思想是:从目标字符串的第一个字符开始和模式串的第一个字符进行匹配,若相同,则依次比较后续,否则从目标字符串第二个字符重新开始匹配,重复此过程。

假设目标字符串s="yamatamain",模式串t="ai"。C语言实现的算法如下:

int BF(string *s,string *t)

{

    int i,j;

    i=j=0;

    while((i<s->len)&&(j<t->len))

    {

        if(s->data[i]==t->data[j])

        {

            i++;j++;

        }

        else

        {

            i=i-j+1;j=0;

        }    

    }

    if(j>=t->len)

        return(i-t->len);

    else

        return 0;

}
最好的情况下,每次都不成功的匹配都是t的第一个字符和中相应字符比较时不同,此时的总共比较次数为i-1+m,要匹配成功,s的开始位置只能是1~n-m+1。再假设在这n-m+1个开始位置上,匹配成功的概率是一样的,因此最好的情况下该算法的平均时间复杂度为O(n+m).
最坏的情况下,第i次成功,前面i-1都不成功,每趟比较m次,第i次成功也比较了m次,所以工比较i*m次,平均次数为:m(n-m+2)/2。因为n永远大于m,所以最坏情况下,时间复杂度为O(n*m)。
 

你可能感兴趣的:(数据结构)