数据结构 串 数组 广义表

概述

串:字符串的简称,串是一种特殊的线性表,特殊在其数据元素都是一个字符。

数组和广义表可以看做是线性表的扩充,即线性表的数据元素自身又是一个数据结构

1. 串 String

本结主要讲述:串的存储结构和基本操作
定义:主要是有0个或多个字符组成的序列。
存储结构:顺序存储和链式存储,但是串一般使用顺序存储结构。

顺序存储

typedef struct {
    char *ch;   //若为非空串,则按串长分配存储区,否则ch为null
    int length;  //串长度
}HString;

链式存储:

#define CHUNKSIZE 80;  //可有用户定义的块大小
typedef struct Chunk{
    char ch[CHUNKSIZE ];   
    struck Chunk *next;
}Chunk;

typedef struct {
    Chunk *head,*tail;//串的头尾指针
    int  curlen;   //串的当前长度
}LString;

串的存储密度=串值所占的存储位/实际分配的存储位 密度小,运算处理才方便;
串的模式匹配算法 子串的定位运算通常称为串的模式匹配或串匹配。
应用场景:搜索引擎、拼音检查、语言翻译、数据压缩等。
eg:
有两个字符串S-主串、T-子串(也称模式);

著名的模式匹配算法有两种:BF和KMP算法:

  1. BF算法:最简单直观的模式匹配算法,Brute-Force算法
int Indext(SString S,SString T,int pos){

        int i=pos,j=1;  //i指向主串,j指向子串
        while(S[0]>=i && j<=T[0]){

            if(S[i] == T[j]){
                ++i;
                ++j;
            }else{
                i=i-j+2;
                j=1;
            }
        }

        if(j>T[0]){
            return i-T[0];
        }else{
            return 0;
        }

}

主串长:N ,子串长:M
算法的时间复杂度:

  • 在最好的情况下(N+M)1/2即O(N+M)
  • 最坏的情况下:M(N-M+2)*1/2即O(N+M);

BF思路直观简明,但是时间复杂度高为:O(N+M),

2.KMP算法:由Kunth Morris Pratt共同设计所以称为KMP算法;
特点:无需回溯主串的指针,当模式串与主串中存在许多“部分匹配”的情况下才显得比BF快,所以BF至今任然被采用。
时间复杂度:O(m+n)

int Indext_KMP(SString S,SString T,int pos){

        //利用模式串T的next函数求T在主串S中第pos个字符之后的位置
        //其中,T非空,1<=pos<=Strlength(S)
        int i=pos,j=1;  //i指向主串,j指向子串
        while(S[0]>=i && j<=T[0]){

            if(j==0 || S[i] == T[j]){
                ++i;
                ++j;
            }else{
                j=next[j]; //模式串向右移动 
            }
        }

        if(j>T[0]){
            return i-T[0];
        }else{
            return 0;
        }

}

T的Next函数,算法时间复杂度为O(m)
void get_next(SString T,int next[]){
    int i = 1;
    next[1] = 0 ;
    int j = 0 ;
    while(i<T[0]){
        if(j == 0 || T[i] == T[j]){
            ++i;
            ++j;
            next[i] = j;
        }else{
            j=next[j];
        }
    }
}
image.png
上面的next算法有缺陷,下面有修正版的:

void get_nextval(SString T,int nextval[]){
    int i = 1;
    nextval[1] = 0 ;
    int j = 0 ;
    while(i<T[0]){
        if(j == 0 || T[i] == T[j]){
            ++i;
            ++j;
            if(T[i] != T[j]){
                nextval[i] = j;
            }else{
                nextval[i] = nextval[j];
            }
        }else{
            j=nextval[j];
        }
    }
}

next函数修正值:

image.png

2. 数组

本结主要讲述:数组的内部实现和特殊的二维数组如何实现压缩存储。
定义:由类型相同的数据元素构成的有序集合。

  • 一维数组可以看成线性表
  • 二维数组是数据元素为线性表的线性表;

数组一般不做插入和删除操作,所以一般采用顺序存储结构。

二维数组有两种存储方式:

  • 列序为主序的存储方式.
  • 行序为主序的存储方式。

Java、C、Basic、Pasical都是行序为主序的编程语言;
Fortran是以列序为主序的编程语言;

每个元素占L个存储单元,二维数组A[0m-1,0n-1](A[m,n])中任一元素aij的存储位置: LOC(i,j)=LOC(0,0)+(n x i+j)L;

由于计算各个元素存储位置的时间相等,所以存取数组中任一元素的时间也相等,即数组是一种随机存取结构。

矩阵的压缩存储
矩阵用二维数组来表示是最自然的。
压缩存储:指为多个值相同的元只分配一个存储空间,对0元不分配空间;
特殊矩阵:对值相同的元素或0元素在矩阵中的分布有一定规律;
主要有三种特殊矩阵:对称矩阵、三角矩阵、对角矩阵.
若n阶矩阵A中的元满足Aij=Aji,称为n阶对称矩阵。

可将n^2个元素压缩到n(n+1)/2个元的空间中。
设一维数组Sa[n(n+1)/2]作为矩阵A的存储结构,则sa[k]和矩阵元aij
的关系:

  • k=i(i-1)/2+j-1 条件(i < j)
  • k=j(j-1)/2+i-1 条件(i > j)

3. 广义表

本结主要讲述:广义表的概念和存储结构。 广义表是线性表的推广,也称为列表。 广泛的用于人工智能领域的表处理语言LISP语言。 记为:LS=(a1,a2,a3,a4…..an)

//广义表的头尾链表存储表示
typedef enum{
    ATOM,LIST
}ElemTag;

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

推荐阅读更多精彩内容

  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,735评论 0 19
  • 本文涉及更多的是概念,代码部分请参考之前写过的 2 篇博客 基于Javascript的排序算法基本数据结构和查找算...
    faremax阅读 1,211评论 0 2
  • VisuAlgo!一,Date Structure的核心技术是分解和抽象二,基本概念和常用术语 三,逻辑结构1,逻...
    斜杠青年许晏铭阅读 865评论 0 0
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,073评论 0 12
  • 格致创阅读 164评论 0 1