降低无向图的时间复杂度

2024-01-10

我有一个无向图,表示 Facebook 等社交媒体中的用户连接。 有N个节点,从1到N 边由数组 from 和 to 表示。 任务数组表示我有兴趣查找该节点(即社交媒体中的用户)的连接的节点号。

Example:

N = 5
From = [2,2,1,1]
To = [1,3,3,4]
Task = [4,2,5]

Answer:

[4,4,1]

解释:

该图如下所示:

Now for Task [4,2,5]

4 -> [1,2,3,4] The node 4 has these connections 
2 -> [1,2,3,4] The node 2 has these connections 
5 -> [5]

所以结果是 [4,4,1]

限制条件:

N=2 to 10^5
size of arrays from, 'to', and tasks is 2 to 10^5

这是一个黑客级别的问题。我的代码在 15 个测试用例中有 8 个失败,表示大输入出现超时错误。

这是我的代码:

public static List<Integer> solve(int N, List<Integer> from, List<Integer> to, List<Integer> tasks) {
    int n = from.size();
    // Create the graph
    Map<Integer, Set<Integer>> map = new HashMap<>();
    for(int i=0; i<n; i++) {
        int key1 = from.get(i);
        int key2 = to.get(i);
        
        Set<Integer> value = map.getOrDefault(key1, new HashSet<>());
        value.add(key2);
        map.put(key1, value);
        
        value = map.getOrDefault(key2, new HashSet<>());
        value.add(key1);
        map.put(key2, value);       
    }
    List<Integer> result = new ArrayList<>();
    for(int node: tasks) {
        result.add(bfs(map, node));
    }
    return result;
}
    // Solve using breadth first search approach
public static int bfs(Map<Integer, Set<Integer>> map, int node) {
    Set<Integer> visited = new HashSet<>();
    Queue<Integer> q = new LinkedList<>();
    int count = 0;
    visited.add(node);
    q.add(node);
    while(!q.isEmpty()) {
        node = q.poll();
        count++;
        Set<Integer> val = map.get(node);
        if(val != null) {
            for(int next : val) {
                if(visited.add(next)) {
                    q.add(next);
                }
            }
        }
    }
    return count;
}

我也尝试了递归方法,仍然存在同样的问题,对于较大的输入大小值,我遇到超时错误。

如何降低这段代码的时间复杂度。


当输入较大时,BFS 算法将一遍又一遍地在同一图组件上运行,始终得出相同的节点数。这是一个遗憾。一种解决方案是立即第二次重复 BFS,但然后用您在第一阶段中找到的计数标记访问过的节点。每当 BFS 将在已经具有该标记的节点上调用时,您只需返回该标记并跳过 BFS 执行即可。

替代方案:不相交集

而不是创建一个graph,你可以创建一个不相交集数据结构 https://en.wikipedia.org/wiki/Disjoint-set_data_structure。该结构知道成分节点是组件的一部分,并且可以在填充结构时跟踪组件的大小。它不会精确跟踪图的所有边,而只会为每个节点维护一个链接,只是为了跟踪组件成员资格。

有几种替代算法可以合并两个组件。一种是“按大小联合”,这在这里似乎很合适,因为我们对大小感兴趣。

这是一个可能的实现DisjointSets class:

import java.util.*;

class DisjointSets<T> {
    private class Node {
        Node parent;
        int size;
        T key;

        Node(T key) {
            this.key = key;
            this.size = 1;  // The node starts as its own component
            this.parent = this;
        }
    }

    Map<T, Node> nodes = new HashMap<>();

    private Node find(T key) {
        Node node = nodes.computeIfAbsent(key, Node::new);
        while (node.parent != node) {
            node = node.parent = node.parent.parent; // Path halving
        }
        return node;
    }

    public void union(T keyA, T keyB) {
        Node nodeA = find(keyA);
        Node nodeB = find(keyB);
        if (nodeA == nodeB) return; // Already in same set
        if (nodeA.size < nodeB.size) {
            nodeA.parent = nodeB;
            nodeB.size += nodeA.size;
        } else {
            nodeB.parent = nodeA;
            nodeA.size += nodeB.size;
        }
    }

    public int size(T key) {
        return find(key).size;
    }
}

The solve那么函数可以是:

    public static List<Integer> solve(int N, List<Integer> from, List<Integer> to, List<Integer> tasks) {
        int n = from.size();
        DisjointSets<Integer> set = new DisjointSets<>();
        for (int i = 0; i < n; i++) {
            set.union(from.get(i), to.get(i)); // populate disjoint sets
        }
        List<Integer> result = new ArrayList<>();
        for (int node : tasks) {
            result.add(set.size(node));
        }
        return result;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

降低无向图的时间复杂度 的相关文章

  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 最小化代表性整数的误差之和

    Given n integers between 0 10000 as D1 D2 Dn where there may be duplicates and n can be huge I want to find k distinct r
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • Kivy Spinner:从 Spinner 中选择一个值时触发的任何事件

    我介绍一个Spinner在我的小部件中 每次我从中选择不同的值时 我都想执行一些操作 是否可以 我似乎只收到事件on press and on release 但是当选择不同的值时它们不会被触发 此致 Bojan 因为每次 attr val
  • 如何区分我自己的类和 gem 的类

    我有一个 Rails 项目 我已经研究了一段时间了 像许多 Rails 项目一样 我有一个 User 类 在我的一个控制器中 我需要从我正在使用的 gem 访问一些方法 gem 中的示例代码演示了如何使用包含到特定 gem 模块 我不会在这
  • PGAdmin - 为什么数据库限制(和高级属性)被禁用?

    我希望限制在浏览器树 层次结构中看到的数据库数量 因为它是一个拥有数百个数据库的 AWS 服务器 基于这个答案 https stackoverflow com questions 12663639 how to hide databases
  • 春季时间表 - 每月最后一天不工作

    我想在 每月最后一天 10 15 和 每月第一个星期日 运行春季调度程序作业 我在下面尝试过 但在初始化 spring 上下文时出现错误 org springframework boot SpringApplication 应用程序启动失败
  • Excel:SUMPRODUCT 计算共享工作负载(以小时为单位)和百分比

    我要再问一个问题 Excel 带百分比的 SUMPRODUCT https stackoverflow com questions 71080332 excel sumproduct with percentages 没有以另一种方式解决
  • 如何修复curl 56 GnuTLS接收错误(-110):TLS连接未正确终止[重复]

    这个问题在这里已经有答案了 同样的问题 git 错误 RPC 失败 curl 56 GnuTLS 接收错误 110 https stackoverflow com questions 50813406 and 错误 RPC 失败 curl
  • Github 页面上的 Angular 4 应用程序

    我有一个简单的Angular 4 我想要托管的应用程序Github Pages 执行此操作的选项来自Angular CLI似乎已删除 有没有办法做到这一点 如果有的话怎么办 这是我的 package json name e portfoli
  • Javascript 抓取 document.URL 的最后一部分? [复制]

    这个问题在这里已经有答案了 我试图获取当前网址的最后一部分 URL http example com test action http example com test action 我正在努力抓住 行动 URL 在该结构中始终保持一致 但
  • 将值从 HTML 传递到 CSS

    我感兴趣是否可以将值从 html 传递给 css 类 像这样 例子 div class Some text div style mt mpx margin top mpx px 我听说这种方式在 Less 中是可能的 不 你想要的方式在 C
  • ConnectivityManager 在获取网络信息时崩溃

    我是 Android 新手 当我给出以下代码片段时 我的 Android 应用程序崩溃了 ConnectivityManager manager ConnectivityManager this getSystemService Conte
  • 如何在 Nexmo 中向美国号码发送文本

    向菲律宾发送信息非常简单 但在美国的数字中 我必须进行验证 但我不知道如何进行 我开始了2F认证 但似乎我不知道下一步该怎么做 我的问题 如何在 Nexmo 中添加发送文本到美国号码 对于美国 您必须从您的 nexmo 帐户创建一个短代码
  • 来自本地 json 变量的 d3 饼图

    我正在尝试使用我见过的局部变量 而不是外部文件 中的 json 创建一个圆环图这个帖子 https stackoverflow com questions 10934853 d3 js loading json without a http
  • 由于格式不正确,加载程序集失败

    我开发了一个相当大的 Windows Forms net C 应用程序 其中包含多个程序集 最初 每个程序集都是为目标平台 任何 CPU 构建的 由于 x64 机器上的 Crystal Reports 存在问题 我们必须为 x86 目标平台
  • 如何在react-quill中注册对齐样式

    我在用着反应鹅毛笔 https www npmjs com package react quillnpm 包并在 nextjs 中动态导入它 我还使用 create next app 样板 我能够让反应鹅毛笔编辑器工作 但是 我无法获取使用
  • 地理编码器 Gem 无法在生产环境中工作

    所以我正在使用Geocoder https github com alexreisner geocoder根据用户提交表单时提供的地址提取纬度和经度坐标 我这样做是为了使用 Google 地图 API 绘制标记 这在开发中非常有效 零问题
  • .NET 4.5 中是否已弃用 ObjectContext?

    我一直在使用ObjectContexts已经很长一段时间了 现在我已经安装了 VS 2012 令我惊讶的是 实体数据模型没有创建代码生成项的选项ObjectContexts and EntityObjects代替DbContexts and
  • Mongoose 在 Node.js 中创建多租户支持连接

    我正在研究一种使用 node js mongoose 和 mongodb 实现多数据库以支持多租户的好方法 我发现 mongoose 支持一种名为createConnection 我想知道使用它的最佳实践 实际上 我将所有这些连接存储在一个
  • 基于智能指针的 CRTP 习惯用法的编译问题

    我正在尝试为 CRTP 示例编译一个最小的工作示例这篇博文 https www fluentcpp com 2017 09 12 how to return a smart pointer and use covariance 它基于智能指
  • 如何将一些“统计数据”从 C# 程序传递到另一个程序?

    我有一个命令行程序 可以 做很多工作 并产生 很多统计数据 它是股票交易软件 对于延迟 错误等非常重要 所以我不想向其中添加 GUI 此外 有时需要 GUI 但控制台应用程序应始终启动 我需要 GUI 来友好地显示收集的统计信息 以只读模式
  • 降低无向图的时间复杂度

    我有一个无向图 表示 Facebook 等社交媒体中的用户连接 有N个节点 从1到N 边由数组 from 和 to 表示 任务数组表示我有兴趣查找该节点 即社交媒体中的用户 的连接的节点号 Example N 5 From 2 2 1 1