下面的實現比我最初寫的快了四倍多喲。
實現思路:
我們知道,在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 權重 ; //權重為4
string str2 = ; //權重為7
string str3 = ; //權重為3
string str4 = ; //權重為4
listlist = new arraylist();
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++)
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(listlist)
int random = (int)(math.random()*total);
integer key = map.ceilingkey(random);
return map.get(key);
}}
思考:
下面的實現只是說在有10000萬人的使用者去取的速度快;但如果list裡的資料有1千萬條,而我們只取一次時的速度就沒什麼多大的提高,原因是於組成map的時候耗時太多,如果我們將耗時的過程存為靜態,即只在第一次訪問時組裝。當然,這裡機list是不變的,如果list是變化的則只能用上面的方式
public
class 權重 ;
string str2 = ;
string str3 = ;
string str4 = ;
list.add(str1);
list.add(str2);
list.add(str3);
list.add(str4);
for(int i=0;i<1000000;i++)
int len = list.size();
int total = 0;//總權重
//以權重區間段的後面的值作為key存當前資訊
/*treemap*/
map = new treemap();
for(int i=0; i0]);
map.put(total, array[1]);
}}
/*** 獲得給定list集合裡權重大的結果
*@param list
*@return
*@author peter
*/public string getmax()
}
php賦值權重 php實現根據使用者權重值分配訂單
一 前言 二 實現思路 要實現根據權重分配,首先要統計使用者的總權重,訂單數 總權重 單個權重對應的訂單數。最後就可以根據對應的訂單數乘以權重值就可以了。另外還需注意一種情況,訂單數除總權重有餘數,這時候需要根據餘數輪詢分配資料。三 實現 public function dispense else ...
iOS實現根據返回資料改變cell元素的座標位置
實現類似於一下設計稿的需求 其中 認證 商鋪 資質 這三個控制項會根據後端資料來決定是否會顯示.其中任何乙個都有可能沒有 我們可以在vc中的cellforrow方法裡面編寫 通過判斷來改變控制項的位置,但是將 全部寫入vc中顯得過於繁雜,我們可以參照改變cell中label的高度的方法,將改變的方法...
優先佇列之左式堆 JAVA實現
1.零路徑長度 某節點的零路徑長度為該節點到沒有兩個兒子的節點最短距離。2.左式堆性質 1.合併 左式堆的合併操作基於遞迴實現,演算法思路如下 若有一棵樹是空樹,則返回另一棵樹 否則將根節點較大的堆與根節點較小的堆的右子樹合併。使形成的新堆作為較小堆的右子樹。如果違反了左式堆的特性,交換兩個子樹的位...