相关公式和性质可以有通项公式推导
a n = a 1 + ( n − 1 ) d ; n = 1 , 2 , 3 , . . . a n = a 1 + n d − d = d n + ( a 1 − d ) ; ( 将 n 视为变量 ) 那么对于任何 f ( x ) = k x + b , 都可以看做是一个等差数列的通项 d = k ; a 1 − d = b ; ( a 1 = b + d ) a_n=a_1+(n-1)d ;n=1,2,3,... \\ a_n=a_1+nd-d=dn+(a_1-d);(将n视为变量) \\那么对于任何f(x)=kx+b,都可以看做是一个等差数列的通项 \\d=k;a_1-d=b;(a_1=b+d) an=a1+(n−1)d;n=1,2,3,...an=a1+nd−d=dn+(a1−d);(将n视为变量)那么对于任何f(x)=kx+b,都可以看做是一个等差数列的通项d=k;a1−d=b;(a1=b+d)
相邻项的性质
由通向公式 a n = a 1 + ( n − 1 ) d a 1 = a 1 + 0 d a 2 = a 1 + d a 3 = a 1 + 2 d . . . a n = a 1 + ( n − 1 ) d s = ∑ i = 1 n a i = ∑ i = 1 n ( a 1 + ( n − 1 ) d ) = a 1 ∑ i = 1 n 1 + d ∑ i = 1 n ( n − 1 ) = n a 1 + d ( n − 1 ) + ( n − 2 ) + . . . + 0 2 = n a 1 + d n ( n − 1 ) 2 \\由通向公式a_n=a_1+(n-1)d \\a_1=a_1+0d \\a_2=a_1+d \\a_3=a_1+2d \\... \\a_n=a_1+(n-1)d \\s=\sum\limits_{i=1}^{n}a_i=\sum\limits_{i=1}^{n}(a_1+(n-1)d) =a_1\sum\limits_{i=1}^{n}1+d\sum\limits_{i=1}^{n}(n-1)\\ =na_1+d\frac{(n-1)+(n-2)+...+0}{2} \\=na_1+d\frac{n(n-1)}{2} 由通向公式an=a1+(n−1)da1=a1+0da2=a1+da3=a1+2d...an=a1+(n−1)ds=i=1∑nai=i=1∑n(a1+(n−1)d)=a1i=1∑n1+di=1∑n(n−1)=na1+d2(n−1)+(n−2)+...+0=na1+d2n(n−1)
或者
s
=
n
(
a
1
+
a
n
)
2
另外
,
对于等差数列
,
如果
x
+
y
=
t
;
(
t
为常数
)
那么根据通向公式有
a
x
+
a
y
=
2
a
1
+
(
t
−
2
)
d
(
是一个常数
)
当
t
取
n
+
1
时
:
a
x
+
a
y
=
2
a
1
+
(
n
−
1
)
d
因此
,
有倒序相加是
2
s
可得到
:
s
=
n
(
a
1
+
a
n
)
2
=
n
(
a
x
+
a
n
+
1
−
x
)
2
s=n\frac{(a_1+a_n)}{2} \\另外,对于等差数列,如果x+y=t;(t为常数) \\那么根据通向公式有a_x+a_y=2a_1+(t-2)d(是一个常数) \\当t取n+1时:a_x+a_y=2a_1+(n-1)d \\因此,有倒序相加是2s可得到:s=n\frac{(a_1+a_n)}{2}=n\frac{(a_x+a_{n+1-x})}{2}
s=n2(a1+an)另外,对于等差数列,如果x+y=t;(t为常数)那么根据通向公式有ax+ay=2a1+(t−2)d(是一个常数)当t取n+1时:ax+ay=2a1+(n−1)d因此,有倒序相加是2s可得到:s=n2(a1+an)=n2(ax+an+1−x)
| x x x | f ( x ) f(x) f(x) |
|---|---|
| 1 | n n n |
| 2 | n − 1 n-1 n−1 |
| 3 3 3 | n − 2 n-2 n−2 |
| … | … |
| i | n − ( i − 1 ) n-(i-1) n−(i−1) |
也就是说 f ( x ) = n − ( x − 1 ) = n + 1 − x 也就是说f(x)=n-(x-1)=n+1-x 也就是说f(x)=n−(x−1)=n+1−x
可以看出 f ( x ) 是一个公差为 d = − 1 的等差数列 可以看出f(x)是一个公差为d=-1的等差数列 可以看出f(x)是一个公差为d=−1的等差数列
f ( x ) 前 i 项和为 s i = i a 1 + d i ( i − 1 ) 2 = i n + ( − 1 ) i ( i − 1 ) 2 = 1 2 i ( 2 n − i + 1 ) f(x)前i项和为s_i=ia_1+d\frac{i(i-1)}{2}=in+(-1)\frac{i(i-1)}{2}=\frac{1}{2}i(2n-i+1) f(x)前i项和为si=ia1+d2i(i−1)=in+(−1)2i(i−1)=21i(2n−i+1)
在上三角矩阵解压缩公式中,上述 i ( i ) = i − 1 i(i)=i-1 i(i)=i−1公式取
主要包括:
知道闭区间两端元素的序号,求区间内包含多少个元素
知道区间长度和区间的一个断点序号(坐标)求另一个端点的序号
这一部分是讨论由区间长度计算另一端坐标的问题
区间&坐标问题本质的表现之一
**增量 Δ = e n d − s t a r t \Delta=end-start Δ=end−start**在这个问题上是一个核心概念
序号差(坐标差)a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an
a i a i + 1 ⋯ a j − 1 a j ⏟ 子串长度为 Δ = j − i a_i\underbrace{a_{i+1}\cdots a_{j-1}a_{j}}_{子串长度为\Delta=j-i} ai子串长度为Δ=j−i ai+1⋯aj−1aj
增量区间内 Δ = j − i 内的元素不包括 a i ; 即 , 仅包括 [ a i + 1 , a j ] 增量区间内\Delta=j-i内的元素不包括a_i;即,仅包括[a_{i+1},a_{j}] 增量区间内Δ=j−i内的元素不包括ai;即,仅包括[ai+1,aj]
或者 a i a i + 1 ⋯ a j − 1 ⏟ 负增量 Δ = i − j a j \underbrace{a_ia_{i+1}\cdots a_{j-1}}_{负增量\Delta=i-j}a_{j} 负增量Δ=i−j aiai+1⋯aj−1aj
由于 a i ∼ a j − 1 共有 L 个元素 ; 每数一下 , 序号在 y 的基础上 − 1 元素 : 序号 a j : y a j − 1 : y − 1 a j − 2 : y − 2 ⋮ a i + 1 : y − ( L − 1 ) a i : y − ( L ) 即 x = y − L 由于a_i\sim a_{j-1}共有L个元素;每数一下,序号在y的基础上-1 \\元素:序号 \\a_{j}:y \\a_{j-1}:y-1 \\a_{j-2}:y-2 \\\vdots \\a_{i+1}:y-(L-1) \\a_{i}:y-(L) \\即x=y-L 由于ai∼aj−1共有L个元素;每数一下,序号在y的基础上−1元素:序号aj:yaj−1:y−1aj−2:y−2⋮ai+1:y−(L−1)ai:y−(L)即x=y−L
特别的 , 当 L = 1 有 a i a j ⏟ L = 1 特别的,当L=1有a_i\underbrace{a_{j}}_{L=1} 特别的,当L=1有aiL=1 aj
o f f s e t = L = Δ = j − i ; offset=L=\Delta=j-i; offset=L=Δ=j−i;
结合下面的描述, ∣ Δ ∣ = ∣ j − i ∣ |\Delta|=|j-i| ∣Δ∣=∣j−i∣可以理解为:
元素 [ a i + 1 , a j ] 闭区间内元素数目 ∣ Δ ∣ 元素[a_{i+1},a_{j}]闭区间内元素数目|\Delta| 元素[ai+1,aj]闭区间内元素数目∣Δ∣
或者理解为指针从 a i 移动到 a j 需要执行单步移动次数 或者理解为指针从a_i移动到a_j需要执行单步移动次数 或者理解为指针从ai移动到aj需要执行单步移动次数
设 a i 的序号为 x ; a j 的序号为 y ; 设a_i的序号为x;a_j的序号为y; 设ai的序号为x;aj的序号为y;
★ a i + Δ = a i + Δ ; 表示指向 a i 的指针经过正方向偏移 L 次 ( 其中每次偏移 , 指针从前一个元素移动到相邻的后一个元素 , 下标 ( 序号 ) 变化 1 ) \bigstar\ a_i+\Delta=a_{i+\Delta}; \\表示指向a_i的指针经过正方向偏移L次 \\(其中每次偏移,指针从前一个元素移动到相邻的后一个元素,下标(序号)变化1) ★ ai+Δ=ai+Δ;表示指向ai的指针经过正方向偏移L次(其中每次偏移,指针从前一个元素移动到相邻的后一个元素,下标(序号)变化1)
例如 , 当 i = 1 , Δ = 1 时 , p 1 经过一次移动变为 p 2 例如,当i=1,\Delta=1时,p_1经过一次移动变为p_2 例如,当i=1,Δ=1时,p1经过一次移动变为p2
从上面的关系式可以看出, 指针从 a i 移动到 a j 需要执行 Δ = j − i 单步移动操作 ★ 指针从a_i移动到a_j需要执行\Delta=j-i单步移动操作\bigstar 指针从ai移动到aj需要执行Δ=j−i单步移动操作★
M a t c h e d S i z e ( i n d e x i , i n d e x j ) 表示 , 序列 { a n } 的元素 a i 到元素 a j 之间连同两端包含了多少个元素 MatchedSize(index_i,index_j)表示,序列\{a_n\}的元素a_i到元素a_j之间连同两端包含了多少个元素 MatchedSize(indexi,indexj)表示,序列{an}的元素ai到元素aj之间连同两端包含了多少个元素
∣ Δ ∣ = i n c r e m e n t ( i n d e x 1 , i n d e x 2 ) = ∣ i n d e x 2 − i n d e x 1 ∣ m ( s t a r t , e n d ) = M a t c h e d S i z e ( i n d e x 1 , i n d e x 2 ) = ∣ Δ ∣ + 1 = ∣ i n d e x 2 − i n d e x 1 ∣ + 1 |\Delta|=increment(index1,index2)=|index2-index1| \\ m(start,end)=MatchedSize(index1,index2)=|\Delta|+1=|index2-index1|+1 ∣Δ∣=increment(index1,index2)=∣index2−index1∣m(start,end)=MatchedSize(index1,index2)=∣Δ∣+1=∣index2−index1∣+1
offset&MatchedSize公式都是十分基础但是用途十分广泛的计数公式,比如
活动日期的计算: 11 ∼ 29 号共有几天 ? d a y s = m ( 11 , 29 ) = 29 − 11 + 1 = 19 11\sim29号共有几天?days=m(11,29)=29-11+1=19 11∼29号共有几天?days=m(11,29)=29−11+1=19
排列数公式 ( n m ) = n ( n − 1 ) ( n − 2 ) ⋯ ( n − m + 1 ) 排列数公式\binom{n}{m}=n(n-1)(n-2)\cdots(n-m+1) 排列数公式(mn)=n(n−1)(n−2)⋯(n−m+1)
模式串匹配算法(朴素匹配/kmp)
特殊矩阵压缩/解压公式
k对角矩阵,其第i行形如:
问, a i , j k 前面的非零元素有几个 a_{i,j_k}前面的非零元素有几个 ai,jk前面的非零元素有几个;
上面的问题看似不是MatchedSize的应用场合,但其实,稍微想一下,也可以转化为MatchedSize
0 ⋯ 0 , a i , j 1 , ⋯ , a i , j k − 1 ⏟ 几个元素 ? , a i , j k , 0 ⋯ 0 0\cdots0,\underbrace{a_{i,j_1},\cdots,a_{i,j_{k-1}}}_{几个元素?},a_{i,j_k},0\cdots 0 0⋯0,几个元素? ai,j1,⋯,ai,jk−1,ai,jk,0⋯0
m ( 1 , k − 1 ) = j k − 1 − j 1 + 1 m_{(1,k-1)}=j_{k-1}-j_1+1 m(1,k−1)=jk−1−j1+1
特别的 , 三对角矩阵 ( k = 3 ) 中 , 第 i 行元素 a i , j 前面的非零元素有几个 ? 特别的,三对角矩阵(k=3)中,第i行元素a_{i,j}前面的非零元素有几个? 特别的,三对角矩阵(k=3)中,第i行元素ai,j前面的非零元素有几个?
问: a i ⋯ a j − 1 ⏟ 子串长度为 L a j \underbrace{a_i\cdots a_{j-1}}_{子串长度为L}a_{j} 子串长度为L ai⋯aj−1aj
从一维序列的计数公式&坐标公式的各种形式上看
关系式 ∣ j − i ∣ = ∣ Δ ( L ) ∣ 足以解决所有相关问题 ( 以坐标差 Δ 为核心 ) 关系式|j-i|=|\Delta(L)|足以解决所有相关问题(以坐标差\Delta为核心) 关系式∣j−i∣=∣Δ(L)∣足以解决所有相关问题(以坐标差Δ为核心)
坐标差 = 增量长度 j − i = Δ = L [ a i , a j − 1 ] = L [ a j , a i + 1 ] ⩾ 0 ( i − j = − Δ ) (core) \\坐标差=增量长度 \\ j-i=\Delta=L_{[a_{i},a_{j-1}]}=L_{[a_{j},a_{i+1}]}\tag{core}\geqslant 0 \\ (i-j=-\Delta) 坐标差=增量长度j−i=Δ=L[ai,aj−1]=L[aj,ai+1]⩾0(i−j=−Δ)(core)
L [ a i , a j ] = ∣ Δ ∣ + 1 = ∣ j − i ∣ + 1 L_{[a_{i},a_{j}]}=|\Delta|+1=|j-i|+1 L[ai,aj]=∣Δ∣+1=∣j−i∣+1
将坐标差 Δ 用闭区间距离 L 或 ( L ± 1 ) 表示出来 将坐标差\Delta用闭区间距离L或(L\pm 1)表示出来 将坐标差Δ用闭区间距离L或(L±1)表示出来
L 通常是 a i ∼ a j 闭区间内的元素数量 , 这时候 Δ ( L ) = L − 1 L通常是a_i\sim a_j闭区间内的元素数量,这时候\Delta(L)=L-1 L通常是ai∼aj闭区间内的元素数量,这时候Δ(L)=L−1
利用上面的关系式列等式, 所有关于 i , j , L 的值都可以一步计算的时间内得出 所有关于i,j,L的值都可以一步计算的时间内得出 所有关于i,j,L的值都可以一步计算的时间内得出
公式中都具有坐标差(假设i 按行优先排列
m
分别表示一维数组的维数
m分别表示一维数组的维数
m分别表示一维数组的维数
a
i
表示数组中下标为
i
的元素
a_{i}表示数组中下标为i的元素
ai表示数组中下标为i的元素
L
表示数组中的元素占的存储单元数
,
比如字节数
L表示数组中的元素占的存储单元数,比如字节数
L表示数组中的元素占的存储单元数,比如字节数
L
o
c
(
a
i
)
表示元素
a
i
在内存中的起始地址
Loc(a_{i})表示元素a_{i}在内存中的起始地址
Loc(ai)表示元素ai在内存中的起始地址
L
o
c
(
a
1
)
=
L
o
c
(
a
0
)
+
1
×
L
一种不太准确的
L
o
c
(
a
i
)
的理解
:
↿
L
a
[
0
]
,
a
[
1
]
,
⋯
,
a
[
i
−
1
]
⏟
i
−
1
⏞
i
个元素
,
↿
a
[
i
]
,
⋯
比较合适的理解
L
o
c
(
a
i
)
:
a
[
0
]
↿
L
o
c
,
a
[
1
]
,
⋯
,
a
[
i
−
1
]
⏟
i
−
1
⏞
i
个元素
,
a
[
i
]
,
⋯
所以
:
L
o
c
(
a
i
)
=
L
o
c
(
a
0
)
+
i
×
L
Loc(a_1)=Loc(a_0)+1\times L \\一种不太准确的Loc(a_i)的理解: \\\underset{\underset{L}{\upharpoonleft}}{} \overbrace{a[0],\underbrace{a[1],\cdots,a[i-1]}_{i-1}}^{i个元素},\underset{\upharpoonleft}{}a[i],\cdots \\比较合适的理解Loc(a_i): \\\overbrace{{\underset{\upharpoonleft_{Loc}}{a[0]}},\underbrace{a[1],\cdots,a[i-1]}_{i-1}}^{i个元素},a[i],\cdots \\所以: Loc(a_i)=Loc(a_0)+i\times L
Loc(a1)=Loc(a0)+1×L一种不太准确的Loc(ai)的理解:L↿a[0],i−1
a[1],⋯,a[i−1]
i个元素,↿a[i],⋯比较合适的理解Loc(ai):↿Loca[0],i−1
a[1],⋯,a[i−1]
i个元素,a[i],⋯所以:Loc(ai)=Loc(a0)+i×L
L
o
c
(
a
i
)
=
L
o
c
(
a
0
)
+
i
×
L
Loc(a_i)=Loc(a_0)+i\times L
Loc(ai)=Loc(a0)+i×L
L
o
c
(
a
i
,
j
)
=
L
o
c
(
a
0
,
0
)
+
i
×
s
i
z
e
o
f
(
r
o
w
)
+
j
×
L
s
i
z
e
o
f
(
r
a
w
)
=
m
×
L
L
o
c
(
a
i
,
j
)
=
L
o
c
(
a
0
,
0
)
+
(
i
×
m
+
j
)
×
L
Loc(a_{i,j})=Loc(a_{0,0})+i\times sizeof(row)+j\times L \\sizeof(raw)=m\times L \\Loc(a_{i,j})=Loc(a_{0,0})+ (i\times m+j)\times L
Loc(ai,j)=Loc(a0,0)+i×sizeof(row)+j×Lsizeof(raw)=m×LLoc(ai,j)=Loc(a0,0)+(i×m+j)×L
从矩阵的第一个元素
a
0
,
0
开始
,
按行扫描
,
一直到
a
i
,
j
,
期间遇到的属于上三角
(
a
i
,
j
;
i
⩽
j
)
的元素的个数
:
从矩阵的第一个元素a_{0,0}开始,按行扫描,一直到a_{i,j}, \\期间遇到的属于上三角(a_{i,j};i\leqslant j)的元素的个数: \\
从矩阵的第一个元素a0,0开始,按行扫描,一直到ai,j,期间遇到的属于上三角(ai,j;i⩽j)的元素的个数:
如果
B
[
0...
]
,
那么
k
0
=
S
i
−
1
+
s
i
−
1
;
S
i
−
1
=
(
i
−
1
)
(
2
n
−
i
+
2
)
2
是前
i
−
1
行的元素总数量
,
s
i
=
j
−
i
+
1
是第
i
行的
a
i
,
i
到
a
i
,
j
的元素数量
k
0
=
(
i
−
1
)
(
2
n
−
i
+
2
)
2
+
(
j
−
i
+
1
)
−
1
=
(
i
−
1
)
(
2
n
−
i
+
2
)
2
+
j
−
i
如果B[0...],那么k_0=S_{i-1}+s_i-1; \\S_{i-1}=\frac{(i-1)(2n-i+2)}{2}是前i-1行的元素总数量, \\s_i=j-i+1是第i行的a_{i,i}到a_{i,j}的元素数量 \\k_0=\frac{(i-1)(2n-i+2)}{2}+(j-i+1)-1=\frac{(i-1)(2n-i+2)}{2}+j-i
如果B[0...],那么k0=Si−1+si−1;Si−1=2(i−1)(2n−i+2)是前i−1行的元素总数量,si=j−i+1是第i行的ai,i到ai,j的元素数量k0=2(i−1)(2n−i+2)+(j−i+1)−1=2(i−1)(2n−i+2)+j−i
如果
B
[
1...
]
,
那么
k
1
=
S
i
−
1
+
s
i
;
k
1
=
(
i
−
1
)
(
2
n
−
i
+
2
)
2
+
j
−
i
+
1
如果B[1...],那么k_1=S_{i-1}+s_i; \\k_1=\frac{(i-1)(2n-i+2)}{2}+j-i+1
如果B[1...],那么k1=Si−1+si;k1=2(i−1)(2n−i+2)+j−i+1
k
0
(
i
,
j
)
=
{
(
i
−
1
)
(
2
n
−
i
+
2
)
2
+
j
−
i
;
(
i
⩽
j
)
n
(
n
+
1
)
2
;
(
j
<
i
)
即
A
[
i
]
[
j
]
=
B
[
k
(
i
,
j
)
]
k
根据
B
数组的要求而决定选用
k
0
还是
k
1
;
实际上更多的用的前者
k_0(i,j)={(i−1)(2n−i+2)2+j−i;(i⩽ \\ 即A[i][j]=B[k(i,j)] \\k根据B数组的要求而决定选用k_0还是k_1;实际上更多的用的前者
k0(i,j)={2(i−1)(2n−i+2)+j−i;(i⩽j)2n(n+1);(j<i)即A[i][j]=B[k(i,j)]k根据B数组的要求而决定选用k0还是k1;实际上更多的用的前者 对称矩阵和三角矩阵十分相近 不同的是对称矩阵的特点:
a
i
,
j
=
a
j
,
i
a_{i,j}=a_{j,i}
ai,j=aj,i
这意味着
,
如果对称矩阵将上三角
(
i
⩽
j
)
压缩到数组
B
中
,
并且要求的是
a
p
,
q
(
p
⩾
q
)
的压缩位置
,
那么可以利用公式
a
q
,
p
=
a
p
,
q
来解压
这意味着,如果对称矩阵将上三角(i\leqslant j)压缩到数组B中, \\并且要求的是a_{p,q}(p\geqslant q)的压缩位置,那么可以利用公式a_{q,p}=a_{p,q}来解压
这意味着,如果对称矩阵将上三角(i⩽j)压缩到数组B中,并且要求的是ap,q(p⩾q)的压缩位置,那么可以利用公式aq,p=ap,q来解压
k
0
(
i
,
j
)
=
{
i
(
i
−
1
)
2
+
j
−
1
;
i
⩾
j
j
(
j
−
1
)
2
+
i
−
1
;
i
⩽
j
k_0(i,j)=
k0(i,j)={2i(i−1)+j−1;i⩾j2j(j−1)+i−1;i⩽j
第
1
行到
i
−
1
行每行多有三个元素
(
补上的虚拟元素
Q
−
1
后面再
−
1
,
则
s
i
−
1
=
3
(
i
−
1
)
−
1
)
第1行到i-1行每行多有三个元素(补上的虚拟元素Q_{-1}后面再-1,则s_{i-1}=3(i-1)-1)
第1行到i−1行每行多有三个元素(补上的虚拟元素Q−1后面再−1,则si−1=3(i−1)−1)
第
i
行有
b
i
=
j
−
(
i
−
1
)
个元素
第i行有b_i=j-(i-1)个元素
第i行有bi=j−(i−1)个元素 因为,三对角矩阵的斜对角区域的每一行的三个元素可以表示为:
a
i
,
i
−
1
,
a
i
,
i
,
a
i
,
i
+
1
a_{i,i-1},a_{i,i},a_{i,i+1}
ai,i−1,ai,i,ai,i+1 这时
将矩阵
A
[
1
,
.
.
.
,
n
]
[
1
,
.
.
.
,
n
]
中的元素
a
i
,
j
压缩到
B
数组中的下标为
k
=
k
(
i
,
j
)
的位置
将矩阵A[1,...,n][1,...,n]中的元素a_{i,j}压缩到B数组中的下标为k=k(i,j)的位置
将矩阵A[1,...,n][1,...,n]中的元素ai,j压缩到B数组中的下标为k=k(i,j)的位置
计算
k
的原理是
,
计算
a
i
,
j
前面的元素个数
:
k
b
e
f
o
r
e
(
i
,
j
)
=
3
(
i
−
1
)
−
1
+
j
−
(
i
−
1
)
=
2
i
+
j
−
3
计算k的原理是,计算a_{i,j}前面的元素个数:k_{before}(i,j)=3(i-1)-1+j-(i-1)=2i+j-3
计算k的原理是,计算ai,j前面的元素个数:kbefore(i,j)=3(i−1)−1+j−(i−1)=2i+j−3
B
[
0
,
.
.
.
,
n
−
1
]
,
从
B
[
0
]
开始存放元素
a
0
,
0
,
.
.
B[0,...,n-1],从B[0]开始存放元素a_{0,0},..
B[0,...,n−1],从B[0]开始存放元素a0,0,..
B
[
1
,
.
.
.
,
n
]
,
从
B
[
1
]
开始存放元素
a
0
,
0
,
.
.
.
B[1,...,n],从B[1]开始存放元素a_{0,0},...
B[1,...,n],从B[1]开始存放元素a0,0,... 这种情况也是有的(比如,我们用B[0]保存其他元信息,比如长度)
i
(
k
)
=
⌊
k
+
1
3
+
1
⌋
=
⌊
k
+
1
3
⌋
+
1
=
⌊
k
+
4
3
⌋
i(k)=\lfloor{\frac{k+1}{3}+1}\rfloor=\lfloor{\frac{k+1}{3}}\rfloor+1 \\=\left\lfloor\frac{k+4}{3}\right\rfloor
i(k)=⌊3k+1+1⌋=⌊3k+1⌋+1=⌊3k+4⌋ 例如
i
=
1
;
k
=
{
(
−
1
)
(
虚拟
)
0
1
i
=
2
;
k
=
{
2
3
4
i
=
3
;
k
=
{
5
6
7
⋮
i
=
i
;
k
=
{
3
(
i
−
1
)
−
1
3
(
i
−
1
)
3
(
i
−
1
)
+
1
k
+
1
=
{
3
(
i
−
1
)
3
(
i
−
1
)
+
1
3
(
i
−
1
)
+
2
k
+
1
3
=
{
(
i
−
1
)
(
i
−
1
)
+
1
3
(
i
−
1
)
+
2
3
k
+
1
3
+
1
=
{
i
i
+
1
3
i
+
2
3
可见
:
上式子两边同时向下取整
,
就得到
k
映射到
i
的函数
⌊
k
+
1
3
+
1
⌋
=
⌊
k
+
1
3
⌋
+
1
=
i
i
(
k
)
=
⌊
k
+
1
3
+
1
⌋
=
⌊
k
+
1
3
⌋
+
1
i=1;k=\\ i=2;k=\\ i=3;k=\\ \vdots\\ i=i;k=\\ {k+1}=\\ \frac{k+1}{3}=\\ \frac{k+1}{3}+1=\\ 可见:上式子两边同时向下取整,就得到k映射到i的函数 \\ \lfloor{\frac{k+1}{3}+1}\rfloor=\lfloor{\frac{k+1}{3}}\rfloor+1 =i \\ i(k)=\lfloor{\frac{k+1}{3}+1}\rfloor=\lfloor{\frac{k+1}{3}}\rfloor+1
i=1;k=⎩
⎨
⎧(−1)(虚拟)01i=2;k=⎩
⎨
⎧234i=3;k=⎩
⎨
⎧567⋮i=i;k=⎩
⎨
⎧3(i−1)−13(i−1)3(i−1)+1k+1=⎩
⎨
⎧3(i−1)3(i−1)+13(i−1)+23k+1=⎩
⎨
⎧(i−1)(i−1)+31(i−1)+323k+1+1=⎩
⎨
⎧ii+31i+32可见:上式子两边同时向下取整,就得到k映射到i的函数⌊3k+1+1⌋=⌊3k+1⌋+1=ii(k)=⌊3k+1+1⌋=⌊3k+1⌋+1数组元素位置&起始地址
二维数组(矩阵)
一维数组
a[0] a[1] a[2] … a[i] 三角矩阵的压缩
上三角
按行优先
第x行 行x上属于上三角的元素的个数 1
n
n
n 2 n-1 3
n
−
2
n-2
n−2 … …
x
x
x
n
−
(
x
−
1
)
n-(x-1)
n−(x−1)
i
−
1
(
x
=
i
−
1
时
)
i-1(x=i-1时)
i−1(x=i−1时)
n
−
(
i
−
1
−
1
)
=
n
−
i
+
2
n-(i-1-1)=n-i+2
n−(i−1−1)=n−i+2 i(特别的)
j
−
i
+
1
j-i+1
j−i+1 映射公式用法
按列优先
下三角矩阵
😀公式使用条件
k
0
&
k
1
的关系
k_0\&k_1的关系
k0&k1的关系
A
[
0...
]
v
s
A
[
1...
]
A[0...] vs A[1...]
A[0...]vsA[1...]
对称矩阵
三对角矩阵
i=1 (
Q
−
1
Q_{-1}
Q−1)(虚拟)
Q
0
Q_0
Q0
Q
1
Q_1
Q1 2
Q
2
Q_2
Q2 Q
Q
4
Q_4
Q4 3
Q
5
Q_5
Q5 Q
Q
7
Q_7
Q7 4
⋮
\vdots
⋮ …
⋮
\vdots
⋮ Q Q Q Q Q
j
=
{
i
−
1
i
i
+
1
j=
j=⎩
⎨
⎧i−1ii+1压缩公式
k
0
(
i
,
j
)
=
3
(
i
−
1
)
−
1
+
j
−
(
i
−
1
)
=
2
i
+
j
−
3
k_0(i,j)=3(i-1)-1+j-(i-1)=2i+j-3
k0(i,j)=3(i−1)−1+j−(i−1)=2i+j−3
k
1
(
i
,
j
)
=
k
0
(
i
,
j
)
+
1
=
2
i
+
j
−
2
k_{1}(i,j)=k_{0}(i,j)+1=2i+j-2
k1(i,j)=k0(i,j)+1=2i+j−2确定数组中的元素解压后的行/列公式
确定行
我们来推导一下
确定列