首先積分值有個最大值,積分由n變化到m 排名變化的只是在積分n到積分m的客戶排名會發生變化故此 有如下實現使用rankandnum來表示處在該積分的排名和數值
使用rankandnums數值來儲存所有積分排名(注意:rankandnums[n]中rankandnum中的rank和num則表示積分為n的排名和處在積分為n的使用者數量)
看下面積分改變時注意自己畫圖理解,積分由n上公升到m時位於n到m(不包括m)中積分的排名(如果該位置已經有排名)都會降低一位;
其他情況也是類似
下面上**:
/** * 該類主要用於現有積分排名策略 能夠迅速感知積分排名的變化;
* 而時間複雜度又不至於過高。
* * 該演算法在計算時需要考慮變化之後,原來位置有沒有積分排名,變化後原位置是否有積分排名,
* 是否應該清楚該積分排名等操作。是不是首位,末尾等提示。
*/public class paiming
}public static void main(string args) ;
array =p.getarray(array);//排序獲得有序的陣列 使用的是堆排序,
p.init(); //給現有的積分進行排名
p.getranking(array);
p.getrecentranking(7, 0);
for (int i = 0; i < 10; i++)
//int t = p.find(array, 0, array.length - 1, 7);
}//首先進行排序 從0開始為根節點,
public void minheap(int array, int start, int end)
}public int getarray(int array)
return array;
}public void swap(int array, int i, int j)
//獲得積分排名 使用rank來儲存 並(存在分數相同的情況),因為已經有序 但注意到積分可能會相同
//這個時候取前面的陣列下表為積分排名
public void getranking(int array)
rankandnums[array[i]].rank = i + 1;
rankandnums[array[i]].num = 1;}}
//假設積分發生變動,某使用者由n積分 ,變為 m積分,m,n都為正整數;
public void getrecentranking(int n, int m)
}if (next == -1) else
} else }}
if (rankandnums[n].num == 0)
} else if (m < n)
}//對排名m另做處理
if (previous == -1) else
} else if(previous == m)else
if (rankandnums[n].num == 0)
} else
}// (遞迴查詢有沒有)
/*** 本函式主要用於查詢已在array中的元素,不存在查詢不到的情況
** @param array 目標陣列
* @param left 起始位置
* @param right 終止位置
* @param target 查詢物件
* @return 排名
*/private int find(int array, int left, int right, int target) else if (target < array[pos]) else
}return -1;
}//查詢最後乙個大於自己的數的下標即為現在排名
}
海量使用者積分排名演算法
使用者 使用者擁有積分,積分可能會在使用過程中隨時更新,設計一種演算法,在使用者登入時顯示其當前基本排名,積分為非負整數,且小於100萬。海量使用者積分排名演算法 1.利用資料庫,建立表結構為使用者id和積分的表,用sql查詢得到排名。優點是簡單,利用sql功能,無需複雜查詢邏輯,不引入額外的儲存結...
MySQL海量使用者積分排序問題
某海量使用者 使用者擁有積分,積分可能會在使用過程中隨時更新。現在要為該 設計一種演算法,在每次使用者登入時顯示其當前積分排名。使用者最大規模為2億 積分為非負整數,且小於100萬。儲存結構 首先,我們用一張使用者積分表user score來儲存使用者的積分資訊 表結構 示例資料 下面的演算法會基於...
海量積分資料實時排名演算法
積分排名在很多專案都會出現,積分排名主要滿足以下需求 當排序的資料量不大的時候,這個需求很容易滿足,但是如果資料量很大的時候比如百萬級 千萬級甚至上億的時候,或者有實時排名需求 這個時候要滿足效能 低成本等需求,在設計上就變得複雜起來了。高效做法是不對積分進行排序,僅僅是統計每個積分區間的人數,用積...