日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java实现根据权重优先返回(速度较快)

發布時間:2025/3/20 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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~444444~11777711~14333314~184242 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是變化的則只能用上面的方式

public class 權重 {private static int total=0;private static TreeMap<Integer,String> map = null;//組裝數據static{System.out.println("靜態塊只在第一次調用時執行");List<String[]> list = new ArrayList<String[]>();String[] str1 = {"1","5511155"}; String[] str2 = {"2","5555555"};String[] str3 = {"3","55588885"};String[] str4 = {"2","500000000555"};list.add(str1);list.add(str2);list.add(str3); list.add(str4);for(int i=0;i<1000000;i++){//1千萬條數據list.add(str4);}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]); }} /*** 獲得給定List集合里權重大的結果* @param list* @return* @author Peter*/public String getMax(){ int random = (int)(Math.random()*total);Integer key = map.ceilingKey(random);return map.get(key);} }

總結

以上是生活随笔為你收集整理的Java实现根据权重优先返回(速度较快)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。