Java實現根據權重優先返回(速度較快)

2021-07-16 13:36:17 字數 2112 閱讀 4178

下面的實現比我最初寫的快了四倍多喲。

實現思路

我們知道,在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.合併 左式堆的合併操作基於遞迴實現,演算法思路如下 若有一棵樹是空樹,則返回另一棵樹 否則將根節點較大的堆與根節點較小的堆的右子樹合併。使形成的新堆作為較小堆的右子樹。如果違反了左式堆的特性,交換兩個子樹的位...