由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - LRU cache 超时
相关主题
LRU cache 超时, 大家帮忙看看发个g的电面
请教一道, leetcode题.写的LRU通不过大数据,帮忙看看
LRU cache 问题LRU的多线程版本,这个答案有问题吗
菜鸟 贴一个 leetcode LRU Cache -- java代码,并求解疑惑。求点评:电话面试(今天第二天没有消息回复,感觉可能挂了)
关于用STL实现LRU cache上个Yahoo电面面经, 给恶心坏了。。
LRU Cache, 请问, 如果我这样写,错误在哪里?为什么会time limit exceeded? 谢谢A家新鲜面经--都是经典题
4sum o(n^2)超时请教LeetCode的3Sum
Leetcode的Substring with Concatenation of All Words超时。LeetCode 的 4 sum 问题 如何用hash table做呢?
相关话题的讨论汇总
话题: key话题: integer话题: int话题: value话题: keylist
进入JobHunting版参与讨论
1 (共1页)
a**********0
发帖数: 422
1
代码本身很简单 但是超时 而且test case 不容易复制 因为是cap =2048 然后一长串
操作的
import java.util.*;
public class LRUCache {

int cap;
//hashmap is for Cache's storage
// arraylist is for items' recencies
HashMap myHashMap; // key-value
ArrayList myArrayList; // key


public LRUCache(int capacity) { // this is the constructor

this.cap = capacity;
myHashMap = new HashMap(); // key-value
myArrayList = new ArrayList();// key
}

public int get(int key) {

if(this.myHashMap.get(key) == null)
return -1;

this.myArrayList.remove(new Integer(key));
this.myArrayList.add(key);

return this.myHashMap.get(key).intValue();

}

public void set(int key, int value) {



if(this.myHashMap.size()< this.cap){

if(this.myHashMap.get(key) != null){

this.myHashMap.put(key,value);
this.myArrayList.remove(new Integer(key));
this.myArrayList.add(key);
}else{
this.myHashMap.put(key,value);
this.myArrayList.add(key);
}


}else{
if(this.myHashMap.get(key) != null){

this.myHashMap.put(key,value);
this.myArrayList.remove(new Integer(key));
this.myArrayList.add(key);

}else{

this.myHashMap.remove(myArrayList.get(0));
this.myHashMap.put(key,value);
this.myArrayList.remove(0); // remove entry with index =0
this.myArrayList.add(key);

}

}

}

}
l*********8
发帖数: 4642
2
myArrayList.remove is O(n)

【在 a**********0 的大作中提到】
: 代码本身很简单 但是超时 而且test case 不容易复制 因为是cap =2048 然后一长串
: 操作的
: import java.util.*;
: public class LRUCache {
:
: int cap;
: //hashmap is for Cache's storage
: // arraylist is for items' recencies
: HashMap myHashMap; // key-value
: ArrayList myArrayList; // key

a**********0
发帖数: 422
3
那怎么办
记录recency的要容易找到头节点 因为有时要删除最老的 也要可以删除random的一个
因为要更新某key的recency
int[] 估计不行 因为删除需要重新调整array的内容
怎么办?

【在 l*********8 的大作中提到】
: myArrayList.remove is O(n)
a**********0
发帖数: 422
4
网上很多linkedlistHashmap 不用那个有什么解决方法
l*********8
发帖数: 4642
5
自己写一个double linked list

【在 a**********0 的大作中提到】
: 网上很多linkedlistHashmap 不用那个有什么解决方法
a**********0
发帖数: 422
6
remove 仍然 O(n)
而且没法根据内容remove (每次get set之后要更新recency)
我建议你简单写几行代码取代原来的arraylist 否则我不太清楚你的思路

【在 l*********8 的大作中提到】
: 自己写一个double linked list
l*********8
发帖数: 4642
7
http://www.programcreek.com/2013/03/leetcode-lru-cache-java/

【在 a**********0 的大作中提到】
: remove 仍然 O(n)
: 而且没法根据内容remove (每次get set之后要更新recency)
: 我建议你简单写几行代码取代原来的arraylist 否则我不太清楚你的思路

a**********0
发帖数: 422
8
懒得再在这个上花时间了 我的代码logic是对的
w********s
发帖数: 1570
9
get的操作不是O(1),当然超市了
这题很简单,用hashmap记录,用list维护序列
class LRUCache{
public:
unordered_map _map;
unordered_map::iterator> _itmap;
list* _keylist;
int _capacity;

LRUCache(int capacity) {
_keylist = new list(capacity);
_capacity = capacity;
}

int get(int key) {
int value = -1;

if (_map.find(key) != _map.end())
{
value = _map[key];
_keylist->erase(_itmap[key]);
_keylist->push_front(key);
_itmap[key] = _keylist->begin();
}

return value;
}

void set(int key, int value) {
if (_map.find(key) != _map.end())
{
_map[key] = value;
_keylist->erase(_itmap[key]);
_keylist->push_front(key);
_itmap[key] = _keylist->begin();
return;
}

if (_keylist->size() >= _capacity)
{
int k = _keylist->back();
_keylist->pop_back();
_itmap.erase(k);
_map.erase(k);
}

_keylist->push_front(key);
_itmap[key] = _keylist->begin();
_map[key] = value;
}
};

【在 a**********0 的大作中提到】
: 代码本身很简单 但是超时 而且test case 不容易复制 因为是cap =2048 然后一长串
: 操作的
: import java.util.*;
: public class LRUCache {
:
: int cap;
: //hashmap is for Cache's storage
: // arraylist is for items' recencies
: HashMap myHashMap; // key-value
: ArrayList myArrayList; // key

w********s
发帖数: 1570
10
用hashmap存key->iterator

【在 a**********0 的大作中提到】
: 代码本身很简单 但是超时 而且test case 不容易复制 因为是cap =2048 然后一长串
: 操作的
: import java.util.*;
: public class LRUCache {
:
: int cap;
: //hashmap is for Cache's storage
: // arraylist is for items' recencies
: HashMap myHashMap; // key-value
: ArrayList myArrayList; // key

l*********8
发帖数: 4642
11
c++是可以这样做。 不知道JAVA可以吗?

【在 w********s 的大作中提到】
: 用hashmap存key->iterator
1 (共1页)
进入JobHunting版参与讨论
相关主题
LeetCode 的 4 sum 问题 如何用hash table做呢?关于用STL实现LRU cache
关于Hash_mapLRU Cache, 请问, 如果我这样写,错误在哪里?为什么会time limit exceeded? 谢谢
问一下OJ的Anagrams那道题4sum o(n^2)超时
怎么找一个数组里面,出现次数是偶数的数?Leetcode的Substring with Concatenation of All Words超时。
LRU cache 超时, 大家帮忙看看发个g的电面
请教一道, leetcode题.写的LRU通不过大数据,帮忙看看
LRU cache 问题LRU的多线程版本,这个答案有问题吗
菜鸟 贴一个 leetcode LRU Cache -- java代码,并求解疑惑。求点评:电话面试(今天第二天没有消息回复,感觉可能挂了)
相关话题的讨论汇总
话题: key话题: integer话题: int话题: value话题: keylist