JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之檢索算法示例【二分查找法、計(jì)算重復(fù)次數(shù)】
本文實(shí)例講述了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之檢索算法。分享給大家供大家參考,具體如下:
javascript數(shù)據(jù)結(jié)構(gòu)與算法---檢索算法(二分查找法、計(jì)算重復(fù)次數(shù))
/*只需要查找元素是否存在數(shù)組,可以先將數(shù)組排序,再使用二分查找法*/
function qSort(arr){
if (arr.length == 0) {
return [];
}
var left = [];//存儲(chǔ)小于基準(zhǔn)值
var right = [];//存儲(chǔ)大于基準(zhǔn)值
var pivot = arr[0];
for (var i = 1; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return qSort(left).concat(pivot, qSort(right));//遞歸
}
/*二分查找法,基本原理如下:
* 將數(shù)組的第一個(gè)位置設(shè)置為下邊界(0).將數(shù)組的最后一個(gè)元素所在的位置設(shè)置為上邊界(數(shù)組的長度減1)。
* 若下邊界等于或小于上邊界,則做如下操作:
* (1).將中點(diǎn)設(shè)置為(上邊界加上下邊界) 除以2.
* (2). 如果中點(diǎn)的元素小于查詢的值,則將下邊界設(shè)置為中點(diǎn)元素所在下標(biāo)加1.
* (3). 如果中點(diǎn)的元素大于查詢的值,則將上邊界設(shè)置為中點(diǎn)元素所在下標(biāo)減1.
* (4). 否則中點(diǎn)元素即為要查找 的數(shù)據(jù),可以進(jìn)行返回。*/
function binSearch(arr,data) {
var lowerBound = 0;
var upperBound = arr.length - 1;
while(lowerBound <= upperBound) {
var mid = Math.floor((upperBound + lowerBound)/2);
if(arr[mid] < data) {
lowerBound = mid + 1;
}else if(arr[mid] > data) {
upperBound = mid - 1;
}else {
return mid;
}
}
return -1;
}
/*
*計(jì)算重復(fù)次數(shù)
*當(dāng)binSearch()函數(shù)找到某個(gè)值時(shí),如果在數(shù)據(jù)集中還有其他相同的值出現(xiàn),那么該函數(shù)會(huì)定位在類似值的附近。
*換句話說,其他相同的值可能會(huì)出現(xiàn)已找到值的左邊或右邊。
*如果在數(shù)據(jù)集中能找到這個(gè)值,那么這個(gè)函數(shù)將開始通過兩個(gè)循環(huán)來統(tǒng)計(jì)這個(gè)值出現(xiàn)的次數(shù)。
*第一個(gè)循環(huán)向下遍歷數(shù)組,統(tǒng)計(jì)找到的值出現(xiàn)的次數(shù),當(dāng)下一個(gè)值與要查找的值不匹配時(shí)則停止計(jì)數(shù)。
*第二個(gè)循環(huán)向上遍歷數(shù)組,統(tǒng)計(jì)找到的值出現(xiàn)的次數(shù),當(dāng)下一個(gè)值與要查找的值不匹配時(shí)則停止計(jì)數(shù)。
* */
function count(arr, data) {
var count = 0;
var position = binSearch(arr, data);
if (position > -1) {
++count;
for (var i = position-1; i > 0; --i) {
if (arr[i] == data) {
++count;
}
else {
break;
}
}
for (var i = position+1; i < arr.length; ++i) {
if (arr[i] == data) {
++count;
}
else {
break;
}
}
}
return count;
}
var nums = [90,43,49,15,23,2,70,23,20,95,69,23,29,26];
var list = qSort(nums);
console.log(list);
var findnum = 23;
console.log("需要查找的數(shù)據(jù)為: " + findnum);
var retVal = binSearch(list, findnum);
if (retVal >= 0) {
console.log( "找到 " + findnum + "的位置為: "+retVal);
}else {
console.log(" is not in array.");
}
console.log(findnum + "重復(fù)次數(shù)為"+count(list, findnum));
使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼,可得如下運(yùn)行結(jié)果:

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript實(shí)現(xiàn)找出數(shù)組中最長的連續(xù)數(shù)字序列
這篇文章主要介紹了JavaScript實(shí)現(xiàn)找出數(shù)組中最長的連續(xù)數(shù)字序列的方法,需要的朋友可以參考下2014-09-09
JS中DOM元素的attribute與property屬性示例詳解
這篇文章主要給大家介紹了關(guān)于JS中DOM元素的attribute與property屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧2018-09-09
JavaScript null和undefined區(qū)別分析
在JavaScript開發(fā)中,被人問到:null與undefined到底有啥區(qū)別?2009-10-10
JavaScript實(shí)現(xiàn)簡單進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡單進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
Select下拉框模糊查詢功能實(shí)現(xiàn)代碼
這篇文章主要介紹了Select下拉框模糊查詢功能實(shí)現(xiàn)代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
JavaScript正則表達(dá)式簡單實(shí)用實(shí)例
這篇文章主要介紹了JavaScript正則表達(dá)式簡單實(shí)用實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
Bootstrap-table自定義可編輯每頁顯示記錄數(shù)
這篇文章主要介紹了Bootstrap-table自定義可編輯每頁顯示記錄數(shù)的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
原生JS實(shí)現(xiàn)動(dòng)態(tài)添加新元素、刪除元素方法
這篇文章主要介紹了原生js實(shí)現(xiàn)動(dòng)態(tài)添加新元素、刪除元素方法 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05

