【发布时间】:2020-08-23 16:51:16
【问题描述】:
我使用二进制搜索来搜索应该在我的应用程序中呈现的行范围。 GridRow 有 3 个属性:top、height 和 bottom,并且行列表已排序。
例子:
我将30px 传递给我的第一个电话rowBinarySearch,在下一行140 和firstIndex 以加速搜索。我返回 lastIndex + 1 以修复数组中最后一行的可见性:
const firstIndex = rowBinarySearch(rows, 30);
const lastIndex = rowBinarySearch(rows, 140, firstIndex);
return range.slice(firstIndex, lastIndex + 1);
搜索功能实现:
function rowBinarySearch(arr: GridRow[], val: number, start = 0, end = arr.length - 1): number {
const mid = Math.floor((start + end) / 2);
if (mid < 0)
return 0;
if (val === arr[mid].top)
return mid;
if (start >= end)
return mid; // original version should return -1 if element dont exist
return val < arr[mid].top
? rowBinarySearch(arr, val, start, mid - 1)
: rowBinarySearch(arr, val, mid + 1, end);
}
预期行为:
1.删除上面评论列表中评论的hacky return
2. 找到第一个行的top 值低于搜索值的行
3. 如果不应该将lastIndex 增加1,我会很棒
感谢您的帮助:)
【问题讨论】:
-
高度是否始终为 25,行是否始终相邻?
-
25px 是默认行高,每行可能不同。是的,每一行都彼此相邻。
标签: javascript arrays typescript algorithm binary-search