【问题标题】:Java / C# - Array[][] complexity task [duplicate]Java / C# - Array[][] 复杂性任务 [重复]
【发布时间】:2023-03-25 19:08:01
【问题描述】:

我正在通过我的大学处理一些有问题的复杂性问题:

程序输入:n x nArray[][] 填充有01

定义:如果k 行中的所有值都是0,并且k 列中的所有值都是1,则将k 定义为SINK(除了[k][k] 本身需要是0)

程序输出:是否有一个 k 数是 SINK?如果是,则返回k,否则返回-1

例子:

在 Arr A 上 k=3 是 SINK,在 Arr B 上没有 SINK,因此返回 -1。

这个任务的主要问题是程序的复杂性必须低于O(n^2),我已经设法用这种复杂性解决了这个问题,越过对行和列求和的斜线。我还没有找到用O(logn)O(n) 解决这个问题的方法。该任务还阻止您使用另一个 Array[] (由于内存复杂性)。任何人都可以对此事有所了解吗?提前致谢!

【问题讨论】:

  • 内存复杂度的限制究竟是什么?由于已经使用了 O(n^2),因此额外的 O(n) 应该不会造成伤害。
  • 我已经设法用 O(n^2) 解决了这个问题,但这不是任务的要求。它需要少于那个。如果您能找到一种使用 O(n) 内存复杂度(没有准时 O(n^2) )解决此问题的方法,那也将非常有帮助。
  • 您的意见是什么?二维数字数组?还是像字符串一样存储的表?
  • 二维数字数组(0或1)

标签: c# java arrays algorithm task


【解决方案1】:

只是为了明确回答 harold 在 OP 的 cmets 中的链接:从所有 n 索引、S = {0, 1, .., n-1} 的列表开始。这些是我们的水槽候选者。在每一步,我们都将消除其中一个。

  1. 考虑S 的前两个元素,例如ij
  2. 检查A[i, j]是否为1。
    • 如果是,则从 S 中删除 i(因为第 i 行不全为 0,所以 i 不能成为我们的接收器)
    • 如果不是,请从 S 中删除 j(因为第 j 列并非全为 1,因此 j 不能成为我们的接收器)
  3. 如果 S 中仍有两个或更多元素,请返回步骤 1。
  4. 当我们到达最后一个元素时,比如k,检查第 k 行是否全为零和第 k 列(A[k,k] 除外) ) 都是一。
    • 如果是,k 是一个接收器,您可以将其退回。
    • 如果没有,则矩阵没有接收器,您可以返回 -1

一开始S 中有n 元素,每一步都会消除其中一个,并且每一步都需要恒定的时间,所以总体上是O(n)

您提到您不想使用第二个数组。如果这真的很严格,你可以只使用两个整数,一个代表最后一步的“幸存者”,一个代表你在序列 0, 1, .., n-1 中的距离是。

我以前从未见过这种算法,它的简单性给我留下了深刻的印象。干杯。

【讨论】:

  • 看起来不错,非常感谢。我会继续尝试一下!你能深入解释一下如何用两个整数解决这个问题吗?
  • 我们称这两个整数为survivorchallenger。将它们初始化为survivor = 0, challenger = 1。如果A[survivor, challenger] == 1,则设置survivor = challenger(因为survivor 不能是接收器,因为它的行中有1)并递增challenger。如果A[survivor, challenger] == 0,那么您只需增加challenger(因为challenger 不能成为接收器,因为它的列中有一个0)。当challenger == n 时,你就完成了,当前的survivor 是唯一可能的接收器,然后你验证它。
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多