javascript - 使用 JavaScript,我如何执行将返回多个值的二进制搜索?

标签 javascript algorithm search nosql

背景

我目前有一个这样的数组:

[1,1,2,3,4,5,5,5,6,7,8,8,8,8,9,10]

我一直在使用来自 this website 的一个很棒的 JS 二进制搜索公式:

searchArray = function(needle, haystack, case_insensitive) {
    if (typeof(haystack) === 'undefined' || !haystack.length) return -1;
    
    var high = haystack.length - 1;
    var low = 0;
    case_insensitive = (typeof(case_insensitive) === 'undefined' || case_insensitive) ? true:false;
    needle = (case_insensitive) ? needle.toLowerCase():needle;
    
    while (low <= high) {
        mid = parseInt((low + high) / 2)
        element = (case_insensitive) ? haystack[mid].toLowerCase():haystack[mid];
        if (element > needle) {
            high = mid - 1;
        } else if (element < needle) {
            low = mid + 1;
        } else {
            return mid;
        }
    }
    
    return -1;
};

这适用于返回单个值。

问题

如何返回范围而不是单个值?例如,我如何从数组中返回 8 的所有值,但仍然使用二进制搜索(我不想遍历所有内容!!)。

谢谢!

最佳答案

是这样的吗? http://jsfiddle.net/DCLey/3/

var arr = ['1','1','2','3','4','5','5','5','6','7','8','8','8','8','9','10'];
        //  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15            
var searchArray = function(needle, haystack, case_insensitive) {
    if (typeof(haystack) === 'undefined' || !haystack.length) return -1;

    var high = haystack.length - 1;
    var low = 0;
    var vals = []; 
    var bUp = true; 
    var bDown = true;
    var i = 1; 
    case_insensitive = (typeof(case_insensitive) === 'undefined' || case_insensitive) ? true:false;
    needle = (case_insensitive) ? needle.toLowerCase():needle;

    while (low <= high) {
        mid = parseInt((low + high) / 2)
        element = (case_insensitive) ? haystack[mid].toLowerCase():haystack[mid];
        if (element > needle) {
            high = mid - 1;
        } else if (element < needle) {
            low = mid + 1;
        } else {
            vals.push(mid); 
            while(bUp || bDown){
                if(bUp && haystack[mid] === haystack[mid + i]){
                    vals.push(mid + i); 
                }else{
                    bUp = false;   
                }
                if(bDown && haystack[mid] === haystack[mid - i]){
                    vals.push(mid - i); 
                }else{
                    bDown = false;   
                }
                i++;
            }
            return vals; 
        }
    }

    return -1;
};

alert(searchArray('8', arr, true)); 

关于javascript - 使用 JavaScript,我如何执行将返回多个值的二进制搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092242/

相关文章:

javascript - 如何在 JavaScript 中向 ContextualWeb 图像搜索 API 发出 GET 请求?

mysql - 按多列排序

javascript - 对 Paypal 的 HTTP 请求

javascript - 如何在 ExtJS(和 Sencha 架构师)的 GridPanel 中显示嵌套对象?

javascript - window.postmessage() 在不同选项卡中的应用程序之间进行通信

algorithm - 如何实现扩展欧几里得算法?

algorithm - 用 O(n) 中的值范围对数组进行排序

apache - Solr 拼写检查与模糊搜索

javascript - 数组访问问题

algorithm - 随机一个 512 位整数 N,它不是 2、3 或 5 的倍数