元素序列编号计算原理@位置偏移计算.md
数列/数组计数公式
讨论对象
- 设自然数序列 1 , 2 , 3 , 4 , . . . , p − 1 , p , . . . , n − 1 , n 1,2,3,4,...,p-1,{p,...,n-1,n} 1,2,3,4,...,p−1,p,...,n−1,n;其中 p ⩽ n p\leqslant n p⩽n
- 更一般序列形式: 序列 { a n } = ⋯ , a − 1 , a 0 , a 1 , a 2 , ⋯ 序列\{a_n\}=\cdots,a_{-1},a_0,a_1,a_2,\cdots 序列{an}=⋯,a−1,a0,a1,a2,⋯
问题内容
- 本文讨论"一维序列"区间元素计数与编号计算公式的相关讨论
- 已知序列闭区间两端元素的序号 [ p , n ] , p ⩽ n [p,n],p\leqslant{n} [p,n],p⩽n,求该区间内包含多少个元素( l e n [ p , n ] len[p,n] len[p,n]=?);半开半闭区间又是如何?
- 已知某个序列区间长度 m m m和该区间的一个端点序号(坐标) n n n求另一个端点的序号 p p p=?
基本回答
- 问题1:根据减法原理, l e n [ p , n ] = ∣ n − p ∣ + 1 len[p,n]=|n-p|+1 len[p,n]=∣n−p∣+1, l e n ( p , n ] = l e n [ p , n ) = l e n [ p , n ] − 1 = ∣ n − p ∣ len(p,n]=len[p,n)=len[p,n]-1=|n-p| len(p,n]=len[p,n)=len[p,n]−1=∣n−p∣
- 问题2:由 l e n [ p , n ] = n − p + 1 = m len[p,n]=n-p+1=m len[p,n]=n−p+1=m得 p = n + 1 − l e n [ p , n ] p=n+1-len[p,n] p=n+1−len[p,n]= n − m + 1 n-m+1 n−m+1
位置关系的描述
- 为例描述序列中元素的位置关系,通常用一个整数来描述一个元素的位置,不同的元素都有不同的整数描述,我们称这样的整数为元素的序号或坐标或指针
- 特别的,指针用来指示当前元素的坐标
- 元素序列: a s , ⋯ , a e a_s,\cdots,a_{e} as,⋯,ae是一个长度为 e − s + 1 e-s+1 e−s+1的元素序列,下标 s , ⋯ , e s,\cdots,e s,⋯,e是这些元素对应的坐标
- 起点坐标:序列的第一个元素的坐标,通常用s或S表示(start)
- 终点坐标:序列的最后一个元素的坐标,通常用e或E表示(end)
增量
- 为了计算一维坐标问题,引入增量 Δ = E − S \Delta=E-S Δ=E−S这个概念
- 在序列中,增量描述的是序列中某两个元素间的坐标差
- 对于序列
a
s
,
⋯
,
a
e
a_s,\cdots,a_e
as,⋯,ae,
Δ
(
a
s
,
a
e
)
=
e
−
s
\Delta(a_s,a_e)=e-s
Δ(as,ae)=e−s表示的是:
- a s a_s as的指针正向移动 Δ \Delta Δ个元素后会指向元素 a e a_e ae
- 例如,元素 a 1 → a 2 a_1\to a_2 a1→a2的增量为1,记为 δ ( a 1 , a 2 ) = 2 − 1 = 1 \delta(a_1,a_2)=2-1=1 δ(a1,a2)=2−1=1
- 增量也叫做序号差或坐标差或坐标偏移量或距离
正负性
- 增量有正负之分:对于坐标变换
a
→
a
+
Δ
a\to{a+\Delta}
a→a+Δ
- 序号沿着增大的方向变化的,称为正增量 Δ > 0 \Delta>0 Δ>0
- 沿着负方向减小的方向变化的,称为负增量 Δ < 0 \Delta<0 Δ<0
序列长度和增量的关系
- a s , ⋯ , a e a_s,\cdots,a_e as,⋯,ae的元素数目 l e n [ e , s ] = ∣ Δ ( a s , a e ) ∣ + 1 len[e,s]=|\Delta(a_s,a_e)|+1 len[e,s]=∣Δ(as,ae)∣+1= ∣ e − s ∣ + 1 |e-s|+1 ∣e−s∣+1
利用序列长度或增量计算排列数末因式
-
例如排列数公式 A n m A_n^m Anm= n ( n − 1 ) ⋯ ( x ) {n(n-1)\cdots(x)} n(n−1)⋯(x),其中 l e n [ n , x ] = m len[n,x]=m len[n,x]=m,即 ∣ n − x ∣ + 1 = m |n-x|+1=m ∣n−x∣+1=m,由于 n ⩾ x n\geqslant{x} n⩾x,所以 n − x + 1 = m n-x+1=m n−x+1=m,即 x = n − m + 1 x=n-m+1 x=n−m+1
-
从而 A n m = n ( n − 1 ) ⋯ ( n − m + 1 ) A_n^m={n(n-1)\cdots(n-m+1)} Anm=n(n−1)⋯(n−m+1)
-
从增量的角度: ∣ Δ ( n , x ) ∣ = m − 1 |\Delta(n,x)|=m-1 ∣Δ(n,x)∣=m−1,即 ∣ n − x ∣ = m − 1 , ( n ⩾ x ) |n-x|=m-1,(n\geqslant{x}) ∣n−x∣=m−1,(n⩾x),从而 n − x = m − 1 n-x=m-1 n−x=m−1,同样有 x = n − m + 1 x=n-m+1 x=n−m+1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了