根据索引查找金字塔行?

时间:2016-05-29 18:57:11

标签: math indexing computer-science

给出一个金字塔:

      0
     1 2
    3 4 5
   6 7 8 9
     ...

并给出金字塔i的索引,其中i代表金字塔的i个数字,是否有办法找到i行的索引1}}元素属于哪个? (例如,如果i = 6,7,8,9,则它位于第3行,从第0行开始)

3 个答案:

答案 0 :(得分:5)

行号和三角数之间有联系。 nth triangular number,表示为T n ,由T n = n(n-1)/ 2给出。第一对三角形数字是0,1,3,6,10,15等,如果你注意到,每行的开头都是由第n个三角形数字给出的(它们来自这个三角形的事实是这个名字的来源。)

实际上,这里的目标是确定最大的n,使得T n ≤i。没有做任何聪明的数学,你可以通过计算T 0 ,T 1 ,T 2 在时间O(√n)中解决这个问题,等到你找到比我更大的东西。更好的是,您可以通过计算T 1 ,T 2 ,T 4 ,T <,在时间O(log n)中二进制搜索它。 sub> 8 等等,直到你超调,然后二进制搜索你找到的范围。

或者,我们可以尝试直接解决这个问题。假设我们想要找到n的选择

  

n(n + 1)/ 2 = i

扩展,我们得到

  

n 2 / 2 + n / 2 = i。

同样地,

  

n 2 / 2 + n / 2 - i = 0,

或更容易:

  

n 2 + n - 2i = 0。

现在我们使用二次公式:

  

n =( - 1±√(1 + 8i))/ 2

我们可以忽略的负根,所以我们想要的n的值是

  

n =( - 1 +√(1 + 8i))/ 2。

这个数字不一定是整数,所以为了找到你想要的行,我们只需向下舍入:

  

row =⌊(-1 +√(1 + 8i))/2⌋。

在代码中:

int row = int((-1 + sqrt(1 + 8 * i)) / 2);

让我们通过测试一下来确认这是有效的。 9去哪儿了?好吧,我们有

  

( - 1 +√(1 + 72))/ 2 =( - 1 +√73)/ 2 = 3.77

四舍五入,我们看到它排在第3行 - 这是正确的!

尝试另一个,55去哪儿了?那么,

  

( - 1 +√(1 + 440))/ 2 =(√441 - 1)/ 2 = 10

所以它应该在第10行。第十个三角形数字是T 10 = 55,所以事实上,55从该行开始。看起来很有效!

答案 1 :(得分:0)

我认为if(one === '') // compare with empty string directly, I recommend this if(!one) // check if "falsy" (which for strings mean empty) if(one.length === 0) // check if string has no length 元素属于inn的数量

例如,如果n(n+1)/2 <= i < (n+1)(n+2)/2,则为i = 6,因为n = 3 如果是n(n+1)/2 <= 6,那么i = 8因为n = 3

答案 2 :(得分:0)

我得到row = math.floor(√(2i + 0.25) - 0.5)其中i是你的号码

基本上与上面的那个人相同,但我将n 2 + n减少到(n + 0.5) 2 - 0.25