برنامه شناسایی مخاطب های مشابه — راهنمای کاربردی

لیستی از مخاطبان، شامل به ترتیب نام کاربری (Username)، آدرس ایمیل (email) و شماره تلفن (Phone Number) داده شده است. هدف، شناسایی مخاطب های مشابه (شخص واحدی که مخاطب‌های مختلفی برای اون ثبت شده) و ارائه آ‌ن‌ها در خروجی و همراه با یکدیگر است.

شایان توجه است که سه فیلد یک مخاطب را می‌توان به هر ترتیبی ذخیره کرد. برای مثال، شماره تلفن قبل از نام کاربری و یا نام کاربری پیش از شماره تلفن می‌تواند ظاهر شود.

دو مخاطب مشابه هستند اگر نام کاربری، ایمیل یا شماره تلفن مشابهی داشته باشند. مثال زیر در این راستا قابل توجه است.

Input: contact[] = 
     { {"Gaurav", "gaurav@gmail.com", "gaurav@gfgQA.com"},
       { "Lucky", "lucky@gmail.com", "+1234567"},
       { "gaurav123", "+5412312", "gaurav123@skype.com"}.
       { "gaurav1993", "+5412312", "gaurav@gfgQA.com"}
     }
Output:
   ۰ ۲ ۳
   ۱ 
contact[2] is same as contact[3] because they both have same
contact number.
contact[0] is same as contact[3] because they both have same
e-mail address.
Therefore, contact[0] and contact[2] are also same.

ورودی اساسا آرایه‌ای از ساختارها است. یک ساختار حاوی سه فیلدی است که می‌توانند هر جزئیاتی پیرامون مخاطب را نمایش دهند. ایده آن است که گرافی از مخاطبان با استفاده از آرایه داده شده ساخته شود. اگر هر دو راس دارای نام کاربری، ایمیل یا شماره تلفن مشابهی باشند، در گراف، یالی بین راس i و j قرار دارد. هنگامی که گراف ساخته شد، وظیفه به پیدا کردن مولفه‌های متصل در گراف غیر مستقیم کاهش پیدا می‌کند. می‌توان مولفه‌های متصل را با انجام جستجوی BFS یا DFS با آغاز از هر راس مشاهده نشده پیدا کرد. در کد زیر از DFS استفاده شده است.

برنامه جستجوی مخاطب‌های مشابه در ++C

// A C++ program to find same contacts in a list of contacts 
#include<bits/stdc++.h> 
using namespace std; 
  
// Structure for storing contact details. 
struct contact 
{ 
    string field1, field2, field3; 
}; 
  
// A utility function to fill entries in adjacency matrix 
// representation of graph 
void buildGraph(contact arr[], int n, int *mat[]) 
{ 
    // Initialize the adjacency matrix 
    for (int i=0; i<n; i++) 
       for (int j=0; j<n; j++) 
           mat[i][j] = 0; 
  
    // Traverse through all contacts 
    for (int i = 0; i < n; i++) { 
  
        // Add mat from i to j and vice versa, if possible. 
        // Since length of each contact field is at max some 
        // constant. (say 30) so body execution of this for 
        // loop takes constant time. 
        for (int j = i+1; j < n; j++) 
            if (arr[i].field1 == arr[j].field1 || 
                arr[i].field1 == arr[j].field2 || 
                arr[i].field1 == arr[j].field3 || 
                arr[i].field2 == arr[j].field1 || 
                arr[i].field2 == arr[j].field2 || 
                arr[i].field2 == arr[j].field3 || 
                arr[i].field3 == arr[j].field1 || 
                arr[i].field3 == arr[j].field2 || 
                arr[i].field3 == arr[j].field3) 
            { 
                mat[i][j] = 1; 
                mat[j][i] = 1; 
                break; 
            } 
    } 
} 
  
// A recuesive function to perform DFS with vertex i as source 
void DFSvisit(int i, int *mat[], bool visited[], vector<int>& sol, int n) 
{ 
    visited[i] = true; 
    sol.push_back(i); 
  
    for (int j = 0; j < n; j++) 
        if (mat[i][j] && !visited[j]) 
            DFSvisit(j, mat, visited, sol, n); 
} 
  
// Finds similar contacrs in an array of contacts 
void findSameContacts(contact arr[], int n) 
{ 
    // vector for storing the solution 
    vector<int> sol; 
  
    // Declare 2D adjaceny matrix for mats 
    int **mat = new int*[n]; 
  
    for (int i = 0; i < n; i++) 
        mat[i] = new int[n]; 
  
    // visited array to keep track of visited nodes 
    bool visited[n]; 
    memset(visited, 0, sizeof(visited)); 
  
    // Fill adjacency matrix 
    buildGraph(arr, n, mat); 
  
    // Since, we made a graph with contacts as nodes with fields as links. 
    // two nodes are linked if they represent the same person. 
    // so, total number of connected components and nodes in each component 
    // will be our answer. 
    for (int i = 0; i < n; i++) 
    { 
        if (!visited[i]) 
        { 
            DFSvisit(i, mat, visited, sol, n); 
  
            // Add delimeter to separate nodes of one component from other. 
            sol.push_back(-1); 
        } 
    } 
  
    // Print the solution 
    for (int i = 0; i < sol.size(); i++) 
        if (sol[i] == -1) cout << endl; 
        else cout << sol[i] << " "; 
} 
  
// Drive program 
int main() 
{ 
    contact arr[] = {{"Gaurav", "gaurav@gmail.com", "gaurav@gfgQA.com"}, 
                     {"Lucky", "lucky@gmail.com", "+1234567"}, 
                     {"gaurav123", "+5412312", "gaurav123@skype.com"}, 
                     {"gaurav1993", "+5412312", "gaurav@gfgQA.com"}, 
                     {"raja", "+2231210", "raja@gfg.com"}, 
                     {"bahubali", "+878312", "raja"} 
                    }; 
  
    int n = sizeof arr / sizeof arr[0]; 
    findSameContacts(arr, n); 
    return 0; 
}

برنامه جستجوی مخاطب‌های مشابه در پایتون ۳

# A Python3 program to find same contacts 
# in a list of contacts  
  
# Structure for storing contact details.  
class contact: 
    def __init__(self, field1,  
                       field2, field3): 
        self.field1 = field1 
        self.field2 = field2 
        self.field3 = field3 
  
# A utility function to fill entries in  
# adjacency matrix representation of graph  
def buildGraph(arr, n, mat): 
      
    # Initialize the adjacency matrix 
    for i in range(n): 
        for j in range(n): 
            mat[i][j] = 0
  
    # Traverse through all contacts  
    for i in range(n): 
  
        # Add mat from i to j and vice versa,  
        # if possible. Since length of each  
        # contact field is at max some constant. 
        # (say 30) so body execution of this for  
        # loop takes constant time. 
        for j in range(i + 1, n): 
            if (arr[i].field1 == arr[j].field1 or 
                arr[i].field1 == arr[j].field2 or 
                arr[i].field1 == arr[j].field3 or 
                arr[i].field2 == arr[j].field1 or 
                arr[i].field2 == arr[j].field2 or 
                arr[i].field2 == arr[j].field3 or 
                arr[i].field3 == arr[j].field1 or 
                arr[i].field3 == arr[j].field2 or 
                arr[i].field3 == arr[j].field3): 
                mat[i][j] = 1
                mat[j][i] = 1
                break
  
# A recuesive function to perform DFS  
# with vertex i as source  
def DFSvisit(i, mat, visited, sol, n): 
    visited[i] = True
    sol.append(i)  
  
    for j in range(n): 
        if (mat[i][j] and not visited[j]): 
            DFSvisit(j, mat, visited, sol, n) 
  
# Finds similar contacrs in an 
# array of contacts  
def findSameContacts(arr, n): 
      
    # vector for storing the solution  
    sol = [] 
  
    # Declare 2D adjaceny matrix for mats  
    mat = [[None] * n for i in range(n)]  
  
    # visited array to keep track 
    # of visited nodes  
    visited = [0] * n 
  
    # Fill adjacency matrix  
    buildGraph(arr, n, mat)  
  
    # Since, we made a graph with contacts   
    # as nodes with fields as links. Two  
    # nodes are linked if they represent 
    # the same person. So, total number of  
    # connected components and nodes in each 
    # component will be our answer. 
    for i in range(n): 
        if (not visited[i]): 
            DFSvisit(i, mat, visited, sol, n)  
  
            # Add delimeter to separate nodes 
            # of one component from other.  
            sol.append(-1) 
  
    # Prthe solution 
    for i in range(len(sol)): 
        if (sol[i] == -1): 
            print() 
        else: 
            print(sol[i], end = " ") 
  
# Driver Code  
if __name__ == '__main__':  
    arr = [contact("Gaurav", "gaurav@gmail.com", "gaurav@gfgQA.com"),  
           contact("Lucky", "lucky@gmail.com", "+1234567"),  
           contact("gaurav123", "+5412312", "gaurav123@skype.com"),  
           contact("gaurav1993", "+5412312", "gaurav@gfgQA.com"),  
           contact("raja", "+2231210", "raja@gfg.com"), 
           contact("bahubali", "+878312", "raja")] 
  
    n = len(arr)  
    findSameContacts(arr, n) 
  
# This code is contributed by PranchalK

پیچیدگی زمانی این روش از درجه O(n2)‎ است که در آن، n تعداد مخاطب‌هاست.

 

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

منبع [+]

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *