好友推薦策略

描述

現有一個社交網站,其好友推薦策略爲:
用戶A和用戶B不是好友,當二人的共同好友數量超過好友推薦閾值m(可配置)時,就向A和B分別推薦爲彼此好友。

任務爲:
不使用STL和Mapreduce,
對設定的m值,給定一組用戶及各自好友列表,對這一組用戶,反覆自動應用上述好友推薦策略後(假設每次推薦都被採納),求指定用戶的最終好友列表。
要求算法複雜度不高於O(n^2),用戶總數規格不受限;

注:好友關係是雙向的,即:如果用戶A是用戶B的好友,那麼用戶B一定也是用戶A的好友。

分析

HASH. 將好友數小的那個人的朋友插入HASH表中,然後遍歷另外一個人的好友,在HASH表中進行查詢。

Code

#include <bits/stdc++.h>

using namespace std;

const int maxn = 2000;

const int mod = 1997;

int AF[maxn];
int BF[maxn];

struct HASH{
    int a[maxn];
    int head[maxn];
    int next[maxn];
    int sz;
    void init(){
        memset(head,-1,sizeof(head));
        sz=0;
    }
    bool find(int val){
        int tmp = (val%mod+mod)%mod;
        for(int i=head[tmp];i!=-1;i=next[i]){
            if(val==a[i])
                return true;
        }
        return false;
    }
    void insert(int val){
        int tmp = (val%mod+mod)%mod;
        if(find(val))
            return;
        a[sz]=val;
        next[sz]=head[tmp];
        head[tmp]=sz++;
    }
}h;

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<n;i++){
            scanf("%d",AF+i);
        }
        for(int i=0;i<m;i++){
            scanf("%d",BF+i);
        }
        int commonfriend = 0;
        h.init();
        if(n<m){
            for(int i=0;i<n;i++){
                h.insert(AF[i]);
            }
            for(int i=0;i<m;i++){
                if(h.find(BF[i]))
                    commonfriend++;
            }
        }
        else{
            for(int i=0;i<m;i++){
                h.insert(BF[i]);
            }
            for(int i=0;i<n;i++){
                if(h.find(AF[i]))
                    commonfriend++;
            }
        }
        printf("ans = %d\n",commonfriend);
    }
    return 0;
}

拓展

社交網絡中的好友推薦方法研究
微博好友推薦算法-SALSA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章