Java实现根据权重优先返回(速度较快)
生活随笔
收集整理的這篇文章主要介紹了
Java实现根据权重优先返回(速度较快)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面的實現比我最初寫的快了四倍多喲。
實現思路:
我們知道,在10以內的整數里,0~3出現的概率是0.3,3~6出現的概率是0.3,6~7出現的概率是0.1,7~9出現的概率是0.2,9~10出現的概率是0.1 ;上面對應的權重可對應為3 、3 、1、2 、1 。
所以,當我們需要實現不知道權重到底是多少時,我們只需要將所有權重加起來,假設為100,然后讓隨機數只出現0到100,接著給每個權重設定一個區間段,權重有多大,該區間段就有多寬,其中總區間就是總權重。
在組裝我們的數據上也需要一定的技巧,我們用TreeMap來組裝,key是區間段后面一個值,如下面0~4區間段對應的是4,然后將后面的值(如”4444“)放進value里。
生成在總權重范圍內的隨機數,假設是2;然后我們根據TreeMap的ceilingKey(2) 方法獲得大于等于2的最鍵,這里得到是4。這樣就能去TreeMap里取到我們需要的值了
下面數據對應區間段:0~4 :4444,4~11:7777,11~14:3333,14~18:4242 public class 權重 {//測試public static void main(String[] args) {String[] str1 = {"4","4444"}; //權重為4String[] str2 = {"7","7777"}; //權重為7String[] str3 = {"3","3333"}; //權重為3String[] str4 = {"4","4242"}; //權重為4List<String[]> list = new ArrayList<String[]>();list.add(str1);list.add(str2);list.add(str3);list.add(str4);Long s = System.currentTimeMillis();String str = null;for(int i=0;i<10000000;i++){str = new 權重().getMax(list);}Long e = System.currentTimeMillis();System.out.println("耗時:"+(e-s));System.out.println(str);//String result = new 權重().getMax(list);}/*** 獲得給定List集合里權重大的結果* @param list* @return* @author Peter*/public String getMax(List<String[]> list){ int len = list.size();int total = 0;//總權重//以權重區間段的后面的值作為key存當前信息TreeMap<Integer,String> map = new TreeMap<Integer, String>(); for(int i=0; i<len; i++){String[] array = list.get(i);total += Integer.parseInt(array[0]);map.put(total, array[1]); }int random = (int)(Math.random()*total);Integer key = map.ceilingKey(random);return map.get(key);}}思考:
下面的實現只是說在有10000萬人的用戶去取的速度快;但如果list里的數據有1千萬條,而我們只取一次時的速度就沒什么多大的提高,原因是于組成Map的時候耗時太多,如果我們將耗時的過程存為靜態,即只在第一次訪問時組裝。當然,這里機List是不變的,如果List是變化的則只能用上面的方式
總結
以上是生活随笔為你收集整理的Java实现根据权重优先返回(速度较快)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串的快速匹配
- 下一篇: Java获得泛型类中T的实例