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)。




本文转自:http://www.cnblogs.com/YamatAmain/archive/2013/05/15/3080793.html

转载于:https://www.cnblogs.com/sunnysea/p/3711959.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值