【发布时间】:2018-08-12 08:02:19
【问题描述】:
在准备面试时,我遇到了一些问题,这让我质疑我对大 O 常数时间算法的理解。
LeetCode 上的一个问题要求创建 LFU 缓存问题的解决方案。
有3种方法可以实现:
构造函数 - 输入:整数容量
得到 - 输入:int 键 - 输出:int
设置 - 输入:int 键,int 值
容量表示您一次可以保存的缓存键/值对的最大数量。当容量被破坏时,您必须弹出访问频率最低的对。
显然,您必须跟踪每个项目的访问次数。
在问题的底部,它询问您是否可以在 O(1) 时间内获取和设置。
我正在研究这方面的多个提议的实现,很多人都同意它们是恒定时间实现的示例,但在我看来,它们看起来像 O(N)。
但是这个例子中的相关方法在下面的代码块中。注意 valueHash 和 nodeHash 都是 java 哈希表。
public int get(int key) {
if (valueHash.containsKey(key)) {
increaseCount(key);
return valueHash.get(key);
}
return -1;
}
public void set(int key, int value) {
if ( cap == 0 ) return;
if (valueHash.containsKey(key)) {
valueHash.put(key, value);
} else {
if (valueHash.size() < cap) {
valueHash.put(key, value);
} else {
removeOld();
valueHash.put(key, value);
}
addToHead(key);
}
increaseCount(key);
}
方法调用Hashtable.containsKey和Hashtable.get,实现线性搜索。所以最坏情况的时间复杂度是 O(N) 对吧?我错过了什么?
【问题讨论】:
-
我想这里的相关问题是:n是什么?
-
Hashtable 和 HashMap 是基于 hasing 的,
containsKey()和get()是 O(1),由数组支持,如果发生冲突,元素会在数组的索引处链接。使用 Hasing 算法,将 key 转换为表示数组中索引的 int。访问数组中索引处的元素是 O(1)
标签: algorithm big-o constant-time