不使用map和set實現LRU 那用List?

2022-06-14 08:33:08 字數 1000 閱讀 4296

遇到一道面試題,不使用map和set實現lru,要求get的時間複雜度為o(logn),put的時間複雜度不超過o(n)。想到了用arraylist來實現,儲存有序的key。然而牽涉add節點,在保證有序的情況下通過插入排序在arraylist中插入乙個新節點,時間複雜度不能保證o(n),粗略寫了乙個**,供大家提出一些建議。

class lrucache 

}private int capacity;

private listlist;

private int getid;

private listnode tail;

private listnode head;

public lrucache(int k)

// 二分查詢

public int search(int key) else if (node.key < key) else

}return -1;

}// get

public int get(int key)

listnode node = list.get(getid);

node.pre.next = node.next;

node.next.pre = node.pre;

addtotail(node);

return node.val;

}// put

public void put(int key, int val)

listnode node = new listnode(key, val);

addtotail(node);

int i = 0;

for (; i < list.size(); ++i)

}if (i == list.size()) list.add(node);

if (list.size() > capacity)

}public void addtotail(listnode node)

}

Map和Set簡單使用

map 和set的底層就是紅黑樹,map是k,v模型,而set是k模型。以上就是map的內部實現的成員函式,構造,插入刪除,等。map作為k,v模型,可以有很多用途,比如實現乙個字典。map實現乙個字典 include using namespace std include include int ...

Map和Set簡單使用

map 和set的底層就是紅黑樹,map是k,v模型,而set是k模型。以上就是map的內部實現的成員函式,構造,插入刪除,等。map作為k,v模型,可以有很多用途,比如實現乙個字典。map實現乙個字典 include using namespace std include include int ...

map和set的使用和原理

我們學習過順序容器如vecor,list等,它們中的元素是按照在容器中的位置來順序儲存和訪問的。而接下來要學習的關聯容器則有根本的不同,它們中的元素是按關鍵字來儲存和訪問的。在 c primer 中列舉了標準庫中的8個關聯容器,如下 關聯容器支援高效的關鍵字查詢和訪問,我們在這裡介紹兩個主要的關聯容...