qq怎么查共同好友,qq怎么查共同好友名字

责编|伍杏玲出品|程序人生(ID:coder_life)近期晚上失眠比较多,偶然发现在微博里打开别人的关注/粉丝列表可以找到可能感兴趣的人,点进去一看还果然都是小学、初中、高中时期的同学,我就开始思索

责编 | 伍杏玲

出品 | 程序人生(ID:coder_life)

近期晚上失眠比较多,偶然发现在微博里打开别人的关注/粉丝列表可以找到可能感兴趣的人,点进去一看还果然都是小学、初中、高中时期的同学,我就开始思索背后的算法是怎么实现的,qq怎么查共同好友名字,于是便有了这篇文章。,

关注粉丝信息用什么数据结构存储呢?

当然是用图啦!我单方面关注了你我就成为了你的粉丝,但是你还不是我的粉丝,因此关注/粉丝关系需要使用有向图(Directed Graph)来存储,注意不一定是有向无环图(Directed Acyclic Graph,简称DAG),因为可能出现下图所示的我关注了你,你关注了他,他又关注了我这样的三角关系。

确定使用有向图这种数据结构后,还需确定采用何种方式存储,图的主流存储方式就两种,邻接矩阵和邻接表。由于微博或其他社交网络任意用户相互之间产生关注关系的并不多,采用邻接矩阵存储会耗费大量的空间,因此我们采用邻接表来存储,可以将某用户关注的人放在一条链表里接到该用户上,粉丝也放在一条链表里接到该用户上,当然链表也可以改为具备自动扩容功能的动态数组。

动态数组follows中存储的是某用户关注的人;followers存储的是某用户的粉丝;unionSet存储的是follows集和followers集的并集,表示与某用户有“认识”关系的人,可以在该用户关注/取消关注别人或者别人关注/取消关注该用户时自动插入/删除,也可以用到的时候利用follows集和followers集求交集。

如何表示“认识”这种关系?

这里我们认为,我的关注与我的粉丝,都与我存在“认识”或者”感兴趣“的关系。因此我们可以对关注的人follows与粉丝followers取一个并集放到一个新的关系人数组unionSet。

取并集算法有两种,一种的时间复杂度是O(m*n),比较暴力也比较容易理解;另一种的时间复杂度是O(m+n),利用了哈希算法。

取并集算法1(暴力)

vector<int> getUnion(vector<int> follows,vector<int> followers)

{

vector<int> ret=followers;

int len1=follows.size;

int len2=followers.size;

for(int i=0;i<len1;i++)

{

/用来标记关注的人是不是已经出现在粉丝中

bool found=false;

这种好友查看步骤如下:1、打开手机并在桌面找到QQ图标,点击进入登陆页面后,输入账号密码完成登陆。2、登陆成功进入主页后,点击下方的联系人标签。3、在打开的联系人页面中,点击下方的一个好友。4、进入好友个人资料页面后。

for(int j=0;j<len2;j++)

{

if(follows[i]==followers[j])

{

/关注的人已经出现在粉丝中了

flag=true;

break;

}

}

if(!flag)

{

/关注的人没有出现在粉丝中

ret.push_back(follows[i]);

}

方法一:通过qq主界面,点击搜索图标后进入搜索页面,里面会显示共同好友。1、用户电脑上登录来到主页面后,点击下方的搜索图标。2、然后来到查找页面,好友推荐下会显示很多好友,会显示有多少个共同好友,页面左右两个箭头可以。

}

return ret;

}

先将follows集(关注的人)全部放入并集中,再遍历followers集(粉丝),对每一个粉丝检查是否在follows集中出现过,如果没有出现过,就将该粉丝加入并集。

取并集算法2(哈希算法)

vector<int> getUnion(vector<int> follows,vector<int> followers){vector<int> ret;int len1=follows.size;int len2=followers.size;/哈希表unordered_map<int,bool> mp;for(int i=0;i<len1;i++){mp[follows[i]]=true;ret.push_back(follows[i]);}for(int i=0;i<len2;i++){if(!mp[followers[i]]){ret.push_back(followers[i]);}}return ret;}

先遍历follows集(关注的人),将follows集中的所有元素都放入并集中,并用哈希表标记其是否已经存在于并集unionSet,再遍历followers集(粉丝),对每一个粉丝检查哈希值是否为true,若为true则表明该元素已经存在于并集unionSet,若为false说明目前并集unionSet中还没有该元素,就将该元素加入并集,最后返回该并集。

并查集是否可行?

int f[MAX_USER_NUM];

qq怎么查共同好友

for(int i=0;i<MAX_USER_NUM;i++)

{

f[i]=i;

}

如果用户a关注了用户b或者用户b关注了用户a,则做如下操作。

f[findFather(a)]=findFather(b);

上述代码的含义是将a的父结点的父结点设为b的父结点,所谓findFather函数,是一个返回父结点的函数。

findFather(int x){if(x==f[x]){return x;}return f[x]=findFather(f[x]);}

在并查集中,父结点与子结点是没有层次关系的,如果a的父结点的父结点变成了b的父结点,那么在调用findFather(a)查找a的父结点时其父结点也变成了b的父结点,即此时用户a、用户b、用户c的父结点一致了。

要判断所有用户中任意两名用户是否可以通过他们的朋友认识,只需要做如下判断。

这样拉取我当前观察用户的关注的人与粉丝的并集unionSet中调用以上函数返回true的用户,就得到了我可能感兴趣的人的列表。

vector<int> getInterestedList(vector<int> unionSet,int myId){vector<int> ret;int len=unionSet.size;for(int i=0;i<len;i++){if(haveConnection(myId,unionSet[i]){ret.push_back(unionSet[i]);}}return ret;}

并查集的确能够准确得出两个用户之间是否存在关联,但是我们必须面对的现实是一个非常有名的社交网络领域的数学猜想——六度空间理论,也被叫做六度分割理论。其内容是你和任何一个陌生人之间所间隔的人不会超过6个。

举个例子,你只需要6个中间人,就可以与美国总统认识,这听起来有些荒谬,却也有几分道理。例如,我有认识的亲戚朋友在国外做生意,因为做生意认识了外国驻华大使,而外国驻华大使的上司就有可能与总统的下属握过手或通过电话,而总统的下属必然认识总统。因此如果我、我的亲戚朋友、亲戚朋友认识的外国驻华大使、总统的下属与总统注册了同一个社交网络,虽然我没有与总统直接建立关注与被关注的关系,通过并查集算法也可得知我与总统之间存在关系。

路径统计法

如果配合并查集使用,先调用并查集的findFather函数可知两个用户之间是否存在通路,若存在通路,可以用深度优先搜索+迭代的算法统计出从一个用户出发到另一个用户的路径数,路径数越多则代表两名用户之间越存在着千丝万缕的联系。

如上图所示,我是用户1,我正在查看用户6的好友列表,用户6有好友3和好友5,好友3已经是我的好友了,我联系上好友5共有6条路径,分别是:

这表明我与用户5一定有着千丝万缕的联系。

然而这种算法的时间复杂度却决于全部顶点的度的大小以及两名用户之间经过的中间用户的个数,如果中间用户过多,则在递归的时候就有可能爆栈导致系统崩溃。

除了时间复杂度和爆栈的问题,如果看到问题的本质,其实该算法也摆脱不了六度空间的影响。比如我在用户5的好友列表中再加入一个用户7,用户7就只有用户5这一个好友,因此到达用户7的路径数与到达用户5的路径数一样,然而用户1到达用户7至少也要通过2个中间人,其关联已经不大了。

可行的方案一

从目前看来最可行的方案就是进行好友列表比对取交集,按照交集中元素的个数按照从大到小排序。在观察了多种情况后我发现,给我推荐的可能感兴趣的人下面都有一行提示某某某也关注了他/她,而某某某正是我的好友。原来微博的兴趣推荐算法并没有那么高大上,应该是与QQ的共同好友一样。与QQ唯一的区别就是,微博有两个集合,一个是关注的人,一个是粉丝。

求交集同样有两种算法,与求并集类似,一个暴力,时间复杂度是O(m*n);另一个哈希,时间复杂度是O(m+n)。

取交集算法1(暴力)

vector<int> getIntersection(vector<int> myFriends,vector<int> yourFriends){int len1=myFriends.size;int len2=yourFriends.size;for(int i=0;i<len1;i++){bool flag=false;for(int j=0;j<len2;j++){if(myFriends[i]==yourFriends[j]){flag=true;break;}}if(flag){ret.push_back(myFriends[i]);}}return ret;}

取交集算法2(哈希算法)

vector<int> getIntersection(vector<int> myFriends,vector<int> yourFriends){vector<int> ret;int len1=myFriends.size;int len2=yourFriends.size;unordered_map<int,bool> mp;for(int i=0;i<len1;i++){mp[myFriends[i]]=true;}for(int i=0;i<len2;i++){if(mp[yourFriends[i]]){ret.push_back(yourFriends[i]);}}return ret;}

拉取可能感兴趣的人

vector<int> getInterestedList(vector<int> myFriends,vector<int> yourFriends){vector<int> ret;int len=yourFriends.size;for(int i=0;i<len;i++){vector<int> temp=getIntersection(user[yourFriends[i]].unionSet,myFriends);if(temp.size>0){ret.push_back(yourFriends[i]);}}return ret;}

可行的方案二

遍历我所有好友的好友,用哈希表统计他们出现的次数,按出现次数从大到小排序后再剔除已经是我好友的用户,就找到了我“可能认识的人”,并能得到我们之间有多少个共同好友。

/判断某个id是不是我的好友

bool isFriend(int id,vector<int> myFriends)

{

int len=myFriends.size;

for(int i=0;i<len;i++)

{

if(id==myFriends[i])

{

return true;

}

}

QQ查看共同好友方法:1、首先在手机中打开并登录手机QQ,打开“联系人”界面,选择一位好友,点击其头像,如图所示。2、然后在打开的页面中,点击“XX的空间”,如图所示。3、接着在打开的空间页面中,点击进入“亲密度”,。

return false;

}

/获取可能认识的人

vector<int> getPossibleFriends(vector<int> myFriends)

{

vector<int> ret;

int len1=myFriends.size;

map<int,int> mp;

/遍历我所有的朋友

for(int i=0;i<len1;i++)

{

/遍历朋友的朋友

int len2=user[myFriends[i]].unionSet.size;

for(int j=0;j<len2;j++)

{

mp[user[myFriends[i]].unionSet[j]]++;

}

}

/剔除我的好友

for(map<int,int>::iterator it=mp.end-1;it>=mp.begin;it--)

QQ看共同好友的办法,首先需要登录QQ,然后点击头像查看资料,点击四叶草图标,进入首页,点击好友,选择可能认识的人就可以看到啦,具体操作步骤如下:1、首先,在电脑上登录QQ,点击自己或任意一个好友的头像查看资料。。

{

pair<int.int> temp=*it;

if(!check(temp.second,myFriends))

{

ret.push_back(temp.first);

}

}

return ret;

}

实际上,世间万物皆有关系,皆为连接。连接并不是互联网时代的产物,只是社交网络的出现让我们的连接更为密切了。若有错误之处还望大家多多包涵和指出,笔者也很想听听微博程序员到底是如何实现“可能感兴趣的人”的功能的。

最近也是金三银四面试季,面试中还是很喜欢问这种问题的,因为比较能体现候选人分析问题、解决问题、实现具体需求的能力。在日常软件使用上,看到有趣的功能,多去思考其实现是一定没有坏处的,纵使猜想的实现与实际的实现可能存在出入。

☞那个分分钟处理10亿节点图计算的Plato,现在怎么样了?

☞每一节网课背后,硬核黑科技大曝光

☞数据库激荡40年,深入解析PostgreSQL、NewSQL演进历程

☞黑客用上机器学习你慌不慌?这7种窃取数据的新手段快来认识一下!

☞超详细!一文告诉你SparkStreaming如何整合Kafka!附代码可实践

☞Libra的Move语言初探,10行代码实现你第一个智能合约

上一篇 2022年12月14 11:20
下一篇 2022年12月29 15:32

相关推荐

  • 有番号怎么下载

    “359旅像一颗种子,播撒在浩瀚的塔克拉玛干沙漠,从这片盐碱地上破土而出,生根发芽。”在359旅屯垦纪念馆的入口处,ずっと好きだった迅雷链接,年轻的讲解员金晓琳迎来了又一批参观人员。,兵团的孩子们从小

    2023年01月11 290
  • 怎样隐藏号码打电话,怎样隐藏自己手机号码打电话

    手机网络电话成为国内传统语音通信实现移动互联网数据业务数字化转换的最好载体。作为全球手机市场第一消费大国以及移动数据和互联网业务最具发展潜力的国家,怎样隐藏自己手机号码打电话,网络电话经过两年的蓬勃发

    2022年12月31 211
  • 怎样开通借呗,怎样才能开通借呗

    [闽南网]怎样才能开通借呗,今天,小编收到两个网友的投稿,他们各自提了一个问题,分别是:蚂蚁借呗怎么开通?借呗突然被停用多久能恢复使用呢?小编知道,借呗是一款非常火热的借款工具,前面提到的两个问题,也

    2022年12月27 298
  • 中国移动怎么换套餐,移动套餐太贵怎么更改

    你每个月的零花钱都用在了哪里?有人回答:手机套餐费用上!手机套餐类型有很多种,几十的几百的都有。有的朋友同时养着两个手机号码,每个月都要充值双倍的钱钱,不然没得扣就停机。有多个手机号是很正常的,比如说

    2023年06月04 292
  • ios怎么清理垃圾,iphone如何清除系统数据

    一直以来,苹果手机的清理方法就比较麻烦,但如果你掌握了一些方法,那就可以知道怎样才可以清理掉几十个G的垃圾,iphone如何清除系统数据,这些垃圾我们用常规的手段是清理不掉的,因为它不像安装手机一些,

    2023年05月26 255
  • 怎样把q币转到微信,把q币转到微信零钱

    12月24日,微信进行版本更新,把q币转到微信零钱,其中值得关注的是,发现页面的“附近的人”,变成了“附近的直播和人”,这意味着视频号直播又新增了一个入口。发现页面出现“附近的直播和人”进入“附近的直

    2023年01月05 215
  • 微信限制怎么解除,微信聊天功能被限制怎么解封

    微信给我们带来了很多便利,微信聊天功能被限制怎么解封,改变了我们的生活方式,但有些朋友在使用过程中因对规则不熟悉,导致出现了一些异常情况,本篇文章以“功能被限制”为例,今天我们来说说相关的知识和解决方

    2023年05月29 233
  • 怎样做一个负责任的公民,如何做一个负责任的数字公民

    近日,我省各地通报了多起涉疫典型案例,如何做一个负责任的数字公民,涉及到伪造核酸证明、故意隐瞒行程、散布虚假信息、强行冲闯防疫卡点等各种行为,造成了严重后果。究其根源,还是个别人公民责任意识的严重缺失

    2022年12月29 226
  • 怎样查看icloud里的照片,手机上查看icloud照片

    你们好,这里是Seek思科,为你寻找苹果最新资讯、苹果隐藏技巧、苹果良心APP以及苹果优质配件。如果你需要这些,不妨点个关注。苹果的iCloud,可能只有当手机弹出“你的iPhone云储存空间不足时”

    2022年12月30 299
  • 怎么卸载显卡驱动,显卡驱动怎么卸载干净再重装

    7个回答显卡驱动是在电脑进入系统后加载的,删除显卡驱动后,系统还自带默认的显卡通用驱动,能使电脑做到基本的图像显示,不会出现显示器点不亮黑屏的现象。所以显示器点不亮黑屏的情况和删除显卡驱动无关。查看下

    2023年01月09 215
  • 丧事微信转账怎样留言,白事微信转账附言范例

    白事微信转账附言范例,人有悲欢离合,月有阴晴圆缺。每个人都会有离开的一天,对于离开的人我们一般会哀痛和怀念。接下来,小编就给大家整理了一些关于悼念逝者的文案。悼念逝者的句子悼念逝者的文案丧事微信转账留

    2022年12月31 232
  • 怎样更换微信号,一个手机号两个微信方法

    我们知道,从前微信的无法进行无法更改,但是仍然有很多用户想要再次修改微信。接下来我该怎么办?让小编教您如何更改微信。1.登录后,打开微信应用程序,然后在我的界面上,单击上方的微信。1、首先我们要先打开

    2022年12月29 242
  • 怎么取消彩铃,电信怎么取消彩铃

    电信怎么取消彩铃,纵观投诉详情,三大运营商的视频彩铃业务均榜上有名,其中投诉原因为“莫名其妙开通视频彩铃”占大部分,“取消不了业务”也不在少数。根据一位电信用户晒出的截图,该用户按照短信提示操作取消业

    2023年01月12 299
关注微信