搜索JavaScript对象键的时间复杂度是多少?

时间:2017-09-24 14:20:25

标签: javascript object time-complexity

我使用JavaScript对象作为字典,并希望使密钥不区分大小写。我用Object.defineProperty()来实现这个:

Object.defineProperty(Object.prototype, "getKeyUpperCase", {
    value: function(prop) {
        for (var key in this) {
            if (key.toUpperCase() === prop.toUpperCase()) {
                return this[key];
            };
        };
    },
    enumerable: false
});

在JavaScript中通过密钥搜索对象的时间复杂度是多少?我期待这本词典可以容纳大约100万个键。

对我而言,最坏的情况似乎是O(n),最好的情况是O(1),平均情况是O(n/2)。这是对的吗?

将对象的密钥作为数组(Object.Keys(dictionary).map(function(key) return key.toUpperCase()).sort())检索以检查密钥是否存在会更有效吗?我是否正确地说这个操作的平均时间复杂度是O(log n)

字典的用法与此相符:

var dictionary = {/* some million keys or so */};
var oldKey = someSmallArray[i];
var newValue = dictionary.getKeyUpperCase(oldKey.trim().toUpperCase());

1 个答案:

答案 0 :(得分:1)

首先,考虑一下大O符号:

这个数学工具试图抓住"数量级的概念"在长期的情况下。随着大小的增长,常量变得越来越不重要。因此,计算big-O通常我们不会为常量而烦恼。

这就是为什么O(n / 2)= O(n)。

因此线性查找具有O(n)时间复杂度。

关于排序:

JavaScript的排序算法取决于浏览器,但您可以假设其复杂度为O(n log n)。通常,仅对一次查找进行排序是不值得的,但如果您只能进行一次排序,并且可以进行多次查找,那么这是值得的。顺便说一下,如果您有一个要排序的搜索列表,也许您可​​以尝试实施二进制搜索来加快搜索速度。