我使用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());
答案 0 :(得分:1)
首先,考虑一下大O符号:
这个数学工具试图抓住"数量级的概念"在长期的情况下。随着大小的增长,常量变得越来越不重要。因此,计算big-O通常我们不会为常量而烦恼。
这就是为什么O(n / 2)= O(n)。
因此线性查找具有O(n)时间复杂度。
关于排序:
JavaScript的排序算法取决于浏览器,但您可以假设其复杂度为O(n log n)。通常,仅对一次查找进行排序是不值得的,但如果您只能进行一次排序,并且可以进行多次查找,那么这是值得的。顺便说一下,如果您有一个要排序的搜索列表,也许您可以尝试实施二进制搜索来加快搜索速度。