[英]More Efficient Way to Accomplish This?
我需要知道玩家使用exp數量和exp圖表的等級。 我想以最有效的方式做到這一點。 這就是我得到的。 注意:真正的expChart有數千個級別/索引。 所有值都在遞增。
var expChart = [1,10,23,54,65,78,233,544,7666,22224,64654,456456,1123442];
/*
lvl 0: //0-1[ exp
lvl 1: //[1-10[ exp
lvl 2: //[10-23[ exp
*/
getLvlViaExp = function(exp){
for(var i = 0 ; i < expChart.length ; i++){
if(exp < expChart[i]) break;
}
return i;
}
這是一種更有效的方法。 每個x步驟(例如,6個實例,可能每百個有真實圖表),我做一個快速比較並跳轉到近似索引,跳過許多索引。
getLvlViaExp = function(exp){
var start = 0;
if(exp > 233) start = 6;
if(exp > 1123442) start = 12;
for(var i = start ; i < expChart.length ; i++){
if(exp < expChart[i]) break;
}
return i;
}
還有更好的方法嗎?
解:
Array.prototype.binarySearch = function(value){
var startIndex = 0,
stopIndex = this.length - 1,
middle = Math.floor((stopIndex + startIndex)/2);
if(value < this[0]) return 0;
while(!(value >= this[middle] && value < this[middle+1]) && startIndex < stopIndex){
if (value < this[middle]){
stopIndex = middle - 1;
} else if (value > this[middle]){
startIndex = middle + 1;
}
middle = Math.floor((stopIndex + startIndex)/2);
}
return middle+1;
}
最好的搜索算法是二進制搜索,即O(lg n)(除非您可以使用哈希搜索O(c)進行搜索)。
http://www.nczonline.net/blog/2009/09/01/computer-science-in-javascript-binary-search/
基本上跳到圖表的中間(n / 2)。 您是否從該數字中獲得更高或更低的體驗。 如果更高跳到中間的上半部分。 如果下跳到下半部分的中間:比較並重復,直到找到你要找的東西。
var expChart = [1,10,23,54,65,78,233,544,7666,22224,64654,456456,1123442];
getLvlViaExp = function(exp){
var min=0;
var max=expChart.length-1;
var i;
while(min <=max){
i=Math.round((min+max)/2);
//document.write("<br />"+i+":"+min+":"+max+"<br />");
if(exp>=expChart[i] && exp <=expChart[i+1]) {
break;
}
if(exp>=expChart[i]){
min=i+1;
}
if(exp<=expChart[i]){
max=i-1;
}
}
return i;
}
document.write(getLvlViaExp("10"));
我測試了它,似乎工作得很好。 如果您想查看實際獲得答案的步驟數,請在while循環中取消注釋document.write。 看着它真是令人着迷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.