KDB中如何遍历M*N个网格
How to traverse M*N grid in KDB
Qlang中如何遍历m*n个网格,可以向上遍历,向下遍历,对角遍历。
找出有多少种可能到达终点的方法。
喜欢下面:
0
|
------- ------
| | |
( 0 1) (1 1) (1 0)
| . |
------ ----- ------ -----
| | . | |
( 0 1) (1 0) ( 1 1) (2 0)
....
(2 2) ..................... (2 2)
一种方法是使用 .z.s
递归调用具有不同参数的初始函数并求和以给出路径总数。
f:{
// When you reach a wall, there is only one way to corner so return valid path
if[any 1=(x;y);:1];
// Otherwise spawn 3 paths - one up, one right and one diagonally
:.z.s[x-1;y] + .z.s[x;y-1] + .z.s[x-1;y-1]
}
q)f[2;2]
3
q)f[2;3]
5
q)f[3;3]
13
如果您沿着边缘而不是正方形行进,您可以将第一行更改为:
if[any 0=(x;y);:1];
一个封闭形式的解决方案就是找到 Delannoy Number,当你沿着边缘行进时,它可以像这样实现。
d:{
k:1+min(x;y);
f:{prd 1+til x};
comb:{[f;m;n] f[m] div f[n]*f[m-n]}[f];
(sum/) (2 xexp til k) * prd (x;y) comb/:\: til k
}
q)d[3;3]
63f
这对于较大的电路板来说要快得多,因为我认为第一个解决方案的复杂性是 O(3^m+n),而第二个解决方案的复杂性是 O(m*n)
q)\t f[7;7]
13
q)\t f[10;10]
1924
q)\t d[7;7]
0
q)\t d[100;100]
1
Qlang中如何遍历m*n个网格,可以向上遍历,向下遍历,对角遍历。 找出有多少种可能到达终点的方法。
喜欢下面:
0 | ------- ------ | | | ( 0 1) (1 1) (1 0) | . | ------ ----- ------ ----- | | . | | ( 0 1) (1 0) ( 1 1) (2 0) .... (2 2) ..................... (2 2)
一种方法是使用 .z.s
递归调用具有不同参数的初始函数并求和以给出路径总数。
f:{
// When you reach a wall, there is only one way to corner so return valid path
if[any 1=(x;y);:1];
// Otherwise spawn 3 paths - one up, one right and one diagonally
:.z.s[x-1;y] + .z.s[x;y-1] + .z.s[x-1;y-1]
}
q)f[2;2]
3
q)f[2;3]
5
q)f[3;3]
13
如果您沿着边缘而不是正方形行进,您可以将第一行更改为:
if[any 0=(x;y);:1];
一个封闭形式的解决方案就是找到 Delannoy Number,当你沿着边缘行进时,它可以像这样实现。
d:{
k:1+min(x;y);
f:{prd 1+til x};
comb:{[f;m;n] f[m] div f[n]*f[m-n]}[f];
(sum/) (2 xexp til k) * prd (x;y) comb/:\: til k
}
q)d[3;3]
63f
这对于较大的电路板来说要快得多,因为我认为第一个解决方案的复杂性是 O(3^m+n),而第二个解决方案的复杂性是 O(m*n)
q)\t f[7;7]
13
q)\t f[10;10]
1924
q)\t d[7;7]
0
q)\t d[100;100]
1