本网站由以下捐款支持:OEIS基金会.

顺序变换

来自OeisWiki
跳转到:航行,搜索

定义

这个序数变换序列的是顺序具有

,值的次数出现在中.

在上面,是序列的域即指数集:如果我们考虑一个序列相反,那么.

示例

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:=进程(a)局部b,t1,tlist,clist,n,t,nt;如果是whattype(a)<>列表,则返回([]);图1: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(mapisdefined(c,x,&a),a),但除了有点长之外,它似乎也稍微慢一些。
  • 一旦提供的价值一个=[1, ..., n个]已用作运行变量的域x个,相同的变量名在“循环”中用于临时存储更新的值c(c)[x个]。这只是为了避免引入另一个变量。

蟒蛇

(Python)定义ORDINAL(a):c={};return[c.setdefault(x,c.pop(x,0)+1)表示a中的x

丢弃字典条目c[x]并在随后重新创建,而不是仅仅增加其值,这看起来效率很低。然而,递增变量是一个语句,不能用作结果列表值的表达式。避免这种情况的唯一方法是在辅助函数中增加字典条目,例如:

(Python)定义增量(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日。