Redian新闻
>
今天如果能收小绿就再好不过了。
avatar
今天如果能收小绿就再好不过了。# Stock
N*g
1
【 以下文字转载自 Notice 讨论区 】
发信人: deliver (自动发信系统), 信区:
标 题: NewEgg 封 bignamehyp 在 ebiz 版
发信站: BBS 未名空间站自动发信系统 (Thu May 13 00:32:25 2010)
【此篇文章是由自动发信系统所张贴】
由于 bignamehyp 在 ebiz 版的 发表不恰当文章 行为,
被暂时取消在本版的发文权力 14 天。
版主:NewEgg
Thu May 13 00:32:14 2010
avatar
s*n
2
代码在此,哪位大牛帮忙瞄一眼错在哪儿
通过不了的bench不小,转到自己程序里debug不容易
class DLL{
public:
int key_;
int value_;
DLL* prev_;
DLL* next_;
DLL (int key, int value, DLL* prev, DLL* next): key_(key), value_(value)
, prev_(prev), next_(next){}
};
class LRUCache{
public:
int capacity_;
DLL* head_;
DLL* tail_;
unordered_map hash_;
LRUCache(int capacity):capacity_(capacity), head_(NULL),tail_(NULL){
}
void insertHead (DLL* temp){
temp->next_ = head_;
if (head_)
head_->prev_ = temp;
head_ = temp;
if (tail_ == NULL)
tail_ = temp;
}
void deleteNode (DLL* temp){
if (temp->prev_){
temp->prev_->next_ = temp->next_;
}
if (temp->next_){
temp->next_->prev_ = temp->prev_;
}
if (tail_ == temp)
tail_ = tail_->prev_;
if (head_ == temp)
head_ = head_->next_;
}
int get(int key) {
if (hash_.find(key) == hash_.end()){
return -1;
}
DLL* temp = hash_[key];
deleteNode (temp);
insertHead (temp);
return hash_[key]->value_;
}

void set(int key, int value) {
if (hash_.find(key) != hash_.end()){
hash_[key]->value_ = value;
DLL* temp = hash_[key];
deleteNode (temp);
insertHead (temp);
}else{
if (hash_.size() >= capacity_){
hash_.erase(tail_->value_);
deleteNode(tail_);
delete tail_;
}
DLL* temp = new DLL(key, value, NULL, head_);
insertHead (temp);
hash_[key] = head_;
}
}
};
avatar
b*t
3
目前这个形势咱的要求也不能太高,给领导添麻烦。
avatar
f*4
4
我就扫了一眼,可能。。貌似。。你删除node的时候没有把那个node在你的map里删除
。。但我觉得好像还有别的问题吧。。
avatar
d*0
5
你又反指了.....
avatar
s*n
6
那个deleteNode是在DoubleLinkedList里面删除,hashmap里删除在外面
这么做是因为get的时候也会update中间的node到head,但不在hash里删除

【在 f********4 的大作中提到】
: 我就扫了一眼,可能。。貌似。。你删除node的时候没有把那个node在你的map里删除
: 。。但我觉得好像还有别的问题吧。。

avatar
g*4
7
因为没被mark。
发信人: duoduo2010 (朵朵), 信区: Stock
标 题: Re: 今天如果能收小绿就再好不过了。
发信站: BBS 未名空间站 (Thu Jan 28 18:27:37 2010, 美东)
你又反指了.....
avatar
w*s
8
在超过capacity的情况下,你只是把尾指针的内容删除了,还应该调整尾指针的位置。
avatar
b*t
9
haha!
avatar
s*n
10
在deleteNode里面有调整啊
if (tail_ == temp)
tail_ = tail_->prev_;
哎,这题真奇了

【在 w**s 的大作中提到】
: 在超过capacity的情况下,你只是把尾指针的内容删除了,还应该调整尾指针的位置。
avatar
w*s
11
那你岂不是先调整再删除了?删错位置了。

【在 s*****n 的大作中提到】
: 在deleteNode里面有调整啊
: if (tail_ == temp)
: tail_ = tail_->prev_;
: 哎,这题真奇了

avatar
s*n
12
You are right.可是改完了还是fail在同一个test bench上了,我把code update了一下
C++指针操作真那么容易出bug吗。。

【在 w**s 的大作中提到】
: 那你岂不是先调整再删除了?删错位置了。
avatar
w*s
13
你删除hash table里面的成员应该是 hash_.erase(tail_->key_) 不应该hash_.erase(
tail_->value_)
avatar
s*u
14
其实我觉得,大家为什么不用stl的实现呢,那个list肯定是效率很高和bugfree的啊。
不喜欢用iterator?
avatar
G*m
15
DLL为啥不用std::list呢?

value)

【在 s*****n 的大作中提到】
: 代码在此,哪位大牛帮忙瞄一眼错在哪儿
: 通过不了的bench不小,转到自己程序里debug不容易
: class DLL{
: public:
: int key_;
: int value_;
: DLL* prev_;
: DLL* next_;
: DLL (int key, int value, DLL* prev, DLL* next): key_(key), value_(value)
: , prev_(prev), next_(next){}

avatar
l*3
16
这题建议先用stl里面的list, 过了以后再用自己的双向链表. 我开始用自己写的双向
链表也是总也过不了
avatar
s*n
17
后来自己也发现了,但是改了还是不过,105cap的case在经过几百次get set后开始出
现wrong answer

erase(

【在 w**s 的大作中提到】
: 你删除hash table里面的成员应该是 hash_.erase(tail_->key_) 不应该hash_.erase(
: tail_->value_)

avatar
s*n
18
有个担心是stl空间不够的时候会copy自己,那hash里面存的pointer就全失效了,以前
用vector碰到过,list应该不会
那我先试试stl的吧

【在 s********u 的大作中提到】
: 其实我觉得,大家为什么不用stl的实现呢,那个list肯定是效率很高和bugfree的啊。
: 不喜欢用iterator?

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。