问题描述:

线上遇到的一个问题,这里做一个变形。有若干行数据(2000w)左右,每行有若干个属性,比如姓名、邮箱、地址等等;如果两行数据有至少一个属性值相同,就认为这两个行是连通的;并且连通性有转移,比如A与B连通,B与C连通,就可以认为A与C连通。那么这两千万行数据哪些是连通的?

name address tel
A abc 135
A bcd 136
B cde 136

如上第一行与第二行name相同,可认为行1连通行2;
第二行与第三行第三个属性相同,可认为行2连通行3;
于是1 2 3可认为是一个组。

暴力解法:对每个属性遍历,对每行数据遍历,时间复杂度最少为 m∗n2 m ∗ n 2 m*n^2 (n为行数)
思路1:看到连通性立马可以想到并查集,但是并查集是已经知道哪些行数据是连通的,然后再根据并查集构造的数判断哪些属于一个组,这是整体思路。对并查集不清楚可参考 https://blog.csdn.net/u011730199/article/details/80909373

https://blog.csdn.net/dm_vincent/article/details/7655764

接下来,如何判断行与行之间的连通性呢?

遍历做法直接舍弃。考虑到一行有若干属性,可以联想到树的层级结构。对每行数据,如果对应的属性值已经存在,则连通。判断属性值是否已经存在最快的是使用HashMap的key来判断。
每行数据有m个属性,初始化m个 HashMap<String,Integer> H a s h M a p < S t r i n g , I n t e g e r > HashMap String为属性值,int为行号。对每行数据判断对应层级的map,是否存在,若存在
uf.union(m1,m2);若不存在map.put(string,m);
时间复杂度为 m∗n m ∗ n m*n m为属性个数,n为行数
如果想要判断哪些连通,需要使用BFS或者DFS。这里略过。
代码如下:

public class Vert {private static ArrayList<HashMap<String,Integer>> list = new ArrayList<HashMap<String,Integer>>();public static void main(String[] args) {String[][] line = {{"136","11@qq.com","22@c.com"},{"137","11@qq.com","23@c.com"},{"138","110@qq.com","23@c.com"},{"139","1100@qq.com","24@c.com"}};Union_Find u = new Union_Find(line.length);for(int i = 0;i<line.length;i++) {for(int j = 0;j<line[i].length;j++) {if(i == 0) {HashMap<String,Integer> t = new HashMap<String,Integer>();arr[i] = 1;t.put(line[i][j], i);list.add(t);}else {HashMap<String,Integer> temp = list.get(j);if(temp.containsKey(line[i][j]))u.union(temp.get(line[i][j]), i);elselist.get(j).put(line[i][j], i);}}}System.out.println(u.isConnected(1, 2));}
}

Union_Find是一个并查集实现,这里略过。如果有更好的解法或者bug。欢迎留言+交流,vx:LEILE111,邮箱hcy_xy@qq.com

判断具有多个属性的行的连通性相关推荐

  1. 一个对象的属性_【前端冷知识】如何判断一个对象的某个属性是可写的?

    这是一个咋一听好像很简单,但是实际上却没那么简单,而且是很有趣的问题. 我们先来看一下什么情况下一个对象的属性是可写的. "属性可写"这个概念并没有严谨的定义,我们这里先来规定一下 ...

  2. JavaScript中判断是否存在某属性

    Js中的属性分为两种,一种是固有属性,另外是编程时赋预予的属性,这两种属性的判断方式是不一样的. 1.使用in关键字. 该方法可以判断对象的自有属性和继承来的属性是否存在. var o={x:1}; ...

  3. linux if 判断文件,shell中的逻辑判断,if 判断文件、目录属性,if判断的一些特殊用法...

    格式1:if 条件 ; then 语句; fi //如果满足条件,然后执行语句 [root@akuilinux01 shell]# cat if1.sh #!/bin/bash a=5 if [ $a ...

  4. 判断对象的某些属性是否为空

    背景:很多时候我们需要判断对象的某些属性中的值是否为空,然后进行操作,这里不需要整个的对象,只是需要获取对象中的某些属性进行判断,如果写很多的if进行判断,例如: if (StringUtils.is ...

  5. java 判断对象的属性是否为空,如何判断一个对象里的属性是否都为空的

    怎么判断一个对象里的属性是否都为空的 怎么判断一个对象里的属性是否都为空的,或者判断该对象是否是一个实体! ------解决方案-------------------- 引用:怎么判断一个对象里的属性 ...

  6. java中判断对象中某个属性是否为空

    问题:java对象接受从数据库查出来的数据时,对对象的某一属性进行操作,在操作属性中存储的数据中不对进行检查,会出现空指针异常的情况. 问题再现:新建一个实体类 public class Studen ...

  7. 【干货】Java 判断一个对象中部分属性的值是否为空

    Java中一个对象有多个属性,工作中需要对部分属性进行"非空判断".如果使用IFNULL会有大量的冗余代码,代码可读性查:如果对象新增删除了属性,判断代码需要重新进行硬编码,此违背 ...

  8. python判断对象是否有属性

    判断类对象类型,是否有包含属性: class FooClass:passk = FooClass() k.append =12 try:# 判断属性if hasattr(k, 'append'):pr ...

  9. Hbase高级应用:建表高级属性、行键设计、设计原则、热点问题

    Hbase建表高级属性 1.BLOOMFILTER 默认是NONE 是否使用布隆过虑及使用何种方式  布隆过滤可以每列族单独启用.  使用 HColumnDescriptor.setBloomFilt ...

最新文章

  1. List去重复——多个复杂字段判断去重
  2. C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解
  3. FPGA之道(34)Verilog初始化与操作符号
  4. stm32 内部sram大小_STM32第三天
  5. android 活动说明,Android – 如何发送GCM推送通知以及要加载哪些活动的说明?
  6. Docker Gogs
  7. Nmon 性能:分析 AIX 和 Linux 性能的免费工具
  8. js-cookie使用方法
  9. 可视化+数据+图表,报告规范这么写才能升职
  10. 很多人认为,因为我们是平民,做生意试不了错,输不起,试错成本太高
  11. 结构型设计模式 (1)—— 适配器模式(Adapter Pattern)
  12. 博客园电子期刊2010年10月刊发布啦
  13. ASP.NET Core SignalR +微信小程序整理(一)
  14. 关于路由器认证校园网的可行方案.md
  15. 电话机器人源码智能电话机器人7项技术特点,教你选择合适的电话机器人!
  16. 数字集成电路设计之加法器
  17. 汽车UDS诊断之诊断会话控制服务(0x10)深度剖析
  18. 3D游戏建模快速制作枪械的几种方法【3Dmax,Zbrush,Maya】
  19. 系统u盘测试软件,u盘检测工具操作教程
  20. 佳能打印机扫描文件到电脑显示设置计算机,电脑教程:佳能打印机怎么扫描文件到电脑...

热门文章

  1. 富士康登陆A股 工业互联网的盛宴
  2. 二手机器人进口报关_天津旧设备进口报关东莞广州深圳二手机械进口清关代理公司-旧机器进口报关...
  3. 天龙八部服务器端共享内存的设计
  4. C++ map中使用pair构造键值对小记
  5. java-net-php-python-jspm社团管理系统计算机毕业设计程序
  6. 「Redis数据结构」集合对象(Set)
  7. 垂直搜索能否抢占通用搜索地盘?
  8. 体验服和平精英服务器更新维护,和平精英体验服怎么进不去怎么办 进不去原因...
  9. 《乱音盒子》之《鸢尾的思念》
  10. 带你详细理解IP地址