分享一道C家DS电面题

问题大致是:
有一个500w的数据,三列id(用户id,身份id啥之类的),只要有一种id相同的就可以看成是一个人,最后需要对每行数据输出一个标签,相同的人标签要是一个。
例如:

  a b  c   label
0 1 33 555 0
1 1 44 666 0
2 2 44 777 0
3 3 55 777 0
4 3 66 888 0
5 4 77 999 1

我最后想了很久给了一个借助图论,O(n^2)的时间复杂度的算法,感觉有点复杂,面试官说还行,问还有没有更优化的,没时间了,分享大家,一起讨论

我先想到的是类似clustering的办法 把a,b,c 分别看成x,y,z , 比较每一个observation与其他observation 计算 min(deltax, deltay, deltaz),把min=0的全部cluster到一类 不过这个也是O(N^2)
如果三列id像example里一样是sorted的话,把a,b,c 分别看成x,y,z , 然后一行一行的比 计算 min(deltax, deltay, deltaz) 如果等于0, 那么下一行就和上一行是一个人, 如果不是 那就是两个人。 这样 O(n)
如果不是sorted的话 ,sort一下 再用上面的方法是O(NlogN+N)

想了一下有个问题,就是这个sort的话,这样三列sort,可以合并的id,有些始终不会相邻啊?
a,b,c
1,33,555
1,44,666
2,44,777
3,55,777
3,66,888
4,77,999
5,88,1000
6,77,333
8,99,555

如果同一行用户ID和身份ID分别属于不同的人,这种情况怎么办?(如果我的理解没错)

额。。不会啊,三种id,只要有一种相同就是一个人的