Algorithm 多渠道联系人问题:根据相关票据的信息查找相关票据 问题描述

Algorithm 多渠道联系人问题:根据相关票据的信息查找相关票据 问题描述,algorithm,data-structures,relationship,kaggle,Algorithm,Data Structures,Relationship,Kaggle,以下问题描述摘自Shopee代码League 2021 对于每张票据,如果每个用户具有相同的联系信息,请识别他们的所有联系人。这些票据中的每一张都通过电子邮件、电话或订单ID直接或间接关联,因此每张票据都属于同一用户。例如: 票 身份证件 电子邮件 订单号 电话 联络 A 0 john@gmail.com 12345678 NA 5. B 1. NA 12345678 682212345 2. C 34567 wick@gmail.com NA 682212345 4. D 78999 wick

以下问题描述摘自Shopee代码League 2021

对于每张票据,如果每个用户具有相同的联系信息,请识别他们的所有联系人。这些票据中的每一张都通过
电子邮件
电话
订单ID
直接或间接关联,因此每张票据都属于同一用户。例如:

票 身份证件 电子邮件 订单号 电话 联络 A 0 john@gmail.com 12345678 NA 5. B 1. NA 12345678 682212345 2. C 34567 wick@gmail.com NA 682212345 4. D 78999 wick@gmail.com NA NA 3.
这是我尝试的解决方案。但我没有足够的时间来处理所有500000行。基本上,我遍历数据数组并按顺序比较它们的属性。是的,非常慢的方式

import com.google.gson.gson;
导入java.io.FileReader;
导入java.io.PrintWriter;
导入java.util.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
Gson Gson=新的Gson();
Ticket[]tickets=gson.fromJson(新文件阅读器(“contacts.json”),Ticket[].class);
HashMap ticketTraceMap=新HashMap();
HashMap sumOfContactsMap=新HashMap();
int commonId=1;//具有相同commonId的票证是相关的
对于(int i=0;i
用于存储票证信息的Java对象:

舱单{
私有字符串Id;
私人字符串电子邮件;
私人电话;
私有字符串OrderId;
私人字符串联系人;
公共int commonId;
//根据电子邮件、电话号码和订单ID比较两张机票
@凌驾
公共布尔等于(对象o){
票证=(票证)o;
返回(!getEmail().equals(“”&&Objects.equals(getEmail(),ticket.getEmail()))||
(!getPhone().equals(“”&&Objects.equals(getPhone(),ticket.getPhone()))||
(!getOrderId().equals(“”&&Objects.equals(getOrderId(),ticket.getOrderId());
}
//接球手和接球手
}

这是我使用Python3的解决方案。我使用了两个字典来存储机票连接。第一个字典按值存储连接的票据。第二个字典存储每个id连接(跟踪)。最后,使用第二个字典中的跟踪计算联系人。是的,也是一种很慢的方式。它需要3个循环。计算Kaggle内核中的所有500.000行最多需要15秒

#导入工具
将numpy作为np导入
作为pd进口熊猫
#加载数据
df=pd.read_json('/kaggle/input/scl-2021-da/contacts.json'))
npdata=df.values
#初始化内存
内存={}
连接={}
#按值存储连接的票据
def添加到内存(票证id、值):
如果值!="":
如果内存中有值:
内存[值]。添加(票证id)
返回
内存[值]={ticket\u id}
对于npdata中的行:
票证id=第[0]行
#订单号
将\u添加到\u内存(票证\u id,第[4]行)
#电子邮件
将\u添加到\u内存(票证\u id,第[1]行)
#电话
将\u添加到\u内存(票证\u id,第[2]行)
#计算痕迹
对于内存中的ID。值():
当前连接=设置(ID)
对于ID中的uid:
如果连接中存在uid: