字符串、数组和特殊矩(数据结构)
第四章 字符串、数组和特殊矩阵
4.1字符串
- 字符串是由0个或多个字符构成的有限序列。
- 串中所含字符串的个数n称为字符串的长度;当n=0时。字符串为一空串
- 两个字符串相等,当且仅当两个串的长度相等,并且各个对应位置的字符都相等。
- 若S=“ ”,此时s由一个空格字符组成,其长度为1,它不等价于空串,因为空串的长度为0.
字符串是一种特殊的线性表,由于线性表有顺序存储和链式存储两种基本的存储结构,因此字符串也有两种基本的存储结构:顺序串和链式串
4.2字符串的模式匹配
寻找字符串p在字符串t中首次出现的位置称为字符串的匹配模式,其中,称p为模式,t为正文,t的长度远远大于p的长度。
4.2.1朴素的模式匹配算法
基本思想:用p中的每个字符去与t中的字符一一比较,其中,n代表正文t的长度,m为模式p的长度。如果t1=p1,t2=p2,…,tm=pm,则模式匹配成功,此时返回起始位置即可;否则,将p向右移动一个字符串的位置,重新开始比较。(就是一个一个比较,比较不到再找下一个)。
时间复杂度为O(n*m)
算法如下:
int index(seqstring p,seqstring t)
{int i,j,succ;i=0;succ=0 /*用i扫描正文t,succ为匹配成功的标志*/while((i<=t.length-p.length)&&(!succ)){j=0;succ=1; /*用j扫描模式p*/while((j<=p.length-1)&&succ)if(p.str[j]==t.str[i+j])j++;else succ=0;i++;}if(succ)return (i-1);elsereturn (-1);
}
4.2.2快速模式匹配算法(KMP算法)
算法的时间复杂度为O(n+m)
KMP算法基本思想如下:
假设以i和j分别指示正文i和模式p中正待比较的字符,令i、j的初值为0;若在匹配过程中ti=pj,则i与j分别加1;否则i不变,而j退到next的位置继续比较(即j=next【j】);若相等,则指针各自增加1;否则j再退到下一个next【j】值的位置,以此类推,直至下列两种可能之一出现:
- j退到某个next值时,ti与pj字符比较相等,则i,j指针各自增加1后各自比较
- j退到-1(即模式的第一个字符“失配”),此时需要将正文指针i向右滑动一个位置,即从正文的下一个字符ti+1起和模式p重新从头开始比较。
4.3数组
数组本身也是线性表的推广,数组的每个元素由一个值和一组下标确定,在数组中,对于每组有定义的下标都存在一个与之相对应的值。
- 当把二维数组看作是线性表时,他的每一个结点又是一个向量(一维数组)。
- 对于三维数组,也可以将它看成是一个线性表。当把三维数组看成是线性表结构时,它的每个元素均由一个二维数组构成。例如,对于三维数组A [m][n][l],我们可以把它看成是一个由m个元素构成线性表,线性表的每个元素是一个n*l的矩阵。
数组是一个具有固定数量数据元素的有序集合。由于数组本身的大小是固定的,因而对数组本身不能执行删除和添加操作,通常除了数组初始化和销毁数组的操作外,只有访问数组元素和改变数组元素的值这两种运算。
4.3.3 数组的存储顺序的实现
存储空间中存储单元是一维的结构,故必须约定一个元素的存储次序,以方便将来对数组元组的存取。
主要分为两大类
- 按行优先存储
- 按列优先存储
所谓按行优先存储,其基本思想是:从第一行的元素开始按顺序存储,第一行的元素存储完成后,再按顺序存储第2行的元素,然后依次存储第3,…行,直到最后一行所有的元素存储完毕为止。按列存储的基本思想也是一样的。
一个栗子:
对于二维数组A [m] [n] :
假设数组中每一个元素占用L个存储单元,若考虑按行优先存储的方式,则上述A数组中任何一个元素aij的存储位置可以按以下公式确定:
*address(aij)= address(a00)+(i * n+j)L
address(a00)表示数组A的首地址,即第一个元素a00的地址,i*n+j表示在元素aij之前已经存放了完整的前i行中的所有元素以及第i+1行的前j个元素。
若按列优先:则数组中任何一个元素aij存储位置的地址计算公式为:
address(aij)= address(a00)+(j * m+i) * L
4.4特殊矩阵
在数值分析的过程中经常遇到一些特殊的矩阵,他们的阶数很高,同时矩阵中包含许多相同的值或零,如对称矩阵、三角矩阵、带状矩阵和稀疏矩阵等。
压缩存储
:多个相同值的结点只分配一个存储空间,值为零的结点不分配内存空间。
4.4.1对称矩阵的压缩存储
如果矩阵的行数和列数相等,则称该矩阵为方阵。若n*n阶的方阵A满足:
aij=aji(0<= i <=n-1,0<=j <=n-1)
则称矩阵A为对称矩阵。
在存储时只需要存储对角线以上或对角线以下的部分,未存储部分的元素可以利用元素之间的对称性来访问。
若采用按行优先的存储方式,则数组A对角线以下部分中任何一个数组元素aij(i>=j)的存储地址为:
- **address (aij) = address(a00) + [ (1+2+…+i) + j ]L = address(00) + [ i * (i+1)/2 + j ]L ( i>=j )
- **address (aij) = address(a00) + [ (1+2+…+i) + j ]L = address(00) + [ j * (j+1)/2 + i]L (i<j)
简单来说。就是乘以大的,加上小的。
4.4.2三角矩阵的压缩存储
这类矩阵,其对角线以下(或以上)部分元素值均为0,故称为上三角矩阵(或下三角矩阵)。
1、下三角矩阵
对矩阵A只需存储对角线以下的部分即可。还是按行优先存储。
则A中下三角部分任何一个元素aij(i>=j)压缩存储后的地址计算公式为:
address(aij)=address(a00)+【i * (i+1) /2 +j】 L*
与对称矩阵不同的是,当 i < j 时,aij的值为0 ,其没有对应的存储空间
2、上三角矩阵
矩阵A为n*n的矩阵
采用行优先存储 ,则矩阵A中任意一个元素aij的存储地址为:(i<=j)
*address(aij)=address(a00)+【(n+(n-1)+(n-2)+…+(n-(i-1)))+j-1】L
即address(aij)= address(a00)+【i*n- (i-1) * i/2+j-i】*L
4.4.3带状矩阵的压缩存储
4.5稀疏矩阵
如果一个矩阵中很多元素的值为零,即零元素的个数远远大于非零元素的个数时,称该矩阵为稀疏矩阵。
根据存储时的附加信息不同,稀疏矩阵的顺序存储方法包括:三元组表示法、带辅助行向量的二元组表示法和伪地址表示法,其中三元组表示法最常用。
矩阵B的第一行体现了稀疏矩阵A的行数、列数及所含非零元素的总个数。接下来的每一行均代表A中一个非零元素的三元组表示。
字符串、数组和特殊矩(数据结构)相关推荐
- 数组和广义表 - [数据结构]
2005-09-07 数组和广义表 - [数据结构] 第五章 数组和广义表 --非线性数据结构 5.1 数组的定义和运算 ☆二维数组的逻辑结构形式定义为: 2_Array=( D, R ) 其中 D= ...
- [分类整理IV]微软等100题系列V0.1版:字符串+数组面试题集锦
微软等100题系列V1.0版整理IV:字符串+数组面试题集锦 July 2010年12月30日 第4章 字符串+数组面试题 在微软等100题系列V0.1版中,此类字符串+数组的问题,占了足足22道 ...
- C++ 字符串指针与字符串数组
在做面试100题中第21题时,发现char *astr="abcdefghijk\0";和char astr[]={"abcdefghijk"};有点区别,以前 ...
- python查找公共前缀_Python实现查找字符串数组最长公共前缀示例
本文实例讲述了Python实现查找字符串数组最长公共前缀.分享给大家供大家参考,具体如下: 编写一个函数来查找字符串数组中的最长公共前缀. class Solution: def longestCom ...
- python定义字符串数组_python数组声明
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 如何在python? 我无法在文档中找到对数组的任何引用... 我正在制作一个小 ...
- Kiner算法刷题记(二十一):字典树与双数组字典树(数据结构基础篇)
字典树与双数组字典树(数据结构基础篇) 系列文章导引 系列文章导引 开源项目 本系列所有文章都将会收录到GitHub中统一收藏与管理,欢迎ISSUE和Star. GitHub传送门:Kiner算法算题 ...
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...
- LeetCode简单题之检查两个字符串数组是否相等
题目 给你两个字符串数组 word1 和 word2 .如果两个数组表示的字符串相同,返回 true :否则,返回 false . 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串. ...
- c语言字符串数组分配没错,【字符串数组面试题】面试问题:C语言基础小结… - 看准网...
26. 位段:指定结构体中成员变量所占的位数(以位的形式紧凑存储) unsigned char/int aaa:1 这里只能是unsigned char/int类型 27. 指针数组:int *p[1 ...
- react项目---基本语法字符串数组(6)
在我们编写html代码的过程中,字符串数组是会经常遇到的,如何来正确的处理字符串数组在项目中也凸显的十分的重要,不说这些冠冕堂皇的废话了,直接来看内容 字符串处理 首先我们来看如何把一个字符串显示到页 ...
最新文章
- 全部开课!加入学习群一起进步(附点云、多传感器融合、SLAM、三维重建课程)...
- python自增_python – 类实例的自动递增ID
- jvmti_从javaagent迁移到JVMTI:我们的经验
- 【后缀自动机】SPOJ 1812-LCSII
- oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...
- 兄dei,Python数据竞赛和5万现金奖励了解一下
- html5触边反弹,第四章课件.PPT_数字电子技术基础(ppt课件)_ppt_大学课件预览_高等教育资讯网...
- 文件I/O实践(2) --文件stat
- 吴恩达课程及视频笔记汇总
- 一文搞定Redis五大数据类型及使用场景
- 使用win10 hyper-v安装linux系统
- Openwrt 路由器挂载摄像头教程
- 无线渗透----扫描附近WiFi(windows系统)
- 斐讯 http文件服务器,斐讯刷机教程(硬件版本A5)
- 天宇优配|医药股反弹受阻 公募乐观态度不改
- php计算距离商家距离,php 计算3公里内所以用户的距离
- gfortran版本
- CSS把图片设置为背景
- 微信平台公众号推送文章撰写建议
- android危险权限列表