b-tree(生日悖论)的Javascript碰撞解释?

时间:2018-04-28 04:52:25

标签: javascript

我想创建一个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); 
}

在追加尝试1-100次迭代后排序数组的最终长度图

老实说,我不想处理这个问题,也会对有效的localStorage库提出一些建议。

1 个答案:

答案 0 :(得分:0)

问题是当你在数组中插入一个新元素时,你没有移动所有旧元素。因此,当新项高于其他任何项时,您将将数组扩展1,但只有当它小于或等于最大元素时才覆盖现有元素。

array.splice会插入并移动所有内容以腾出空间。

get(names.foo)
[1] "This is:  A"