我正在尝试在JavaScript中实现二进制搜索算法.事情似乎没问题,但我的回复陈述似乎是未定义的回归?谁能说出这里有什么问题?
小提琴:http://jsfiddle.net/2mBdL/
谢谢.
var a = [
1,
2,
4,
6,
1,
100,
0,
10000,
3
];
a.sort(function (a, b) {
return a - b;
});
console.log('a,', a);
function binarySearch(arr, i) {
var mid = Math.floor(arr.length / 2);
console.log(arr[mid], i);
if (arr[mid] === i) {
console.log('match', arr[mid], i);
return arr[mid];
} else if (arr[mid] < i && arr.length > 1) {
console.log('mid lower', arr[mid], i);
binarySearch(arr.splice(mid, Number.MAX_VALUE), i);
} else if (arr[mid] > i && arr.length > …
Run Code Online (Sandbox Code Playgroud) 所以对类似的问题有一个非常优雅的答案。问题是要构建一个数组树,其中每个数组只有 1、2、4、8、16 或 32 个项目,并且每个项目都处于相同的嵌套级别。我在没有考虑整个系统的情况下制定了这个问题(我猜是做快速原型设计),但是我认为当前的系统不能真正用于从数组中间删除项目,或将项目添加到数组中间. 很遗憾。
我需要能够在数组中间添加/删除项目,因为这将用于分桶哈希表中的数组,或快速添加和删除项目的通用数组(如管理内存块)。所以我在考虑如何平衡它与只拥有 1、2、4、8、16 或 32 个项目的内存块大小的愿望。因此,树,但我认为该树需要工作稍有不同从所造成的问题这个问题。
我在想的是有一个如下的系统。嵌套数组树中的每个数组可以有 1、2、4、8、16 或 32 个项目,但这些项目不需要位于同一级别。将项目放在同一级别的原因是因为有一个非常有效的算法来getItemAt(index)
判断它们是否处于同一级别。但它存在不允许有效插入/删除的问题。但是我认为这可以通过让每个父数组“容器”跟踪它有多少深度嵌套的子元素来解决数组中的项目处于不同级别的问题。它本质上会跟踪子树的大小。然后要找到带有 的项目getItemAt(index)
,您将遍历树的顶层,计算顶层树的大小,然后像这样缩小树的搜索范围。
此外,叶数组(每个数组有 1、2、4、8、16 或 32 个项目)可以删除项目,然后您只需调整该短数组项目的位置。所以你会从这个开始:
[1, 2, 3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)
...删除6
,并得到这个(这里-
是null
):
[1, 2, 3, 4, 5, 7, 8, -]
Run Code Online (Sandbox Code Playgroud)
然后,如果您9
在位置 3添加一个项目,则会导致:
[1, 2, 9, 3, 4, 5, 7, 8]
Run Code Online (Sandbox Code Playgroud)
这很好,因为假设您有一百万个项目数组。您现在只需调整最多包含 32 个项目的单个数组,而不是移动一百万个项目。 …