導航:首頁 > 編程語言 > javalru演算法

javalru演算法

發布時間:2022-09-19 07:26:45

java中LinkedHashMap的LRU演算法,為什麼多次訪問其實並未改變元素的實際排序

要這樣才行!!
Map hashMap = new LinkedHashMap<Integer, Integer>(16,(float) 0.75,true);

hashMap.get(2);是獲取KEY為2的那一組,即(2,2)
二使用最多,所以排到最後 。
如果你要得到(3,3)就用hashMap.get(3). 這裡面的3並不是map中的索引數值,而是你定義的KEY 。 你可以這樣:
for (int i = 0; i < 6; i++) {
hashMap.put(i+"--", i);
}
即將KEY變為字元串,你獲取數據的時候就必須用get("1--")這樣的KEY

㈡ 用java語言實現LRU演算法和FIFO演算法。急急急!!!!!!!

您好,網路貼吧專家團很高興能夠回答您的問題。您的採納是我們前進的動力。
public class LRU {

private int theArray[];
private int back; //定義隊尾
private int currentSize; //隊列中存放元素個數
private int maxSize=5; //隊列中能存放元素的個數

public LRU(){
theArray=new int[maxSize];
back=0;
currentSize=0;
}
public void queue(int a[]){
for(int i=0;i<a.length;i++){
enQueue(a[i]);
}
}

public void enQueue(int x){ //入隊
beUsed(x); //先判斷是否已存在該頁號,若存在,刪除
if(currentSize<maxSize){
theArray[back]=x;
back++;
currentSize++;
}else if(currentSize==maxSize){ //滿了
for(int i=0;i<maxSize-1;i++){
theArray[i]=theArray[i+1];
}
theArray[maxSize-1]=x;
}
for(int i=0;i<currentSize;i++){
System.out.print(theArray[i]);
}
System.out.println();
}
public void beUsed(int x){ //判斷是否已存在該頁號,若存在,刪除已有的
for(int i=0;i<currentSize;i++){
if(theArray[i]==x){
for(int j=i;j<currentSize-1;j++){
theArray[j]=theArray[j+1];
}
currentSize--;
back--;
}
}
}
public static void main(String[] args) {
LRU lru=new LRU();
int a[]={4,7,0,7,1,0,1,2,1,2,6};
lru.queue(a);
}

}

㈢ 又沒有c語言java語言比較厲害的幫我寫個代碼,不難,會的話估計不到20分鍾就寫完了頁面lru演算法

貼一個我寫的LRU cache演算法,用c++實現的
具體的數據結構用的一個鏈表加一張哈希表。
實現了set和get, 需要另外的功能我還可以再寫。
class LRUCache{
struct cacheEntry{
int key;
int value;
cacheEntry(int c, int v):key(c),value(v){}
};

int _cap;
list<cacheEntry> entryList;
unordered_map<int, list<cacheEntry>::iterator> entryMap;

void moveToHead(list<cacheEntry>::iterator it, int key, int value)
{
entryList.erase(it);
cacheEntry tmp(key, value);
entryList.push_front(tmp);
entryMap[key]=entryList.begin();
}
public:
LRUCache(int capacity) {
_cap=capacity;
}

int get(int key) {
if(entryMap.find(key)==entryMap.end())
return -1;
else{
moveToHead(entryMap[key], key, entryMap[key]->value);
return entryMap[key]->value;
}
}

void set(int key, int value) {
if(entryMap.find(key)==entryMap.end()){
if(entryList.size()>=_cap){
entryMap.erase(entryList.back().key);
entryList.pop_back();
}
cacheEntry tmp(key, value);
entryList.push_front(tmp);
entryMap[key]=entryList.begin();
}
else{
entryMap[key]->value=value;
moveToHead(entryMap[key], key, value);
}
}
};

㈣ 如何用LinkedHashMap實現LRU緩存演算法

緩存這個東西就是為了提高運行速度的,由於緩存是在寸土寸金的內存裡面,不是在硬碟
裡面,所以容量是很有限的。LRU這個演算法就是把最近一次使用時間離現在時間最遠的數據刪除掉。先說說List:每次訪問一個元素後把這個元素放在
List一端,這樣一來最遠使用的元素自然就被放到List的另一端。緩存滿了t的時候就把那最遠使用的元素remove掉。但更實用的是
HashMap。因為List太慢,要刪掉的數據總是位於List底層數組的第一個位置,刪掉之後,後面的數據要向前補位。。所以復雜度是O(n),那就
用鏈表結構的LinkedHashMap唄~,LinkedHashMap默認的元素順序是put的順序,但是如果使用帶參數的構造函數,那麼
LinkedHashMap會根據訪問順序來調整內部 順序。
LinkedHashMap的get()方法除了返回元素之外還可以把被訪問的元素放到鏈表的底端,這樣一來每次頂端的元素就是remove的元素。

構造函數如下:

public LinkedHashMap (int initialCapacity, float loadFactor, boolean accessOrder);

initialCapacity 初始容量

loadFactor 載入因子,一般是 0.75f

accessOrder false 基於插入順序 true 基於訪問順序(get一個元素後,這個元素被加到最後,使用了LRU 最近最少被使用的調度演算法)

來個例子吧:

import java.util.*;

class Test
{
public static void main(String[] args) throws Exception{

Map<Integer,Integer> map=new LinkedHashMap<>(10,0.75f,true);
map.put(9,3);
map.put(7,4);
map.put(5,9);
map.put(3,4);
//現在遍歷的話順序肯定是9,7,5,3
//下面訪問了一下9,3這個鍵值對,輸出順序就變嘍~
map.get(9);
for(Iterator<Map.Entry<Integer,Integer>> it=map.entrySet().iterator();it.hasNext();){
System.out.println(it.next().getKey());
}
}
}

輸出

7
5
3
9

好玩吧~

下面開始實現LRU緩存嘍~

import java.util.*;
//擴展一下LinkedHashMap這個類,讓他實現LRU演算法
class LRULinkedHashMap<K,V> extends LinkedHashMap<K,V>{
//定義緩存的容量
private int capacity;
private static final long serialVersionUID = 1L;
//帶參數的構造器
LRULinkedHashMap(int capacity){
//調用LinkedHashMap的構造器,傳入以下參數
super(16,0.75f,true);
//傳入指定的緩存最大容量
this.capacity=capacity;
}
//實現LRU的關鍵方法,如果map裡面的元素個數大於了緩存最大容量,則刪除鏈表的頂端元素
@Override
public boolean removeEldestEntry(Map.Entry<K, V> eldest){
System.out.println(eldest.getKey() + "=" + eldest.getValue());
return size()>capacity;
}
}
//測試類
class Test{
public static void main(String[] args) throws Exception{

//指定緩存最大容量為4
Map<Integer,Integer> map=new LRULinkedHashMap<>(4);
map.put(9,3);
map.put(7,4);
map.put(5,9);
map.put(3,4);
map.put(6,6);
//總共put了5個元素,超過了指定的緩存最大容量
//遍歷結果
for(Iterator<Map.Entry<Integer,Integer>> it=map.entrySet().iterator();it.hasNext();){
System.out.println(it.next().getKey());
}
}
}

輸出結果如下

9=3
9=3
9=3
9=3
9=3
7
5
3
6

分析一下:使用帶參數構造器,且啟用LRU模式的LinkedHashMap會在每次有新元素加入的時候,判斷當前儲存元素是否超過了緩存上限,也就是執行
一次removeEldestEntry方法,看最後的遍歷結果,發現果然把9刪除了,LRU發揮作用了~

㈤ 去哪兒網java開發面試經驗牛客

以下是某位求職者面經,僅供參考:

一面:

1.自我介紹

2.直接上手紅黑樹和平衡二叉樹區別

3.紅黑樹的旋轉
2node節點插入和3node節點插入時候旋轉的情況 簡述偽代碼
4.問項目情況。大概半小時 5.concurrenthashmap
結構分析。 刪除和獲取操作過程描述。就是segment. Entry.

除了value 為volatile 其餘都是final.
刪除和獲取操作等等。例如:刪除操作是將entry要刪除的節點的前半部分鏈表進行復制,並指向當前刪除節點的後面節點。(因為next是final的,不可以進行修改,只有entry的表頭可以修改)
不詳述了。

6.索引的優缺點 什麼時候索引不起作用? 在什麼地方可以使用索引?

7.jvm
多態原理。invokestatic invokeinterface
等指令。常量池中的符號引用 找到直接引用。在堆中找到實例對象,獲取到偏移量,由偏移量在方法表中指出調用的具體方法。介面是在方法表中進行掃描)等等扯了半天

8.os: 頁面調度演算法 幾種 分別說一下 LRU FIFO 最佳適應演算法

9.內存管理: 固定分區 動態分區 段 頁 都講講 (哈哈)

10.自己實現一下LRU演算法

8.怎麼學習。看過什麼書

二面:

1.自我介紹

2.項目中與app移動端 的json格式設計

3.hashmap的缺點 具體提現在哪裡?

4.Collections.sort()
的原理---本質上調用的是Arrays.sort() 內部是 使用的歸並排序 接著寫了一下歸並(輔助數組的歸並,和手搖演算法的歸並)

5.一個字元串數組,現給定一個string去進行找出對應的數組中字元串的下標 (可以有容錯,但兩字元串長度必須一致,容錯為2)

例如:
["hello","hj","abc"]
key=「hellg" 返回下角標0

6.jvm參數調優 jvm堆的大小調優
MaxTureningShelod newratio -xxs -xxm -persize

7.圖的 prime
演算法
kruskal
演算法
dijkstra演算法 解決什麼問題? 分別寫一下
偽代碼

8.設計模式: 單例模式(懶漢餓漢) 工廠方法模式 觀察者模式 責任鏈模式

9.項目 又問了一些

10.平時怎麼學習?

三面:

1.自我介紹

2.自己優缺點

3.目前有幾個offer

4.工作地點要求

5.在校實驗室做項目,你認為最大的收獲是什麼

6.評價一下自己的大學生活

7.講了一下福利 之類的

現場書面offer沒了,所以只好等等郵寄,不過還好給了一個布偶紀念品

㈥ 如何用java實現fifo頁面置換演算法

[fifo.rar] - 操作系統中內存頁面的先進先出的替換演算法fifo
[先進先出頁面演算法程序.rar] - 分別實現最佳置換演算法(optimal)、先進先出(fifo)頁面置換演算法和最近最久未使用(LRU)置換演算法,並給出各演算法缺頁次數和缺頁率。
[0022.rar] - 模擬分頁式虛擬存儲管理中硬體的地址轉換和缺頁中斷,以及選擇頁面調度演算法處理缺頁中斷
[Change.rar] - 用java實現操作系統的頁面置換 其中包括 最佳置換演算法(Optimal)、先進先出演算法(First-in, First-out) 、最近最久不用的頁面置換演算法(LeastRecently Used Replacement)三種演算法的實現
[M_Management.rar] - 操作系統中內存管理頁面置換演算法的模擬程序,採用的是LRU置換演算法
[detail_of_44b0x_TCPIP.rar] - TCPIP 程序包載入到44b0x 的ADS1.2工程文件的說明書。說名了載入過程的細節和如何處理演示程序和代碼。演示代碼已經上傳,大家可以搜索
[.rar] - java操作系統頁面置換演算法: (1)進先出的演算法(fifo) (2)最近最少使用的演算法(LRU) (3)最佳淘汰演算法(OPT) (4)最少訪問頁面演算法(LFU) (註:由本人改成改進型Clock演算法) (5)最近最不經常使用演算法(NUR)

㈦ Java程序設計

I am sorry; in China; please speak Chinese;謝謝;我之所以寫了句英語只是因為擔心你是外國人;哎;

㈧ redis八種淘汰策略是什麼

redis八種淘汰策略如下:

Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSIC語言編寫、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。

特點:

Redis 是一個高性能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。

Redis支持主從同步。數據可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹復制。存檔可以有意無意的對數據進行寫操作。由於完全實現了發布/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的消息發布記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。

㈨ 請分別給出三種不同的頁面置換演算法,並簡要說明他們的優缺點

[fifo.rar]
-
操作系統中內存頁面的先進先出的替換演算法fifo
[先進先出頁面演算法程序.rar]
-
分別實現最佳置換演算法(optimal)、先進先出(fifo)頁面置換演算法和最近最久未使用(LRU)置換演算法,並給出各演算法缺頁次數和缺頁率。
[0022.rar]
-
模擬分頁式虛擬存儲管理中硬體的地址轉換和缺頁中斷,以及選擇頁面調度演算法處理缺頁中斷
[Change.rar]
-
用java實現操作系統的頁面置換
其中包括
最佳置換演算法(Optimal)、先進先出演算法(First-in,
First-out)
、最近最久不用的頁面置換演算法(LeastRecently
Used
Replacement)三種演算法的實現
[M_Management.rar]
-
操作系統中內存管理頁面置換演算法的模擬程序,採用的是LRU置換演算法
[detail_of_44b0x_TCPIP.rar]
-
TCPIP
程序包載入到44b0x
的ADS1.2工程文件的說明書。說名了載入過程的細節和如何處理演示程序和代碼。演示代碼已經上傳,大家可以搜索
[.rar]
-
java操作系統頁面置換演算法:
(1)進先出的演算法(fifo)
(2)最近最少使用的演算法(LRU)
(3)最佳淘汰演算法(OPT)
(4)最少訪問頁面演算法(LFU)
(註:由本人改成改進型Clock演算法)
(5)最近最不經常使用演算法(NUR)

㈩ java 怎麼充分利用操作系統磁碟io性能

linux內核和各個文件系統採用了幾個優化方案來提升磁碟訪問速度。但這些優化方案需要在我們的伺服器設計中進行配合才能得到充分發揮。
文件系統緩存
linux內核會將大部分空閑內存交給虛擬文件系統,來作為文件緩存,叫做page cache。在內存不足時,這部分內存會採用lru演算法進行淘汰。通過free命令查看內存,顯示為cached的部分就是文件緩存了。

如何針對性優化:
lru並不是一個優秀淘汰演算法,lru最大的優勢是普適性好,在各種使用場景下都能起到一定的效果。如果能找到當前使用場景下,文件被訪問的統計特徵,針 對性的寫一個淘汰演算法,可以大幅提升文件緩存的命中率。對於http正向代理來說,一個好的淘汰演算法可以用1GB內存達到lru演算法100GB內存的緩存 效果。如果不打算寫一個新的淘汰演算法,一般不需要在應用層再搭一個文件cache程序來做緩存。

閱讀全文

與javalru演算法相關的資料

熱點內容
安卓如何查看異常重啟 瀏覽:715
解壓音樂排名 瀏覽:383
安卓手機瀏覽器怎麼掃二維碼 瀏覽:715
通達信成本均線源碼 瀏覽:614
可以下載的解壓音頻 瀏覽:564
海賊王怎麼換伺服器 瀏覽:318
計算機上的共享文件夾映射 瀏覽:940
榮耀安裝包在文件夾哪裡 瀏覽:196
機票php源碼 瀏覽:231
linux共享mac 瀏覽:923
中國沒有國外的伺服器地址 瀏覽:759
為什麼退款伺服器連接錯誤 瀏覽:557
android簡訊存儲位置 瀏覽:972
unix網路編程卷4 瀏覽:808
找靚機app下單什麼時候發貨 瀏覽:413
android一個應用兩個進程 瀏覽:803
linux硬碟復制 瀏覽:808
php圖片伺服器搭建 瀏覽:801
下載壓縮文件怎麼打開 瀏覽:194
新建文件夾叫什麼名字 瀏覽:567