降低无向图的时间复杂度

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(使用前将#替换为@)

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

  • 如何修复安装 maven jar 插件依赖项时出现的错误?

    我正在将应用程序制作成 maven 中的 jar 文件 但是 当我从 Maven 中提取 jar 插件存储库并在终端中运行这三个命令时 mvn clean mvn compile mvn package 在 mvn package 中 我收
  • SWT:如何进行高质量图像调整大小

    我的应用程序需要调整 ImageData 的大小 不幸的是 我还没有通过 GC 开启抗锯齿和高插值 或 ImageData scaledTo 获得我想要的结果 生成的图像质量太低 无法接受 进行高质量 ImageData 调整大小的最佳方法
  • Java 8 中异常类型推断的一个独特功能

    在为该网站上的另一个答案编写代码时 我遇到了这个特性 static void testSneaky final Exception e new Exception sneakyThrow e no problems here nonSnea
  • JTree 避免重新加载后崩溃

    我正在尝试找到解决崩溃问题的方法JTree重新加载后 情况 JTree Office A Office A 1 Office A 1 1 Office A 1 2 Office B Office B 1 Office B 1 1 Offic
  • Logback 配置在单行上有异常吗?

    我的日志被提取 传输并合并到 elasticsearch 中 多行事件很难跟踪和诊断 有没有办法使用收集器和正则表达式将异常行分组到单个记录中登录配置 https logback qos ch manual layouts html xTh
  • Poi:从 xlsm 打开 Excel 文件后将其保存为 xlsx

    我正在编写一个java程序 它打开一个用户定义的excel文件 用数据填充它 然后将其保存在用户指定的路径 文件名和扩展名下 即使输入文件是 xlsm 也应该可以声明输出保存为 xlsx 但实际上是不可能的 如果我尝试使用下面的代码 打开文
  • 最终类中的静态函数是否隐式最终?

    我的问题基本上与this https stackoverflow com q 8766476 3882565一 但这是否也适用于static功能 我想了解 编译器是否处理所有static函数在一个final类为final 是否添加final
  • MongoDb Spring 在嵌套对象中查找

    我正在使用 Spring Data Mongodb 和这样的文档 id ObjectId 565c5ed433a140520cdedd7f attributes 565c5ed433a140520cdedd73 333563851 list
  • SQLite 64位整数在jooq中被识别为int

    我有一个与 jOOQ 一起使用的 SQLite 数据库 当我使用 jOOQ 的代码生成工具时 它会按预期构建所有表和记录类 然而 所有的 SQLiteINTEGER列变成java lang Integer生成的代码中的字段 问题是 SQLi
  • 如何使 JFileChooser 仅显示具有某些特定名称 Java 的文件夹

    有什么方法可以让 JFileChooser 加载时仅显示名称为 Hello 的文件夹 这是我的代码 它显示所有文件夹以及扩展名为 py 和 java 的文件 我想添加文件夹名称限制 FileNameExtensionFilter filte
  • 为什么这段代码可以在 Java 7 中运行,而不能在 Java 8 中运行?

    我目前使用 IDE Eclipse 版本 Neon 2 Release 4 6 2 和版本 java Version 8 Update 131 在此代码中 IDE 给出错误 类型不匹配 无法从字节转换为整数 Integer i byte 1
  • Java如何区分这些具有相同名称/签名的多个方法?

    今天我在追踪一个错误 我注意到我们的一个班级中有一些奇怪的事情 我删除了尽可能多的代码并发布在这里 class A static int obtainNumber return 42 static int obtainNumber retu
  • 如何将 .txt 文件的最后 5 行读入 java

    我有一个包含多个条目的文本文件 例如 hello there my name is JoeBloggs 我如何按降序阅读最后五个条目 即来自 JoeBloggs 那里 我目前有代码只能读取最后一行 public class TestLast
  • jsch - 发送特殊键(CTRL-C、CTRL-D 等)

    我需要向远程终端发送特殊密钥 如何使用 JSCH 做到这一点 Thanks Walter 尝试发送两个字节 0x03 0x04 Check ASCII 表 http www bbdsoft com ascii html了解更多
  • java中从视频中提取图像

    我想知道如何使用 JMF 从视频中提取图像 Player player Manager createRealizedPlayer cdi getLocator player start FrameGrabbingControl frameG
  • 使用 System.out.println 显示特殊字符

    我在将带有特殊字符的文本从网络服务发送或显示到数据库时遇到问题 在我的 Eclipse 上 我已将字符编码设置为 UTF 8 但它仍然不允许我显示字符 例如 像下面的代码一样简单的打印 String test System out prin
  • 如何在 logback 中启动时滚动日志文件

    我想配置 logback 来执行以下操作 记录到文件 当文件达到 50MB 时滚动文件 仅保留 7 天的日志 启动时始终生成一个新文件 滚动 除了最后一项 启动卷 外 我一切都正常 有谁知道如何实现这一目标 这是配置
  • 旧的和奇异的 JVM 上 java.io.BufferedInputStream 的默认缓冲区大小是多少?

    我一直在为一篇关于以下内容的博客文章进行一些研究java io BufferedInputStream和缓冲区 显然 多年来 默认值已从区区 512 字节增长到 8192 字节 冒昧地 Sun 的 Java 7 实现 甚至在JDK 1 1
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition
  • Java GridBagConstraints gridx 和 gridy 不工作?

    我正在尝试使用gridx and gridy定位我的按钮的约束 但它们不起作用 如果我改变gridx and gridy变量 什么也没有发生 如果我将填充更改为GridBagConstraints to NONE 仍然不行 我在这里错过了什

随机推荐

  • 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