[แก้ไข: เสน่ห์ครั้งที่ 4 ในที่สุดสิ่งที่เหมาะสม]
ฉันย้อนกลับไปที่นี้: ฉันเริ่มต้นด้วยคำตอบอื่นที่แสดงวิธีการกรองโดยใช้และใช้เพื่อสร้างชุดค่าผสมที่ถูกต้องทั้งหมดสำหรับชุดของค่าและดูลำดับบนฐานข้อมูลลำดับเลขจำนวนเต็มออนไลน์ จำนวนชุดค่าผสมคือn 2 ( n 2 + 3 )ซึ่งดูไม่น่าเป็นไปได้ (ทำไมต้องเป็น 3) นอกจากนี้ยังเป็นt ( t ( n ) ) + t ( t ( n - 1 ) )โดยที่t ( a )คือหมายเลขสามเหลี่ยมของann2( n2+ 3 )t ( t ( n) ) ) + t ( t ( n - 1 ) )t ( a )a, 2 เมื่อได้รับสิ่งนี้เราต้องรู้ว่าทำไมt ( a ) = a ( a + 1 ) / 2
เทอมแรกนั้นง่ายกว่า - คู่ของคู่ที่และt i d ( i , j ) ≥ t ฉันd ( k , l ) , ที่t ฉันd ( a , b )คือดัชนีสามเหลี่ยมของa , ข . ฟังก์ชั่นแบบนี้:ฉัน≥ jt ฉันวันที่( i , j ) ≥ t ฉันd( k , l )t ฉันวันที่( a , b )a , b
def ascendings(n):
idx = 0
for i in range(1,n+1):
for j in range(1,i+1):
for k in range(1,i):
for l in range(1,k+1):
idx = idx + 1
print(i,j,k,l)
k=i
for l in range(1,j+1):
idx = idx + 1
print(i,j,k,l)
return idx
ล.ล.k
t ( t ( n - 1 ) )
def mixcendings(n):
idx = 0
for j in range(2,n+1):
for i in range(1,j):
for k in range(1,j):
for l in range(1,k):
print(i,j,k,l)
idx = idx + 1
k=j
for l in range(1,i+1):
print(i,j,k,l)
idx = idx + 1
return idx
การรวมกันของทั้งสองสิ่งนี้ทำให้ชุดสมบูรณ์ดังนั้นการวางลูปทั้งสองเข้าด้วยกันทำให้เรามีดัชนีครบชุด
n
ในไพ ธ อนเราสามารถเขียนตัววนซ้ำต่อไปนี้เพื่อให้ค่า idx และ i, j, k, l สำหรับแต่ละสถานการณ์ที่แตกต่างกัน:
def iterate_quad(n):
idx = 0
for i in range(1,n+1):
for j in range(1,i+1):
for k in range(1,i):
for l in range(1,k+1):
idx = idx + 1
yield (idx,i,j,k,l)
#print(i,j,k,l)
k=i
for l in range(1,j+1):
idx = idx + 1
yield (idx,i,j,k,l)
for i in range(2,n+1):
for j in range(1,i):
for k in range(1,i):
for l in range(1,k):
idx = idx + 1
yield (idx,i,j,k,l)
k=i
for l in range(1,j+1):
idx = idx + 1
yield (idx,i,j,k,l)
ฉันn3+ j n2+ k n + l
integer function squareindex(i,j,k,l,n)
integer,intent(in)::i,j,k,l,n
squareindex = (((i-1)*n + (j-1))*n + (k-1))*n + l
end function
integer function generate_order_array(n,arr)
integer,intent(in)::n,arr(*)
integer::total,idx,i,j,k,l
total = n**2 * (n**2 + 3)
reshape(arr,total)
idx = 0
do i=1,n
do j=1,i
do k=1,i-1
do l=1,k
idx = idx+1
arr(idx) = squareindex(i,j,k,l,n)
end do
end do
k=i
do l=1,j
idx = idx+1
arr(idx) = squareindex(i,j,k,l,n)
end do
end do
end do
do i=2,n
do j=1,i-1
do k=1,i-1
do l=1,j
idx = idx+1
arr(idx) = squareindex(i,j,k,l,n)
end do
end do
k=i
do l=1,j
idx = idx+1
arr(idx) = squareindex(i,j,k,l,n)
end do
end do
end do
generate_order_array = idx
end function
แล้ววนซ้ำไปเรื่อย ๆ
maxidx = generate_order_array(n,arr)
do idx=1,maxidx
i = idx/(n**3) + 1
t_idx = idx - (i-1)*n**3
j = t_idx/(n**2) + 1
t_idx = t_idx - (j-1)*n**2
k = t_idx/n + 1
t_idx = t_idx - (k-1)*n
l = t_idx
! now have i,j,k,l, so do stuff
! ...
end do