数据结构与算法学习笔记串和数组

Posted ChinaManor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法学习笔记串和数组相关的知识,希望对你有一定的参考价值。

串和数组

1:
数据结构与算法
串和数组

2:

目标
数组
本章目标
能够说出串的基本概念及其抽象数据类型的描述

了解串的存储结构

了解串的基本能操作

了解数组的定义、操作和存储结构

了解矩阵的压缩存储

3:
01
第一节:串
The first chapter
内容展示

4:
目标

数组
1 串
1.1 串的概念
串的基本概念:
1、串:
是由零个或多个字符组成的有限序列。
一般记为s= “a1a2…an”, 其中s为串名,引号括起来的字符序列是串值。
2、串的长度:
串中字符的个数。
3、空串:
长度为0的串,即不包含任何字符的串,表示为""。
4、空白串:
由一个或多个空白字符组成的串,如: " "。
注意:空串与空白串的区别
串也是一种特殊的线性表。

5:
报告人:XXX
目标

数组
1 串
1.1 串的概念
5、子串:

主串:
串中任意个连续字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
6、字符在串中的位置:

子串在主串中的位置:
如:s1= “cdababef”, s2= “ab” s3=“a”
字符在串中的序号值。
子串在主串中出现时第一个字符在主串中的序号值。
注意:空串是任意串的子串,任意串是其自身的子串。
串的基本概念:

6:
报告人:XXX
目标

数组
1 串
1.1 串的概念
串的基本操作:
clear( )
1)串的置空操作:
isEmpty( )
2)串的判空操作:
length( )
3)求串的长度操作:
4)取字符元素操作:
5)截取子串操作:
charAT(index)
substring( bengin,end )
6)插入操作:
insert(offset,str )
delete(begin,end )
7)删除操作:
concat(str )
8)串的连接操作:
compareTo(str )
9)串的比较操作:
10)子串定位操作:
indexOf(str,begin)

7:
报告人:XXX
目标

数组
1 串
1.2 串的存储结构
串的存储结构:
顺序存储结构

链式存储结构

8:
报告人:XXX
目标

数组
1 串
1.2 串的存储结构
串的顺序存储结构:
串的顺序存储结构与线性表的顺序存储结构类似,可以采用一组地址连续的存储单元来存储串字符序列。顺序存储的串称为顺序串,顺序串的类型描述如下:
public class SeqString implements IString{
private char[] strvalue; //存放串值
private int curlen; //存放串的长度

}

9:
报告人:XXX
目标

数组
1 串
1.2 串的存储结构
串的顺序存储结构:
I a m a b o y

10:
报告人:XXX
目标

数组
1 串
1.2 串的存储结构
串的链式存储结构:

11:
报告人:XXX
目标

数组
1 串
1.3 串的模式匹配
什么叫模式匹配:
这是串的一种重要操作,很多软件,若有“编辑”菜单项的话,则其中必有“查找”子菜单项。
设s,t 是两个串,s= “s1s2…sn”,t= “t1t2…tm”(0≤m≤<n)在s串中寻找等于t的子串的过程称为模式匹配。(即,子串的定位操作)
其中:s:主串, t:模式串
用一个函数实现:
匹配成功:返回t在s中start位置后首次出现的序号
匹配不成功:返回-1

模式匹配是各种串处理系统中最重要的操作之一

12:
报告人:XXX
目标

数组
1 串
1.3 串的模式匹配
模式匹配算法:
1、简单算法
(Brute-Force模式匹配算法 )
2、KMP算法
(D.E.Knuth, V.R.Pratt,J.H.Morris)

13:
报告人:XXX
目标

数组
1 串
1.3 串的模式匹配
BF算法:
BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法 BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配, 若相等,则继续比较S的第二个字符和 T的第二个字符; 若不相等,则比较S的第二个字符和T的第一个字符, 依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。

简而言之,就是暴力循环
http://interview.wzcu.com/%E7%AE%97%E6%B3%95/BF%E7%AE%97%E6%B3%95%E5%92%8CKMP%E7%AE%97%E6%B3%95.html

14:
报告人:XXX
目标

数组
1 串
1.3 串的模式匹配
KMP算法:
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。 KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)

15:
第二节数组

The second chapter
内容展示
02

16:
目标
数组

2 数组
2.1 数组的基本概念
数组的基本概念:
数组是n(n≥1)个具有相同类型的数据元素a0,a1,…,an-1构成的有限序列,并且这些数据元素占用一片地址连续的内存单元。其中:n称为数组的长度。
一维数组可以看成一个顺序存储结构的线性表 。
数组元素是一维数组的数组称为二维数组,也称为矩阵。

17:
目标
数组

2 数组
2.1 数组的基本概念
二维数组/矩阵的基本概念:
a0,0 a0,1 …… a0,j …… a0,m-1
a1,0 a1,1 …… a1,j …… a1,m-1
an-1,1 an-1,2 …… an-1,j …… an-1,m-1


ai,1 ai,2 …… ai,j …… ai,m-1


二维数组中的每一个数据元素ai,j 都受到两个关系的约束:行关系和列关系

18:
目标
数组

2 数组
2.2 数组的顺序存储结构
数组的顺序存储结构:
有两种顺序映象的方式:
1)以行序为主序(行优先顺序);
2)以列序为主序(列优先顺序)。
数组的顺序存储表示要解决的是一个"如何用一维的存储地址来表示多维的关系"的问题。

19:
目标
数组

2 数组
2.2 数组的顺序存储结构
以“行序为主序”的顺序存储映象:
例如:二维数组3*3
称为基地址或基址。
二维数组A[m][n]中任一元素ai,j 的存储位置
LOC(i,j) = LOC(0,0) + (n×i+j)×
a0,1
a0,0
a0,2
a1,0
a1,1
a1,2
a0,1
a0,0
a0,2
a1,0
a1,1
a1,2

L
L
a2,0
a2,1
a2,2
a2,0
a2,1
a2,2

20:
目标
数组

2 数组
2.2 数组的顺序存储结构
以“列序为主序”的顺序存储映象:
例如:二维数组
称为基地址或基址。
二维数组A[m][n]中任一元素ai,j 的存储位置
LOC(i,j) = LOC(0,0) + (m ×j +i) ×
a1,0

a0,0
a2,0

a0,1

a1,1
a1,2
a1,0

a0,0
a2,0

L
L
a0,2

a2,1
a2,2
a0,1

a1,1
a1,2
a0,2

a2,1
a2,2

21:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
特殊矩阵的压缩存储:
如果在矩阵中有许多值相同的元素或者是零元素。为了节省存储空间,可以对这类矩阵进行压缩存储。
所谓压缩存储是指:为多个值相同的元素只分配一个存储空间;对零元素不分配空间。
什么是特殊矩阵?
具有许多相同数据元素或零元素,且非零元素在矩阵中的分布有一定规则
例如: 对称矩阵
三角矩阵
稀疏矩阵
http://data.biancheng.net/view/183.html

22:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
对称矩阵的压缩存储:
矩阵中有两条对角线,其中图 1 中的对角线称为主对角线,另一条从左下角到右上角的对角线为副对角线。
对称矩阵指的是各数据元素沿主对角线对称的矩阵。
图1
对称矩阵的实现过程是,存储三角中的元素,只需将各元素所在的行标 i 和列标 j 代入下面的公式:K指一维数组的索引index
i*(i+1)/2+j (i>=j)下三角
K=
j*(j+1)/2+i (i<j)上三角

 K=0,1,…,n(n+1)/2

0 1 2 3 4 5 6 7 8 9
K
1 2 4 3 5 6
S
下三角

23:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
下三角矩阵的压缩存储:
i*(i+1)/2+j (i>=j,0≤i,j≤n-1)
K=
空 (i<j,0≤i,j≤n-1)

(下三角矩阵)

K=0,1,…,n(n+1)/2-1
0 1 2 3 4 5 6 7 8 9
K
1 2 4 3 5 6
S

24:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
上三角矩阵的压缩存储:

K=
j*(j+1)/2+i (i<=j)

  (i<=j,0≤i,j≤n-1)

(i>j,0≤i,j≤n-1)
0 1 2 3 4 5 6 7 8 9
K
1 2 4 3 5 6
S

25:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
稀疏矩阵的定义:
假设 m 行 n 列的矩阵含 t 个非零元素,则称

为稀疏因子δ德尔塔。
通常认为   0.05 的矩阵为稀疏矩阵且零值元素分布是随机的。
有较多零元素且非零元素分布无规律的矩阵为稀疏矩阵。

26:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
稀疏矩阵的压缩存储:
以常规方法,即以二维数组表示高阶的稀疏矩阵时产生的问题:

  1. 零值元素占了很大空间;
  2. 计算中进行了很多和零值的运算,遇除法,还需判别除数是否为零。即计算效率不高。

27:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
稀疏矩阵的压缩存储:
1、三元组顺序表
2、 十字链表

28:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
稀疏矩阵的三元组顺序表–压缩存储:

0 1 14
0 4 -5
1 1 -7
2 0 36
2 3 28
row column value

3

 5

5

data

rows

cols

nums
M=
M

29:
目标
数组

2 数组
2.3 特殊矩阵的压缩存储
稀疏矩阵的十字链表法–压缩存储:
0
0
3
0
3
5
1
1
-1
2
0
2
^
^
^
^
^
^
^

M.chead

M.rhead

3 4 4
M

3 0 0 5
0 -1 0 0
2 0 0 0

30:
Thank You!
力学笃行 志存高远

以上是关于数据结构与算法学习笔记串和数组的主要内容,如果未能解决你的问题,请参考以下文章

总结:串和数组的学习

数据结构与算法学习笔记 串,数组和广义表

第四章 串和数组 (主要kmp算法)

第四章心得体会

数据结构第四章学习小结

《学习JavaScript数据结构与算法》第三章 14000字笔记