- 用戶A推薦B,B推薦C,我們說C的最終推薦人是A,B的最終推薦人也是A,而A沒有最終推薦人,一般來說我們用**數據庫**來建立這種關係,在數據庫表中,我們可以記錄兩行數據,其中 actor_id表示用戶 id,referrer_id 表示推薦人 id。
- 問:如何通過一個給定的用戶id找到這個用戶的最終推薦人?
long findRootReferrerId(long actorId) {
Long referrerId = select referrer_id from [table] where actor_id = actorId;
if (referrerId == null) return actorId;
return findRootReferrerId(referrerId);
}
- 但是這裏有兩個問題:
- 如果遞歸很深,可能會有堆棧溢出的問題。
- 如果數據庫裏存在髒數據,我們還需要處理由此產生的無限遞歸問題。 第一個問題可通過限制遞歸深度來解決,第二個問題其實也可以如此解決,但是偶一個更高級的處理方法就是自動檢測A-B-C-A環的存在(用hash表實現)。