【发布时间】:2012-04-22 22:47:22
【问题描述】:
背景
我目前有一个这样的数组:
[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 的所有值,但仍然使用二进制搜索(我不想遍历所有内容!!)。
谢谢!
【问题讨论】:
-
@ManseUK--不用担心!有什么想法吗?
-
正在努力!!!!输入总是一个数字吗? (单词范围让我很困惑)
-
@ManseUK--如果这让你感到困惑,请随时更改。我也在使用该特定脚本进行单词搜索,但请随意简化。到目前为止,我最好的想法是找到一个正匹配,然后向外递增和递减以收集所有匹配,但这似乎很慢而且很讨厌。
-
正是我的想法 - 我的浏览器已经崩溃了几次测试!!!!
-
我正在考虑在第一个肯定结果之后递归地运行二进制搜索以实现相同的结果,但没有迭代。仍然在弄清楚如何做到这一点。 . .
标签: javascript algorithm search nosql