zoukankan      html  css  js  c++  java
  • javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
    /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/
    function qSort(arr){
        if (arr.length == 0) {
            return [];
        }
        var left = [];//存储小于基准值
        var right = [];//存储大于基准值
        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));//递归
    }
    
    /*二分查找法,基本原理如下:
    * 将数组的第一个位置设置为下边界(0).将数组的最后一个元素所在的位置设置为上边界(数组的长度减1)。
    * 若下边界等于或小于上边界,则做如下操作:
    *   (1).将中点设置为(上边界加上下边界) 除以2.
    *    (2). 如果中点的元素小于查询的值,则将下边界设置为中点元素所在下标加1.
    *    (3). 如果中点的元素大于查询的值,则将上边界设置为中点元素所在下标减1.
    *    (4). 否则中点元素即为要查找 的数据,可以进行返回。*/
    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;
    }
    
    /*
    *计算重复次数
    *当binSearch()函数找到某个值时,如果在数据集中还有其他相同的值出现,那么该函数会定位在类似值的附近。
    *换句话说,其他相同的值可能会出现已找到值的左边或右边。
    *如果在数据集中能找到这个值,那么这个函数将开始通过两个循环来统计这个值出现的次数。
    *第一个循环向下遍历数组,统计找到的值出现的次数,当下一个值与要查找的值不匹配时则停止计数。
    *第二个循环向上遍历数组,统计找到的值出现的次数,当下一个值与要查找的值不匹配时则停止计数。
    * */
    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("需要查找的数据为: " + findnum);
    var retVal = binSearch(list, findnum);
    if (retVal >= 0) {
        console.log( "找到 " + findnum + "的位置为: "+retVal);
    }else {
        console.log(" is not in array.");
    }
    console.log(findnum + "重复次数为"+count(list, findnum));
  • 相关阅读:
    (转)DirectInput编程基础
    怎么样解决3D 地形、天空盒等网格模型出现缝隙的问题
    D3DLIGHT9光源
    D3DXCreateTextureFromFileEx
    CreateVertexBuffer和CreateIndexBuffer
    D3D中材质通过D3DMATERIAL9结构说明
    IDirect3DVertexBuffer9::Lock和IDirect3DIndexBuffer9::Lock
    D3DPRESENT_PARAMETERS_结构(D3D初始化)(
    Windows Phone开发(6):处理屏幕方向的改变
    Windows Phone开发(4):框架和页
  • 原文地址:https://www.cnblogs.com/baiyangyuanzi/p/6709059.html
Copyright © 2011-2022 走看看