Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4d28c1b

Browse files
Add C++ implementation
Signed-off-by: begeekmyfriend <begeekmyfriend@gmail.com>
1 parent 275ecc7 commit 4d28c1b

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

‎460_lfu_cache/lfu_cache.c‎

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ typedef struct FreqAVLNode {
3131

3232
typedef struct {
3333
FreqAVLNode *root;
34+
FreqAVLNode *min_freq_node;
3435
} FreqAVLTree;
3536

3637
typedef struct LFUNode {
@@ -284,19 +285,11 @@ static void avl_node_erase(FreqAVLTree *tree, FreqAVLNode *node)
284285
avl_tree_balance(tree, startpoint);
285286
}
286287

287-
static FreqAVLNode *avl_tree_min_get(FreqAVLTree *tree)
288-
{
289-
FreqAVLNode *node = tree->root;
290-
while (node->children[0] != NULL) {
291-
node = node->children[0];
292-
}
293-
return node;
294-
}
295-
296288
static FreqAVLTree *avl_tree_init(void)
297289
{
298290
FreqAVLTree *tree = malloc(sizeof(*tree));
299291
tree->root = NULL;
292+
tree->min_freq_node = NULL;
300293
return tree;
301294
}
302295

@@ -327,7 +320,11 @@ static void freq_incr(FreqAVLTree* tree, LFUNode *lfu, int key)
327320

328321
/* New frequency */
329322
int freq = ++lfu->freq;
330-
lfu->node = avl_tree_insert(tree, freq);
323+
FreqAVLNode *node = avl_tree_insert(tree, freq);
324+
if (lfu->node == tree->min_freq_node) {
325+
tree->min_freq_node = node;
326+
}
327+
lfu->node = node;
331328
list_add(&lfu->dlink, &lfu->node->dhead);
332329
}
333330

@@ -378,7 +375,7 @@ void lFUCachePut(LFUCache* obj, int key, int value)
378375

379376
/* squeeze minimum frequency */
380377
if (obj->size == obj->capacity) {
381-
FreqAVLNode *node = avl_tree_min_get(obj->tree);
378+
FreqAVLNode *node = obj->tree->min_freq_node;
382379
lfu = list_last_entry(&node->dhead, LFUNode, dlink);
383380
list_del(&lfu->dlink);
384381
list_del(&lfu->key_link);
@@ -396,6 +393,7 @@ void lFUCachePut(LFUCache* obj, int key, int value)
396393
lfu->val = value;
397394
lfu->freq = 1;
398395
lfu->node = avl_tree_insert(obj->tree, lfu->freq);
396+
obj->tree->min_freq_node = lfu->node;
399397
list_add(&lfu->dlink, &lfu->node->dhead);
400398
list_add(&lfu->key_link, &obj->hheads[hash]);
401399
}
@@ -430,7 +428,7 @@ void lFUCacheFree(LFUCache* obj)
430428
int main(void)
431429
{
432430
LFUCache* obj = lFUCacheCreate(2);
433-
#if 1
431+
#if 0
434432
lFUCachePut(obj, 1, 1);
435433
printf("Put 1 1\n");
436434
lFUCachePut(obj, 2, 2);

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /