-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathGraph.cpp
More file actions
127 lines (105 loc) · 3.19 KB
/
Copy pathGraph.cpp
File metadata and controls
127 lines (105 loc) · 3.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "Graph.h"
Graph::Graph() {}
void Graph::addEdge(const User& u, const User& v, int weight)
{
auto& neighbors = adjacencyList[u];
auto it = std::find_if(neighbors.begin(), neighbors.end(), [&](const std::pair<User, int>& p) {
return p.first.getUsername() == v.getUsername();
});
if (it == neighbors.end())
{
neighbors.emplace_back(v, weight);
adjacencyList[v].emplace_back(u, weight);
}
}
int Graph::calculateSimilarity(const User& u1, const User& u2) const
{
int similarity = 0;
const auto& qualities1 = u1.getQualities();
const auto& qualities2 = u2.getQualities();
for (const auto& quality1 : qualities1)
{
if (std::find(qualities2.begin(), qualities2.end(), quality1) != qualities2.end())
{
similarity++;
}
}
return similarity;
}
void Graph::print() const
{
for (const auto& entry : adjacencyList)
{
std::cout << entry.first.getUsername() << ": ";
for (const auto& neighbor : entry.second)
{
std::cout << "(" << neighbor.first.getUsername() << ", " << neighbor.second << ") ";
}
std::cout << std::endl;
}
}
void Graph::buildGraph(const std::vector<User>& users)
{
for (size_t i = 0; i < users.size(); ++i)
{
for (size_t j = i + 1; j < users.size(); ++j)
{
int similarity = calculateSimilarity(users[i], users[j]);
if (similarity > 0)
{
addEdge(users[i], users[j], similarity);
}
}
}
}
std::vector<User> Graph::suggestUsers(const User& targetUser, int topN) const
{
std::vector<std::pair<User, int>> similarityScores;
auto it = adjacencyList.find(targetUser);
if (it != adjacencyList.end())
{
similarityScores.assign(it->second.begin(), it->second.end());
}
std::sort(similarityScores.begin(), similarityScores.end(),
[](const std::pair<User, int>& a, const std::pair<User, int>& b) {
return a.second > b.second;
});
std::vector<User> suggestions;
for (int i = 0; i < std::min(topN, static_cast<int>(similarityScores.size())); ++i)
{
suggestions.push_back(similarityScores[i].first);
}
return suggestions;
}
void Graph::buildGraphFromAVL(AVLTree* tree)
{
std::vector<User> users;
collectUsersFromAVL(tree->getRoot(), users);
for (const auto& user : users)
{
for (const auto& followerUsername : user.getFollowers())
{
auto it = std::find_if(users.begin(), users.end(), [&](const User& u) {
return u.getUsername() == followerUsername;
});
if (it != users.end())
{
int similarity = calculateSimilarity(user, *it);
if (similarity > 0)
{
addEdge(user, *it, similarity);
}
}
}
}
}
void Graph::collectUsersFromAVL(Node* node, std::vector<User>& users)
{
if (node == nullptr)
{
return;
}
collectUsersFromAVL(node->left, users);
users.push_back(*node->user);
collectUsersFromAVL(node->right, users);
}