binary-searching
Version:
Better binary searching
157 lines (131 loc) • 3.76 kB
JavaScript
;
var tape = require("tape");
var bounds = require("../search-bounds.js");
var guard = require("guarded-array");
tape("greaterThanEquals", function (t) {
var lb = bounds.ge;
function checkArray(arr, values) {
var garr = guard(arr);
for (var l = 0; l < arr.length; ++l) {
for (var h = l; h < arr.length; ++h) {
for (var i = 0; i < values.length; ++i) {
for (var j = l; j <= h; ++j) {
if (arr[j] >= values[i]) {
break;
}
}
t.equals(
lb(garr, values[i], l, h),
j,
"search in [" + l + "," + h + "]"
);
}
}
}
}
checkArray([0, 1, 1, 1, 2], [-1, 0, 1, 2, 0.5, 1.5, 5]);
t.equals(lb([0, 2, 5, 6], 0), 0);
t.equals(lb([0, 2, 5, 6], 1), 1);
t.equals(lb([0, 2, 5, 6], 2), 1);
t.equals(lb([0, 2, 5, 6], 3), 2);
t.equals(lb([0, 2, 5, 6], 4), 2);
t.equals(lb([0, 2, 5, 6], 5), 2);
t.equals(lb([0, 2, 5, 6], 6), 3);
function cmp(a, b) {
return a - b;
}
t.equals(lb([0, 1, 1, 1, 2], -1, cmp), 0);
t.equals(lb([0, 1, 1, 1, 2], 0, cmp), 0);
t.equals(lb([0, 1, 1, 1, 2], 1, cmp), 1);
t.equals(lb([0, 1, 1, 1, 2], 2, cmp), 4);
t.equals(lb([0, 1, 1, 1, 2], 0.5, cmp), 1);
t.equals(lb([0, 1, 1, 1, 2], 1.5, cmp), 4);
t.equals(lb([0, 1, 1, 1, 2], 5, cmp), 5);
t.equals(lb([0, 2, 5, 6], 0, cmp), 0);
t.equals(lb([0, 2, 5, 6], 1, cmp), 1);
t.equals(lb([0, 2, 5, 6], 2, cmp), 1);
t.equals(lb([0, 2, 5, 6], 3, cmp), 2);
t.equals(lb([0, 2, 5, 6], 4, cmp), 2);
t.equals(lb([0, 2, 5, 6], 5, cmp), 2);
t.equals(lb([0, 2, 5, 6], 6, cmp), 3);
t.end();
});
tape("lessThan", function (t) {
var lu = bounds.lt;
function checkArray(arr, values) {
var garr = guard(arr);
for (var l = 0; l < arr.length; ++l) {
for (var h = l; h < arr.length; ++h) {
for (var i = 0; i < values.length; ++i) {
for (var j = h; j >= l; --j) {
if (values[i] > arr[j]) {
break;
}
}
t.equals(
lu(garr, values[i], l, h),
j,
i + " - indexOf(" + values[i] + ")=" + j + " [" + l + "," + h + "]"
);
}
}
}
}
checkArray([0, 1, 1, 1, 2], [-1, 0, 1, 2, 0.5, 1.5, 5]);
t.end();
});
tape("greaterThan", function (t) {
var lb = bounds.gt;
function checkArray(arr, values) {
var garr = guard(arr);
for (var l = 0; l < arr.length; ++l) {
for (var h = l; h < arr.length; ++h) {
for (var i = 0; i < values.length; ++i) {
for (var j = l; j <= h; ++j) {
if (arr[j] > values[i]) {
break;
}
}
t.equals(lb(garr, values[i], l, h), j);
}
}
}
}
checkArray([0, 1, 1, 1, 2], [-1, 0, 1, 2, 0.5, 1.5, 5]);
t.end();
});
tape("lessThanEquals", function (t) {
var lu = bounds.le;
function checkArray(arr, values) {
var garr = guard(arr);
for (var i = 0; i < values.length; ++i) {
for (var j = arr.length - 1; j >= 0; --j) {
if (values[i] >= arr[j]) {
break;
}
}
t.equals(
lu(garr, values[i]),
j,
i + " - indexOf(" + values[i] + ")=" + j
);
}
}
checkArray([0, 1, 1, 1, 2], [-1, 0, 1, 2, 0.5, 1.5, 5]);
t.end();
});
tape("equals", function (t) {
var lu = bounds.eq;
function checkArray(arr, values) {
var garr = guard(arr);
for (var i = 0; i < values.length; ++i) {
if (arr.indexOf(values[i]) < 0) {
t.equals(lu(garr, values[i]), -1);
} else {
t.equals(arr[lu(garr, values[i])], values[i]);
}
}
}
checkArray([0, 1, 1, 1, 2], [-1, 0, 1, 2, 0.5, 1.5, 5]);
t.end();
});