Find Influencer



Find Influencer

public interface InfluencerFinder {

/ Given a matrix of following between N LinkedIn users (with ids from 0 to N-1): followingMatrix[i][j] == true iff user i is following user j thus followingMatrix[i][j] doesn't imply followingMatrix[j][i]. Let's also agree that followingMatrix[i][i] == false Influencer is a user who is: - followed by everyone else and - not following anyone himself This method should find an Influencer by a given matrix of following, or return -1 if there is no Influencer in this group. / int getInfluencer(boolean[][] followingMatrix)

Analysis

The most naive method is using two loops to check if the user is an influencer. Time complexity of this method is O(n^2)

However, it is easy to prove that there is only one influencer. So we can start from the first user, all the user followed by him is impossible to be an influencer. In the mean time, if any one follows him, he is impossible to be an influencer. So think like we are traverse on the matrix. Time complexity of this method is O(n)

Another interesting way to think of this question is that, since all column are independent to each other. We can parallelly sum the column up. All the columns that sum up to N - 1 can be one possible influncer. Why we should check by column instead of row? Because few users will be followed by everyone else. However, lots of people may not follow anyone. Then we only need to check if they actually do not follow anyone. There are a coulple of ways to parallel it.

  1. Divide the columes and spawn threads to compute them.
  2. Use some thing list ISPC tasks to parallel them, we can make use of SIMD as well.
  3. Use MapReduce to parallel.


Read full article from Find Influencer


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts