数据结构-串、数组和广义表

  1. 串是内容受限的线性表(规定其内容只能是字符)。
  2. (1)串:零个或多个任意字符组成的有限序列。
    (2)子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串。真子串是不包含自身的所有子串。
    (3)子串位置:子串第一个字符在主串中的位置。
    (4)串相等:当且仅当这两个串的长度相等并各个对应位置上的字符都相同时,这两个串才相等。所有空串都相等。
  3. 串也可分为链式存储结构(链串)和顺序存储结构(顺序串)。
  4. 串的顺序存储结构:元素的逻辑关系直接映射到存储位置,由逻辑关系的先后直接影响到存储位置的先后。
// 伪代码实现
#define MAXLEN 255
typedef struct{
  char ch[MAXLEN + 1]; // 存储串的一维数组(下标为0~255)
  int length;  // 串的当前长度
}SString // 将定义的串声明成SString这个名字
  1. 串的链式存储结构
    (1)优点:操作方便;缺点:存储密度较低
    (2)可以将多个字符存放在一个结点,以克服其缺点,即块链结构。
// 块链结构伪代码实现
#define CHUNKSIZE 80 // 块的大小可由用户定义
typedef struct Chunk{
  char ch[CHUNKSIZE];
  struct Chunk *next;
}Chunk;

typedef struct{
  Chunk *head,*tail; // 串的头指针和尾指针
  int curlen; // 串的当前长度
}LString; // 字符串的块链结构
  1. 由于实际情况中对串进行匹配、查找等操作较多,因此顺序串应用比较普遍。
  2. 串的模式匹配算法——BF算法
    (1)模式匹配算法定义:确定主串中所含子串(模式串)第一次出现的位置(定位)。
    (2)i为主串的指针,j为模式串指针。匹配失败:i=i-j+2(回溯),j=1(从头开始);匹配成功:返回i-t.length。
    (3)Index(S,T,pos)算法设计思想:将主串的第pos个字符和模式串的第一个字符比较,若相等,则继续逐个比较后续字符,若不相等,则从主串的下一字符开始,重新与模式串的第一个字符比较。直到主串的第一个连续子串字符与模式串相等,则返回值为S中与T匹配的子序列的第一个字符的序号,即匹配成功。否则匹配失败,返回值0。
    (4)BF算法描述:
// 主串从pos位置开始匹配模式串
int Index_BF(SString S, SString T,int pos){
  int i=pos, j=1
  while(i<=S.length && j<T.length) {
      if(s.ch[i]==t.ch[j]) {++i; ++j;} // 主串、子串依次匹配下一个字符
      else {i=i-j+2;j=1} // 主串、子串指针回溯重新开始下一次匹配
  }
  if (j>T.length) return i-T.length;
// 返回匹配的第一个字符的下标
  else return 0; // 模式匹配不成功
}

(5)算法时间复杂度
若n为主串长度,m为子串长度,算法复杂度为O(n*m)。

  1. 串的模式匹配算法——KMP算法
    (1)优点:主串i的指针i不必回溯,使算法复杂度降低到O(n+m)。
    (2) 定义next[j]函数,表明当模式中第j个字符与主串中相应字符失配时,需要和主串中重新匹配的字符的位置。
    其中next[j]的取值情况如下图:


    image.png

    (3)KMP算法描述

// KMP算法描述
int Index_KMP(SString S, SString T, int pos) {
  i=pos,j=1;
  while(i<=S.length && j<T.length) {
      if(j==0||s.ch[i]==t.ch[j]) {++i; ++j;} // 与BF一样,主串、子串依次匹配下一个字符
      else
          j=next[j];  // i不变,j后退,后退的值为用上图方法所求的next[j]
    }
  if(j>T.length) return i-T.length; // 匹配成功
   else return 0; // 匹配不成功返回0
}

(4)next函数的改进


image.png

数组

  1. 定义:
    (1)数组:具有相同类型的数据元素按一定格式排列起来。
    (2)一维数组:若线性表中的数据元素为非结构的简单元素,则成为一维数组。一维数组是定长的线性表。
    (3) n维数组:若n-1维数组中的元素又是一个一维数组,则称作n维数组。
    (4)结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。
  2. 数组的顺序存储
    (1)结构固定——维数和维界不变,一般不做插入和删除操作,故一般采用顺序存储结构来表示。
    (2)二维数组的存储位置表示
    以行列为主序:设数组开始存储位置LOC(0,0),每行有n个元素,存储每个元素需要L个存储单元。则数组元素a[i][j]的存储位置是:LOC(i,j)=LOC(0,0)+(ni+j)L。
    (3)n维数组的存储位置表示
    image.png
  3. 特殊矩阵的压缩存储
    (1)将矩阵描述为一个二维数组,可以对其进行随机存取,且存储的密度为1。但常规方法不适合某种特殊矩阵,比如有很多元素值相等的矩阵等。
    (2)定义:
    压缩矩阵:若多个数据元素的值都相等,则只分配一个元素值的存储空间,且零元素不占存储空间。
    稀疏矩阵:矩阵中零元素的个数较少(一般小于5%)
    (3)对称矩阵存储方法
    ①只存储下(上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间。(元素空间用等差数列求和运算)
    ②以行序为主序将元素存放在一个一维数组SA[n(n+1)/2]中。


    image.png

    (4)三角矩阵存储方法
    ①三角矩阵定义:对角线以下(或者以上)的数据元素(不包括对角线)全部为常数C。
    ②存储方法:重复元素C共享一个元素存储空间,共占用n(n+1)/2+1个元素空间。


    image.png

    (5)对角矩阵存储方法
    ①对角矩阵定义:在n x n的方阵中,
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342