【问题标题】:How to approach optimizing algorithm with discrete如何使用离散方法进行优化算法
【发布时间】:2020-07-29 21:32:58
【问题描述】:

我遇到了this answer,他说有一个比 O(n^2) 更快的“花哨的离散数学”。我无法理解如何在 O(n^2) 下完成链接的问题。

我将如何处理离散问题以尝试理解更快的解决方案?

任务描述:

在列表中查找“幸运三元组”的数量。 “幸运三元组”被定义为“在列表 lst 中,对于三元组的任意组合,例如 (lst[i], lst[j], lst[k]) 其中 i

【问题讨论】:

  • 确切的引用是“可能有一些更好的算法使用花哨的离散数学来更快地完成它”。 “可能有”和“有”之间有很大的区别。前者意味着作者不知道这样的解决方案,后者意味着作者知道存在这样的解决方案。
  • 也许有一种方法可以链接除数链中的元素,只在原始数组中迭代一次......
  • @user3386109 我的问题更多是关于如何通过寻找这样的解决方案的过程来思考

标签: algorithm math time-complexity mathematical-optimization discrete-mathematics


【解决方案1】:

似乎我们没有足够的信息来回答,因为答案还取决于列表中的最大元素m。比O(n^2) 更快的两种方法是n^2 > n * sqrt(m) 或n^2 > m * log(m) + n * log(m)。

在第一种情况下,我们可以通过直接枚举遍历每个 lst[i]s 除数,花费时间 O(sqrt(lst[i])),并查看其中有多少已被看到,已记录了已看到除数的计数. (对于我们的讨论,除数的数量是恒定的,因为在我们的条件下,它的大小与m 和n 相比可以忽略不计。)例如,

2 8 5 16

2  -> nothing to do
8  -> divisors 2 4
      record {8: 1 divisor seen}
5  -> no divisors seen
16 -> divisors 2 4 8
      found 8 with 1 count in our record
      
Total 1 triple

在第二种方法中,我们预先计算了从 2 到 m 的每个数字的最小素因数,以便我们能够将 O(log lst[i]) 中的每个列表元素因式分解。然后,我们需要一个额外的步骤来生成除数(在我们的条件下,我们可以再次将其数量视为常数)并执行与第一个类似的遍历。如果n 非常大,此方法可能会有所帮助,以便尽管有额外的m log m 成本仍然受益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2017-04-05
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多