關於MRu演算法的實現研究

2021-05-26 09:19:42 字數 2845 閱讀 3334

class clistnode

;~clistnode()

;void close()

};void setnodedata(void* pdata)

;void setnodenext(clistnode* plistnode)

void setnodebefore(clistnode* plistnode)

void* getnodedata()

clistnode* getnodenext()

clistnode* getnodebefore()

private:

void* m_pdata;

clistnode* m_pnextlistnode;

clistnode* m_pbeforelistnode;};

複製**

這是乙個簡單的雙向列表節點,沒啥好說的。

class clinklist

;~clinklist()

;bool add(clistnode* plistnode, void* pdata)

plistnode->setnodedata(pdata);

if(null == m_pfirstlistnode)

else

return true;

};bool movetop(clistnode* plistnode)

if(null == m_pfirstlistnode)

if(plistnode == m_pfirstlistnode)

clistnode* pbefore = plistnode->getnodebefore();

clistnode* pnext   = plistnode->getnodenext();

if(null == pbefore)

pbefore->setnodenext(pnext);

if(null != pnext)

if(plistnode == m_plastlistnode)

}plistnode->setnodenext(m_pfirstlistnode);

plistnode->setnodebefore(null);

m_pfirstlistnode->setnodebefore(plistnode);

m_pfirstlistnode = plistnode;

return true;

}bool delnode(clistnode* plistnode, bool bldel = true)

clistnode* pbefore = plistnode->getnodebefore();

clistnode* pnext   = plistnode->getnodenext();

if(pbefore != null)

else

if(pnext != null)

else

if(bldel == true)

plistnode->setnodebefore(null);

plistnode->setnodenext(null);

return true;

}clistnode* getfirst()

clistnode* getlast()

void display()}}

clistnode* getlastnode()

clistnode* plistnode = m_plastlistnode;

clistnode* pbefor = m_plastlistnode->getnodebefore();

if(null == pbefor)

else

plistnode->setnodebefore(null);

plistnode->setnodenext(null);

return plistnode;

}void close()}}

private:

clistnode* m_plistnode;

clistnode* m_pfirstlistnode;

clistnode* m_plastlistnode;};

複製**

這是乙個簡單的鍊錶,不同的是我提供了乙個movetop的方法,當我的key被訪問的時候,我會呼叫這個方法把這個資料放在鍊錶的最前面,當然,當指定的容器達到上限的時候,我會從鍊錶尾部刪除節點,並插入新節點。

為了保持通用性,我用模板過載了乙個stl map類,來滿足我的功能這個map完全可以用boost去替換,當然,鍊錶也一樣的。

template

class cmaptemplate

在這裡我遇到了乙個挺煩的難題,那就是我要把我的node和key做一一對應,通過key能找到指定的node,還有就是給定乙個node刪除指定的key,為了減少迴圈,我沒有採用遍歷鍊錶的方法,因為當資料量較大的時候,遍歷時間成本是較大的。map的查詢比較高效,於是就用它了。用空間換時間。

typedef mapmapnode2key;      //定義鍊錶和key的對應關係

typedef mapmapkey2node;      //定義鍊錶和key的對應關係

我的這個類實際有3個map,使用者初始化的時候,必須指定容器的大小。我會根據這個大小,初始化出一批node節點,當使用時候分配給對應的key,這樣的話,當有大量資料需要淘汰的時候,程式不用反覆的new和delete。

測試了一下,在我的筆記本下,10萬條大概是4秒左右(debug),在伺服器上或許能更快,7cat弄出來了乙個0.xx秒,不知道是怎麼做到的,或許和機器相關吧。一樣的**。

把測試**和類貼上來,實際就兩個.h。

mrulist.rar(9.08 kb)

關於A 演算法的研究總結

重要公式 f n g n h n f n g n h n f n g n h n 其中 a 演算法在運算過程中,每次從優先佇列中選取f n 值最小 優先順序最高 的節點作為下乙個待遍歷的節點。另外,a 演算法使用兩個集合來表示待遍歷的節點,與已經遍歷過的節點,這通常稱之為open set和close...

關於遞推演算法的研究

遞迴基礎 程式呼叫自身的程式設計技術稱為遞迴 recursion 遞迴作為一種演算法在程式語言中廣泛應用 乙個過程或函式在其定義或者說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似規模較小的問題來求解 遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複...

訪問緩衝區的LRU與MRU演算法

資料庫 訪問緩衝區的 lru與 mru演算法 1.cachehitandcachemiss 當使用者第一次向資料庫發出查詢資料的請求的時候,資料庫會先在緩衝區中查詢該資料,如果要訪問的資料恰好已經在緩衝區中 我們稱之為cachehit 那麼就直接用緩衝區中讀取該資料.反之如果緩衝區中沒有使用者要查詢...