#作者:Peter Luschny,2024年3月14日“”AlgoP枚举嵌套括号。实现了Knuth的《计算机编程艺术》中的算法P,(TAOCP,第4A卷,第443页)。用法:python AlgoP.py number'''定义访问(a):p=“”.加入(a)[1:]b=p.replace(“)”,“0”).替换(“(”,“1”)打印(p,b,int(b,2))定义算法(k):“”打印顺序为k的所有嵌套括号集“”n=k#paren数m=2*n-1#“索引值”打印(f“--{n}--”)如果n==0:访问(['.','0'])#P0算法需要n>=2如果n==1:访问(['.','(',')'])如果n<=1:返回p=[')',用于_范围(m+2)]#P1初始化对于范围(1,n+1)中的k:p[2*k-1]='('为True时:就诊(p)#P2就诊步骤p[m]=')'#P3简易案例如果p[m-1]==“)”:p[m-1]='('m-=1持续j=m-1#P4查找jk=2*n-1而p[j]=='(':#几乎总是短的p[j]=')'p[k]='('j=1k-=2如果j==0:return#P5增加a_jp[j]='('m=2*n-1# =================================================================“”AlgoU取消排列嵌套括号字符串。实现Knuth的《计算机编程艺术》中的算法U,(TAOCP,第4A卷)。用法:python AlgoU.py数字'''定义AlgoU(n,n):“前提条件:1<=N<=CatalanNumber(N)。”q=n#U1初始化m=p=c=1a=['0'代表范围内的_(2*n+1)]而p<n:p=p+1c=((4*p-2)*c)//(p+1)为True时:如果q==0:#U2完成?访问(a)返回cc=((q+1)*(q-p)*c)//((q+p)*(q-p+1))如果N<=cc:#U3向上q=q-1c=立方厘米a[m]=')'m=米+1持续p=p-1#U4向左c=c-立方厘米N=N-立方厘米a[m]='('m=米+1# =============================================================================#这是Indranil Ghosh计算A063171的Python程序的更新。#虽然遵守了总体施工计划,但一些细节#发生了巨大变化。除缓存外,不使用任何库函数。#更新是从Python 2.7.11到Python3.11.6。-Peter Luschny,2024年3月13日从functools导入缓存@高速缓存定义a000108(n:int):如果n<2:返回1返回(a000108(n-1)*(4*n-2))//(n+1)@高速缓存定义a014137(n:int):如果n==0:返回1返回a000108(n)+a014137(n-1)定义a072643(n:int):如果n<2:返回nj=0而n+1>a014137(j):j+=1返回j@高速缓存定义a009766(n:int):如果n==0:返回[1]行=a009766(n-1)+[0]对于范围(1,n+1)中的k:行[k]+=行[k-1]返回行定义加泰罗尼亚UnRank(n:int,rr:int):r=a000108(n)-(rr+1)a=lo=0t=ny=n-1当y>=0时:m=a009766(t)[年]a≤1如果r<(lo+m):y=1a+=1其他:lo+=米t-=1返回a<<t定义a014486(n:int):如果n==0:返回0a=a072643(n)return加泰罗尼亚UnRank(a,n-a014137(a-1))定义a063171(n:int):返回int(bin(a014486(n))[2:])如果__name__=='__main__':从二项式的数学导入梳print(“\nIndranil Ghosh的实现”)打印([a063171(n)表示范围(65)内的n)]打印(“\n算法P\n”)对于范围(5)中的n:AlgoP(n)打印(“算法U”)对于范围(2,6)中的n:C=二项式(2*n,n)//(n+1)试验=[1,n,C//2,(3*C)//4,C]对于测试中的N:AlgoU(N,min(C,max(1,N))打印(“\nDemo\n”)print(“计算15对嵌套括号的第一百万次迭代。”)AlgoU(15、10**6)