Algorithm 当x<;Y

Algorithm 当x<;Y,algorithm,haskell,Algorithm,Haskell,在过去,我经常使用以下类型的循环(Haskell示例): upperBoundToTuples::Int->[(Int,Int)] 上边界元组n=[(x,y)x] p>你要求从[0,n(n+1)/2)到双(x,y)与0<p>的双射。你要求从[0,n(n+1)/2)到双(x,y)与0<p>的双射,我们可以等效地考虑。这个列表的长度 &厄尔;n=x=0∑氮氧化物 因此,对于给定的&ell;,我们可以通过 2·&ell;n=n·(n+1)=n2+n n~=-½&pm;√(¼+2·&ell;n) 特别

在过去,我经常使用以下类型的循环(Haskell示例):

upperBoundToTuples::Int->[(Int,Int)]

上边界元组n=[(x,y)x] p>你要求从[0,n(n+1)/2)到双(x,y)与0<p>的双射。你要求从[0,n(n+1)/2)到双(x,y)与0<p>的双射,我们可以等效地考虑。这个列表的长度

&厄尔;n=x=0∑氮氧化物

因此,对于给定的&ell;,我们可以通过

2·&ell;n=n·(n+1)=n2+n

n~=-½&pm;√(¼+2·&ell;n)

特别是对于给定的索引i

倪− = ⌊-½和下午;√(¼+2·i)⌋

是最后一个完整三角形的x长度。因此,索引i位于第ni行−+1.那个三角形的面积为

&厄尔尼− = 镍−·(倪−+1) /2

因此,我们需要从i中减去,得到余数索引(在y方向上)。这就产生了定义

lowerTriangularTuple :: Int -> (Int,Int)
lowerTriangularTuple i = (nmin+1, i - (nmin*(nmin+1))`div`2)
 where nmin = floor $ -1/2 + sqrt(1/4 + 2 * fromIntegral i)
例如:

GHCi> lowerTriangularTuple <$> [0..30]
[(1,0),(2,0),(2,1),(3,0),(3,1),(3,2),(4,0),(4,1),(4,2),(4,3),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(6,4),(6,5),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(8,0),(8,1),(8,2)]
GHCi>lowerTriangularTuple[0..30]
[(1,0),(2,0),(2,1),(3,0),(3,1),(3,2),(4,0),(4,1),(4,2),(4,3),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(6,4),(6,5),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(8,0),(8,1),(8,2)]

< /代码> 我们可以等效地考虑。这个列表的长度

&厄尔;n=x=0∑氮氧化物

因此,对于给定的&ell;,我们可以通过

2·&ell;n=n·(n+1)=n2+n

n~=-½&pm;√(¼+2·&ell;n)

特别是对于给定的索引i

倪− = ⌊-½和下午;√(¼+2·i)⌋

是最后一个完整三角形的x长度。因此,索引i位于第ni行−+1.那个三角形的面积为

&厄尔尼− = 镍−·(倪−+1) /2

因此,我们需要从i中减去,得到余数索引(在y方向上)。这就产生了定义

lowerTriangularTuple :: Int -> (Int,Int)
lowerTriangularTuple i = (nmin+1, i - (nmin*(nmin+1))`div`2)
 where nmin = floor $ -1/2 + sqrt(1/4 + 2 * fromIntegral i)
例如:

GHCi> lowerTriangularTuple <$> [0..30]
[(1,0),(2,0),(2,1),(3,0),(3,1),(3,2),(4,0),(4,1),(4,2),(4,3),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(6,4),(6,5),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(8,0),(8,1),(8,2)]
GHCi>lowerTriangularTuple[0..30]
[(1,0),(2,0),(2,1),(3,0),(3,1),(3,2),(4,0),(4,1),(4,2),(4,3),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(6,4),(6,5),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(8,0),(8,1),(8,2)]

将这些
(x,y)
索引指定为一个索引是什么意思?是否需要类似
getPair::Int->(Int,Int)的函数
给定一个数字
i
返回
i
第对,该对以某种方式排序?还是什么?@Bakuriu这两个答案都有其要点。你确实正确地回答了我的问题。这意味着“将这些
(x,y)
索引指定为单个索引”是什么意思?你想要一个类似
getPair::Int->(Int,Int)
给定一个数字
i
返回
i
th对,该对以某种方式排序?或者什么?@Bakuriu这两个答案都有其要点。你确实正确地回答了我的问题。我没想到我能通过二次方程得到这个问题的答案。你的答案具有排序的优点,而不是必需的圈出上限。特别是排序有利于缓存的局部性。如果没有昂贵的
sqrt
,它将是完美的。尽管如此,我认为它需要更详细地阐述。我不明白为什么解二次方程,然后取它的底值会给出正确的答案。我也不明白
(nmin+1,i-(nmin*(nmin+1))第2部分)
部分。我解释了更多。-我很确定可以用更快的近似值代替平方根,但我不确定稳定性。我们在这里讨论的是什么样的三角形?我不清楚它们与这个问题有什么联系。请记住,我不是数学家,我们大多数人也不是程序员们会看这个问题。如果这个问题解释的时间太长的话,也许你可以发布一些关于这个问题的参考资料。受回复的激励,我自己在网上看了一些关于配对函数的文章,但我只能找到非有序配对的信息。好的,它为我点击了。在那个维基上有一些图片佩奇帮了忙。首先你通过二次方程将n最小化,结果是x,然后通过从余数中减去i来计算y。太棒了。我会接受保罗·汉金的答案,因为这在实践中会更有效,但你的答案确实让我想了很多。谢谢。我没想到我能得到这个问题的答案是通过二次方程得到的。你的答案有被排序的好处,并且不需要上界。被排序特别有利于缓存的局部性。如果不是因为昂贵的
sqrt
,它将是完美的。尽管如此,我认为它需要更详细地阐述。我不明白为什么要求解二次方程和我也不理解
(nmin+1,I-(nmin*(nmin+1))第2部分)
部分。我解释了更多。-我很确定可以用更快的近似值代替平方根,但我不确定稳定性。我们在这里讨论的是什么样的三角形?我不清楚它们与这个问题有什么联系。请记住,我不是数学家,我们大多数人也不是程序员们会看这个问题。如果这个问题解释的时间太长的话,也许你可以发布一些关于这个问题的参考资料。受回复的激励,我自己在网上看了一些关于配对函数的文章,但我只能找到非有序配对的信息。好的,它为我点击了。在那个维基上有一些图片佩奇帮了忙。首先你通过二次方程将n最小化,结果是x,然后通过从余数中减去i来计算y。太棒了。我会接受保罗·汉金的答案,因为这在实践中会更有效,但你的答案确实让人深思了。谢谢。这是一种非常巧妙的方法。actually,现在我看了一下更大的循环,它是半排序的
sequence(N, k, index)
    = []                                           if k == 0
    = sequence(N - 1, k - 1, index) + [N]          if index < choose(N, k - 1)
    = sequence(N - 1, k, index - choose(N, k - 1)) otherwise
 0 -> [3, 4, 5]
 1 -> [2, 4, 5]
 2 -> [1, 4, 5]
 3 -> [0, 4, 5]
 4 -> [2, 3, 5]
 5 -> [1, 3, 5]
 6 -> [0, 3, 5]
 7 -> [1, 2, 5]
 8 -> [0, 2, 5]
 9 -> [0, 1, 5]
10 -> [2, 3, 4]
11 -> [1, 3, 4]
12 -> [0, 3, 4]
13 -> [1, 2, 4]
14 -> [0, 2, 4]
15 -> [0, 1, 4]
16 -> [1, 2, 3]
17 -> [0, 2, 3]
18 -> [0, 1, 3]
19 -> [0, 1, 2]
lowerTriangularTuple :: Int -> (Int,Int)
lowerTriangularTuple i = (nmin+1, i - (nmin*(nmin+1))`div`2)
 where nmin = floor $ -1/2 + sqrt(1/4 + 2 * fromIntegral i)
GHCi> lowerTriangularTuple <$> [0..30]
[(1,0),(2,0),(2,1),(3,0),(3,1),(3,2),(4,0),(4,1),(4,2),(4,3),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(6,4),(6,5),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(8,0),(8,1),(8,2)]