【问题标题】:Advanced Algorithms Problems ("Nice Triangle"): Prime number Pyramid where every number depends on numbers above it高级算法问题(\"Nice Triangle\"):质数金字塔,其中每个数字都取决于它上面的数字
【发布时间】:2023-01-08 04:54:37
【问题描述】:

我目前正在学习高级算法和数据结构考试,但我似乎无法解决以下练习题之一:

1.14) “尼斯三角”

一个“漂亮”的三角形定义如下:

  1. 三角形由三个不同的数组成,即前三个素数(2、3、5)。
  2. 每个数字都以下列方式依赖于它下面的两个数字。
    • 数字相同,结果数也相同。 (2, 2 => 2)
    • 数字不同,结果数字为剩余数字。 (2, 3 => 5)

    给定一个长度为 L 的整数 N,对应于三角形的底边,确定顶部的最后一个元素

    例如: 给定 N = 25555(因此 L = 5),三角形如下所示:

        2
       3 5
      2 5 5
     3 5 5 5
    2 5 5 5 5
    

    => 2 是这个例子的结果

    每个数字都是质数这一事实与问题有什么关系?

    通过使用一种朴素的方法(简单地计算每一行),可以获得 O(L^2) 的时间复杂度。 然而,教授说,O(L) 是可能的,但我就是找不到任何模式!!!

【问题讨论】:

  • 通过过多的测试,在我看来,好像在索引 i 和 L-i 交换数字不会改变结果,但我完全缺乏它背后的直觉,我不知道如何使用这个事实。
  • 你是对的。请参阅我的答案中的第一个选项。 i 处的数字被添加到输出的次数与 L-i 处的数字相同

标签: algorithm data-structures dynamic-programming


【解决方案1】:

我不确定为什么这个问题会用在高级算法课程中,但是是的,你可以在 O(l) = O(log n) 时间内完成。

有几种方法可以做到这一点,但它们都依赖于认识到这一点:

  1. 对于问题陈述,使用什么数字并不重要。让我们使用 0、1 和 2 而不是 2、3 和 5。然后
  2. 如果 a 和 b 是输入数,c 是输出数,则 c = -(a+b) mod 3
  3. 您可以改为使用 c = a+b mod 3 来构建整个三角形,然后每隔一行取反。

    现在,您可以在 O(log n) 时间内执行此操作的两种方法是:

    • 对于输入中的每个数字 d,计算它被添加到最终总和中的次数(称为 k),将所有 kd mod 3 相加,如果您以偶数开始,则将结果取反的数字。每个数字需要恒定的时间。或者:
    • 认识到您可以在常数时间内对 n 大小的值进行算术运算。创建一个值,它是 n 中所有数字的位掩码。每个需要 2 位。然后通过使用按位运算,您可以在恒定时间内计算前一行的每一行,总共为 O(log n) 时间。

【讨论】:

  • 感谢您的回复,使用模运算得到一个封闭的数学表达式似乎是合理的。我想这个问题给我的困惑来自于这样一个事实,即我们以前从未做过这样的事情,而且这个问题列在介绍性问题下。
  • 你是说mod 3,对吧?
  • 多少次?如果输入数组有 n 个数字,并且我们正在查看从一个边开始的第 k 个数字(从第一个开始),那么 k * (n - k + 1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多