定义
这个序数变换序列的是顺序具有
即,值的次数出现在中.
在上述内容中,是序列的域一即指数集:如果我们考虑一个序列相反,那么.
示例
A004736号=(1,2,1,3,2,1,4,3,2,1,…)是A002260号= (1, 1,2, 1,2,3, 1,2,3,4, ...)
A001511号=(1,2,1,3,1,2,1,2,1,4,…),标尺函数(2n的2-adic赋值),是A003602号=(1,1,2,1,3,2,4,1,5,…):如果n=(2k-1)*2^m,则a(n)=k,或T(1)的极限不动点,其中T(a,b,c,…)=(1、a,2,b,3,c,4…)。
程序
通过增加每个值的特定计数器,可以在线性时间内进行转换。
枫树
(枫树)ORDINAL:=进程(a)本地计数,x;count:=表格(稀疏);#默认情况下,未定义的条目为零[seq(++count[x],a中的x)];#++var是一个表达式,而不是像var+=1这样的语句结束;
(枫叶)#来自N.J.A.Sloane,2020年4月9日:ORDINAL:=proc(a)局部b,t1,tlist,clist,n,t,nt;如果是whattype(a)<>列表,则返回([]);传真:t1:=nops(a);t列表:=[];clist:=数组(1..t1,0);b: =[];nt:=0;对于从1到t1的n,t:=a[n];如果成员(t,tlist,'p'),则clist[p]:=clist[p]+1;b: =[op(b),clist[p]];否则nt:=nt+1;tlist:=[op(tlist),t];clist[nt]:=1;b: =[操作(b),1];fi;日期:b;结束;
PARI/GP公司
(PARI)ORDINAL(a,c=Map())=[mapput(c,x,a=ifrer(mapget(c,x),a,)+1)+a|x<-a]}
评论:
-
映射输出()
返回一个空结果,结果为0,新计算和存储的值a=c[x]添加,以便仅使用一个表达式。(或者,可以使用[a=…,映射(c,x,a)][1]
.)
- 而不是
ifrer(…)
当出现错误时返回0x个还没有出现在字典里c(c),也可以使用if(映射定义为(c,x,&a),a)
,但除了有点长之外,它似乎也稍微慢一些。
- 一旦提供的价值一个=[一1, ..., 一n个]已用作运行变量的域x个,相同的变量名一在“循环”中用于临时存储更新的值c(c)[x个]。这只是为了避免引入另一个变量。
蟒蛇
(Python)定义ORDINAL(a):c={};return[c.setdefault(x,c.pop(x,0)+1)for x in a]
丢弃字典条目c[x]并在随后重新创建,而不是仅仅增加其值,这看起来效率很低。然而,递增变量是一个语句,不能用作结果列表值的表达式。避免这种情况的唯一方法是在辅助函数中增加字典条目,例如:
(Python)def-inc(c,x):t=c.get(x,0)+1;c[x]=t;return t#使用t可以避免访问c[x]3次:大约快1.25倍定义ORDINAL(a):c={};返回[inc(c,x)for x in a]
如我们所见,这还需要访问字典的条目c[x]至少两次。除非删除条目c[x]会产生很多开销,否则第二种解决方案并不比第一种更有效。例如,对于序列一长度为1000时,第一个解决方案大约占75%,第二个解决方案占使用的解决方案的CPU时间的80%定义增量(c,x):c[x]=c.get(x,0)+1;返回c[x]
(或等效地使用函数c.更新(x=…)
它返回无
).
引用为
M.F.Hasler,顺序变换.— 摘自整数序列在线百科全书®Wiki(OEIS®Wiki)。[https://oeis.org/wiki/Ordinal_transform网站]. 初始版本创建于2020年4月9日。