[数据结构]-09数组

数组

具有相同类型的数据元素按照一定的格式排列起来的集合称为数组。

若干数据类型相同且占用相同存储空间的元素组成的有序序列,每个元素对应唯一的下标,这样的序列称为一维数组。
一维数组初始化时:必须声明数组元素的数据类型、必须确定数组的长度。

二维数组:一维数组中的数据元素又是一个一维数组。
A = a [ m ] [ n ] A = a[m][n] 表示一个二维数组,则:

A = ( a 1 , a 2 , a 3 , . . . , a m ) A = (a_1,a_2,a_3,...,a_m)
a i = ( b 1 , b 2 , b 3 , . . . , b n ) ( 1 i m ) a_i= (b_1,b_2,b_3,...,b_n) (1\ge i \ge m)

三维数组:二维数组中的数据元素又是一个一维数组。
n n 维数组: n 1 n-1 维数组中的元素又是一个一维数组结构。

数组的特点

  • 数组的结构固定:数组初始化时定义维数和数组长度。
  • 除了数组的初始化和销毁外,数组只有获取元素和修改元素的操作,不能删除或新增元素。

数组的存储

一维数组的存储

A = ( a 0 , a 1 , a 2 , a 3 , . . . , a n 1 ) A = (a_0,a_1,a_2,a_3,...,a_{n-1}) 表示一个一维数组,数组中每个元素 a i a_i 都占用 l l 个存储单元,数组元素的下标从 0 开始,则元素 a i 1 a_{i-1} a i a_{i}
的存储地址对应关系为:
L O C ( i ) = { L O C ( 0 ) = a ; i = 0 L O C ( i 1 ) + l = a + i l ; i > 0 LOC(i)=\begin{cases} LOC(0) = a ; & i = 0 \\ LOC(i-1)+l = a+i*l ; & i > 0 \end{cases}
其中: L O C ( 0 ) = a LOC(0) = a 表示第一个元素的存储地址, L O C ( i 1 ) LOC(i-1) 表示数组第 i i 个元素的存储地址。

二维数组的存储

二维数组的顺序存储主要有两种方式:以行序为主序以列序为主序

二维数组的行存储

A = a [ m ] [ n ] A = a[m][n] m m n n 列的二维数组,开始存储位置为 L O C ( 0 , 0 ) LOC(0,0) ,每个元素占用 l l 个存储单元,数组元素 a [ i ] [ j ] a[i][j] 的存储位置为:
L O C ( i , j ) = L O C ( 0 , 0 ) + ( n i + j ) LOC(i,j) = LOC(0,0) + (n * i + j)

二维数组的列存储

A = a [ m ] [ n ] A = a[m][n] m m n n 列的二维数组,开始存储位置为 L O C ( 0 , 0 ) LOC(0,0) ,每个元素占用 l l 个存储单元,数组元素 a [ i ] [ j ] a[i][j] 的存储位置为:
L O C ( i , j ) = L O C ( 0 , 0 ) + ( n j + i ) LOC(i,j) = LOC(0,0) + (n * j + i)

n 维数组的存储

因为多维关系与一维存储地址之间存在唯一的映射问题,需要对高维数组元素的存放次序进行约定。
n n 维数组通常有两种存放次序:

  • 按行优先顺序:将高位数组元素按行向量的顺序存储,第 i + 1 i+1 个行向量存储在第 i i 个行向量之后。
  • 按列优先顺序:将数组元素按列向量的顺序存储,第 i + 1 i+1 个列向量存储在第 i i 个列向量之后。

算法例题

1.异位词判断
例题:给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词(可以假设字符串只包含小写字母)。

示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true

示例 2:
输入: s = “rat”, t = “car”
输出: false

说明:
字母异位词:就是两个字符串中的相同字符的数量要对应相等。
例如,s 等于 “anagram”,t 等于 “nagaram”,s 和 t 就互为字母异位词。因为它们都包含有三个字符 a,一个字符 g,一个字符 m,一个字符 n,以及一个字符 r。而当 s 为 “rat”,t 为 “car”的时候,s 和 t 不互为字母异位词。

解题思路:
一个重要的前提“假设两个字符串只包含小写字母”,小写字母一共也就 26 个,因此:

  • 可以利用两个长度都为 26 的字符数组来统计每个字符串中小写字母出现的次数,然后再对比是否相等;
  • 可以只利用一个长度为 26 的字符数组,将出现在字符串 s 里的字符个数加 1,而出现在字符串 t 里的字符个数减 1,最后判断每个小写字母的个数是否都为 0。
    按上述操作,可得出结论:s 和 t 互为字母异位词。

参考

  • 《数据结构(C语言版)》 严魏敏、吴伟民著
  • 《数据结构(第3版)》 刘大有等著
  • 《搞定数据结构与算法》 苏勇
发布了19 篇原创文章 · 获赞 0 · 访问量 757

猜你喜欢

转载自blog.csdn.net/qq_39953750/article/details/103896226