ㄟ......忽略題目要求,暴力法解之 XD
2024年10月3日 星期四
2024年9月13日 星期五
2024年8月13日 星期二
2024年8月11日 星期日
2024年8月6日 星期二
2024年8月4日 星期日
2024年8月1日 星期四
2024年7月31日 星期三
2024年7月30日 星期二
2024年7月27日 星期六
2024年7月25日 星期四
2024年7月24日 星期三
2024年7月13日 星期六
2024年7月12日 星期五
2024年7月3日 星期三
2024年7月2日 星期二
2024年6月30日 星期日
2024年6月24日 星期一
2024年6月22日 星期六
2024年6月19日 星期三
2024年6月18日 星期二
2024年6月16日 星期日
2024年6月12日 星期三
2024年6月10日 星期一
2024年6月9日 星期日
2024年6月8日 星期六
2024年6月7日 星期五
2024年5月31日 星期五
2024年5月30日 星期四
2024年5月28日 星期二
2024年5月27日 星期一
2024年5月26日 星期日
2024年2月19日 星期一
2024年2月18日 星期日
2024年2月16日 星期五
2024年2月7日 星期三
2024年2月2日 星期五
2024年1月29日 星期一
2024年1月28日 星期日
2024年1月27日 星期六
2024年1月17日 星期三
2024年1月15日 星期一
[146] LRU Cache
雖然以前寫過了(?)但是很值得為它重開一篇!!!
以前的寫法,不知道為什麼現在已經compile 不過了 XD
當時用了一個假timer 去紀錄時間,而我現在想不起來我為什麼要把它宣告成static !!!
(比較厲害嗎?XD)
總之就是據說要有一個雙向linked list,這樣它新增刪除會比較快,
另外也最好有hash table去存,這樣找人也比較快!!!
因為題意的key最多10001種,所以直接拿它當hash key !!!
在一直滾來滾去然後各種拖延之後,沒有debug很久就pass了!!!(感動落淚)
看來linked list 已經可以了吧(自己說)
速度看起來不快XD 不過至少沒有超時,我可以接受XD(誰理妳XD)
在get和put的時候,如果已有同樣的key存在,我的作法是先把它delete掉,
再加進去,求個"感覺上"的乾淨俐落XD 但我不確定如果只有更新重新排序的方法會不會比較快XD 以上兒~~~~~
#define MAX_KEYS 10001
struct myNode{
int key;
int val;
struct myNode *next;
struct myNode *pre;
};
typedef struct {
struct myNode *head;
struct myNode *tail;
int size;
int count;
struct myNode *queue[MAX_KEYS];
} LRUCache;
void debugPrint(LRUCache* obj)
{
printf("===debugPrint===\n");
struct myNode *ptr= obj->head;
while (ptr != NULL)
{
printf("key %d val %d\n",ptr->key, ptr->val);
ptr = ptr->next;
}
printf("===End debugPrint===\n");
}
LRUCache* lRUCacheCreate(int capacity) {
LRUCache* LRU = calloc (1, sizeof (LRUCache));
LRU-> size= capacity;
LRU-> count = 0;
LRU->head = NULL;
LRU->tail = NULL;
return LRU;
}
void addqueue(LRUCache* obj, int key, int value) {
obj->queue[key] = calloc (1 , sizeof (struct myNode));
obj->queue[key]-> pre = obj->tail;
obj->queue[key]-> next = NULL;
if (obj->tail != NULL)
obj->tail->next = obj->queue[key];
obj->tail = obj->queue[key];
obj->queue[key]->val = value;
obj->queue[key]->key = key;
if (obj->head == NULL)
obj->head = obj->queue[key];
obj->count ++;
}
void removequeue(LRUCache* obj, int key) {
struct myNode *ptr= obj->queue[key];
struct myNode *ptr_pre = obj->queue[key]->pre;
struct myNode *ptr_next = obj->queue[key]->next;
if (ptr_pre == NULL)//head
{
obj->head = ptr_next;
if (ptr_next != NULL)
ptr_next->pre = NULL;
}
else
ptr_pre->next = ptr_next;
if (ptr_next == NULL) // tail
{
obj->tail = ptr_pre;
if (ptr_pre != NULL)
ptr_pre->next = NULL;
}
else
ptr_next->pre = ptr->pre;
ptr_pre=NULL;
ptr_next = NULL;
obj->queue[key] = NULL;
free (obj->queue[key]);
obj->count --;
}
int lRUCacheGet(LRUCache* obj, int key) {
if (obj->queue[key] == NULL)
return -1;
int value = obj->queue[key]->val;
removequeue(obj,key);
addqueue(obj,key, value);
return obj->queue[key]->val;
}
void lRUCachePut(LRUCache* obj, int key, int value) {
if (obj->queue[key]!= NULL)
removequeue(obj,key);
else if (obj->count == obj-> size)
removequeue(obj,obj->head->key);
addqueue(obj,key, value);
//debugPrint(obj);
}
void lRUCacheFree(LRUCache* obj) {
for (int i=0; i< MAX_KEYS; i++)
free(obj->queue[i]);
free(obj);
}
/**
* Your LRUCache struct will be instantiated and called as such:
* LRUCache* obj = lRUCacheCreate(capacity);
* int param_1 = lRUCacheGet(obj, key);
* lRUCachePut(obj, key, value);
* lRUCacheFree(obj);
*/
訂閱:
文章 (Atom)