我想创建一个b树,用于在本地存储中存储一些数据。我正在考虑使用它来查找排序列表中的ID索引。
如果我正常索引数组(即追加array[20032] = 123
,那么Javascript数组中的那个是什么?)。
function sortedIndex(array, value) {
var low = 0,
high = array.length;
while (low < high) {
var mid = (low + high) >>> 1;
if (array[mid] < value) low = mid + 1;
else high = mid;
}
return low;
}
当我用随机数测试时,我得到了一些碰撞,它在10k之前退出。
for (i = 0; i < 10000; i++) {
var r = Math.random();
array[sortedIndex(array,r)] = r;
}
这在一段时间后退出(我假设是因为碰撞)。
我认为这是生日悖论的一种事情,因为当列表已经填充时碰撞似乎更有可能(参见图表链接)(但没有抛出异常......)。
我希望在多次迭代后看到数组的最终长度,我得到的最终长度分布如下:
sortedList = []
listLengths = []
for (j = 0; j < 100; j++) {
for (i = 0; i < 10000; i++) {
var r = Math.random();
sortedList[sortedIndex(sortedList,r)] = r;
}
listLengths.push(sortedList.length);
}
老实说,我不想处理这个问题,也会对有效的localStorage库提出一些建议。
答案 0 :(得分:0)
问题是当你在数组中插入一个新元素时,你没有移动所有旧元素。因此,当新项高于其他任何项时,您将将数组扩展1,但只有当它小于或等于最大元素时才覆盖现有元素。
array.splice
会插入并移动所有内容以腾出空间。
get(names.foo)
[1] "This is: A"