zoukankan      html  css  js  c++  java
  • 5-0、6-0 串,数组和广义表


    title: 数据结构 | 串,数组和广义表
    date: 2019-12-13 09:53:17
    tags: 数据结构


    串的基本概念,存储方式、模式匹配算法
    广义表的表长、表头表尾、链式存储

    串是以字符为元素的线性表
    4.1 串类型的定义
    4.2 串的表示和实现
    4.2.1 定长顺序存储表示
    4.2.2 堆分配存储表示

    4.3 串的模式匹配算法

    串类型的定义

    基本概念

    (字符串 string):
    由零个或多个字符组成的有限序列
    记为: s =‘a1a2...an’ (n ≥ 0)
    ai(1≤i≤n)是字母,数字或其它字符

    串名: s为串名

    串值:‘a1a2…an’为串值

    长度:n称为串的长度

    空串:n=0的串称为空串(Null string)记为:Ф

    空白串:通常将仅由一个或多个空格组成的串称为空白串(Blank String)

    注意:空串和空白串的不同,例如“ ”和“”分别表示长度为1的空白串和长度为0的空串。
    子串:串中任意个连续字符组成的序列;

    位置:字符在序列中的序号

    子串的位置:子串第一个字符在主串中的位置

    ADT

    ADT String {
    数据对象:D = {ai |  ai∈CharacterSet,i=1,2,...n, n>=0}
    数据关系: R1= {<ai-1., aj>| ai ∈D, i=2,...n}。
    基本操作:
         StrAssign(&T,chars)
    	初始条件: chars是字符串常量。
    	操作结果: 生成一个其值等于chars的串T。
    	StrCopy(&T,S)
    	初始条件: 字符串S已经存在。
    	操作结果: 由串S复制得串T。
    	StrEmpty (S)
    	初始条件: 字符串S已经存在。
    	操作结果: 若S为空串,则返回TRUE,否则返回FALSE。
    	StrCompare(S,T)
    	初始条件: 字符串S和T存在。
    	操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;否则返回值<0。
    	StrLength(S)
    	初始条件: 字符串S已经存在。
    	操作结果: 返回串S元素个数,称为串的长度。
    	ClearString(&S)
    	初始条件: 字符串S已经存在。
    	操作结果: 将串S清为空串。
    	Concat(&T,S1,S2)
    	初始条件: 字符串S1,S2已经存在。
    	操作结果: 用T返回由串S1和S2联结而成的新串。
    	Substring(&Sub,S,pos,len)
    	初始条件: 串S存在,1<=pos<=S的长度,0<=len<=S的长度-pos+1。
    	操作结果: 用Sub返回串S的第pos个字符起长度为len的子串。
    	Index(S,T,pos)
    	初始条件: 串S和T存在,T是非空串,1<=pos<=S的长度。
    	操作结果: 若主串S中存在和串T相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则返回0。
    	Replace(&S,T,V)
    	初始条件: 字符串S,T,V已经存在,T是非空串。
    	操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串。
    	StrInsert(&S,pos,T)
    	初始条件: 字符串S,T存在,1<=pos<=S的长度+1。
    	操作结果: 在串S的第pos个字符之前插入串T。
    	StrDelete(&S,pos,len)
    	初始条件: 串S存在,1<=pos<=S的长度-len+1。
    	操作结果: 从串S中删除第pos个字符起长度为len的子串。
    	DestroyString(&S): 把存在的串S销毁。
    }ADT String
    

    串类型的最小操作子集

    下面5种操作构成最小操作子集:
    串赋值 StrAssign;
    串比较 StrCompare;
    求串长 StrLength;
    串联结 Concat;
    求子串 Substring;

    串的表示和实现

    顺序表示

    定长顺序表示

    用连续的存储单元存储串,存储单元的长度固定。

    堆分配存贮表示

    特点:仍用连续的存储单元存储串,但存储空间是在程序执行过程中动态分配而得。

    链式表示

    块链存贮表示

    一个结点的数据域不仅放一个数据元素(字符),而是放多个数据元素。

    串的模式匹配算法

    求子串位置的定位函数:子串的定位操作通常称作串的模式匹配(其中T被称模式串),是各种串处理系统中最重要的操作之一。

    算法分析

    设n = StrLength(S);m = StrLength(T);

    最好情况的复杂度为O(n+m);
    最坏情况的复杂度为O(n*m)。

    KMP算法

    模式匹配的一种改进算法
    KMP算法的改进在于:

    • 每一趟匹配过程中出现字符比较不等时,不需要回朔i指针
    • 只要利用已经“部分匹配”结果,调整j指针,即将模式向右滑动尽可能远的一段距离,来个提高算法效率.

    数组和广义表

    定义

    数组可以看成是一种特殊的线性表,即线性表中数据元素本身也是一个线性表。

    ADT

    ADT Array{
    	数据对象:D={aj1j2…jn|n(>0)称为数组的维数, 
    			     bi 是数组第i维的长度
                  	 ji  是数组元素的第i维下标,
                         ji = 0, …, bi – 1, i = 1, 2, …, n,
    			         aj1j2…jn ∈ ElemSet }
    	数据关系:R =  {R1, R2, … Rn}
    		         Ri = { <a j1…ji…jn, aj1…ji+1…jn>|
    				0≤jk ≤ bk-1, 1 ≤k ≤n 且k ≠i, 
    				0 ≤ji ≤bi –2,
    			         aj1…ji…jn, aj1…ji+1…jn ∈ D, i = 2, …, n }
    	基本操作:
            InitArray(&A,n,b1,…,bn );  // 初始化
    		DestroyArray(&A );	            // 销毁
    		Value( A, &e,  i1, i2, … in);	// 取值
    		Assign( &A, e, i1, i2, … in);	// 赋值
    }// Array
    

    数组的顺序存储结构

    主序存放

    • 按列序为主序存放
    • 按行序为主序存放

    n维数组的存储地址计算公式

    公式及例题

    矩阵的压缩存储

    • 矩阵: 二维数组
    • 特殊矩阵: 大量重复元素或大量0元素
    • 稀疏矩阵: 大量0元素
    • 压缩存储: 重复元素只分配一个存储空间,0元素不分配存储空间

    对称矩阵


    对称阵例子

    三角矩阵

    下三角矩阵

    对角矩阵

    稀疏矩阵

    • 定义:非零元素较少,且分布没有一定规律的矩阵
    • 压缩存储原则:只存矩阵的行列维数和每个非零元素的行列下标及其值

    通常稀疏因子<0.05时称为稀疏矩阵

    稀疏矩阵的压缩存储方法

    顺序存储结构:三元组表
    链式存储结构:十字链表

    广义表

    定义

    • 广义表:LS = ( α1, α2, … αn)
    • αi 可以是单个数据元素,也可以是广义表。
    • 广义表是由n个数据元素构成的一个表,其数据元素可以是单个数据元素,也可以是一个广义表。
    • n 长度;
      若αi为单个元素,称为原子;否则子表
      α1为表头,其余元素组成的表为表尾

    表长

    最大括号内的逗号数+1
    特别地,E = ( a, E ); 递归表,长度为2

    广义表的链式存储结构

    广义表不能使用顺序存储,只能链式存储。

  • 相关阅读:
    wx-charts 微信小程序图表 -- radarChart C# .net .ashx 测试
    C# dev SearchLookUpEdit 和 RepositoryItemSearchLookUpEdit 测试
    C# Dev XtraReport 简单测试
    SQL查询,关联查询的区别 (LEFT JOIN 、LEFT OUTER JOIN、INNER JOIN)
    NPOI 读取Excel文件
    C# 截屏
    C# 程序运行进度显示Lable
    gridcontrol 添加行删除行
    C# 任务 数据加载不影响其他操作
    ChartControl ViewType.Pie3D 用法测试
  • 原文地址:https://www.cnblogs.com/nightland/p/13504407.html
Copyright © 2011-2022 走看看