宣告:本文為學習資料結構與演算法分析(第三版) clifford a.shaffer 著的學習筆記,**有參考該書的示例**。
碎碎語:其實我一直對這個資料結構不是很了解。
字典 (dictionary) 作為資料庫的乙個簡單介面,提供在資料庫中儲存、查詢和刪除記錄的可能。
字典中有定義關鍵碼 (search key)的概念。而關鍵碼則必須是可比的
字典的adt如下:
template
class dictionary
dictionary& operator= (const dictionary&) {}
public:
dictionary() {}
virtual ~dictionary() {}
virtual
void clear() = 0;
virtual
void insert(const key&, const e&) = 0;
virtual e remove(const key&) = 0;
virtual e removeany() = 0;
virtual e find(const key&) const = 0;
virtual
int length() const = 0;
};
insert 函式和 find 函式是這個類的核心。find 函式接受乙個任意的關鍵碼,從字典中找出這個關鍵碼,並且將相關的記錄返回。如果有多條記錄匹配,則返回任意一條。
removeany 函式提供了使用者隨意選擇一條記錄,並進行操作。
假如實現了乙個工資記錄的字典。payroll 類有很多域,每個域都可以作為搜尋關鍵碼。
下面展示了對payroll 的儲存,乙個是對id進行檢索,乙個對name進行檢索。
class payroll
~payroll() {}
int getid()
string getname()
string getaddr()
};int main()
kvpair(key key, e value):k(key), e(value) {}
kvpair(const kvpair& pair)
kvpair& operator= (const kvpair& pair)
key key() const
e value() const
void setkey(key ink)
void
set(key ink, e ine)
bool
operator>(const kvpair& o) const
bool
operator
< (const kvpair& o) const
slist() {}
~slist() {}
void insert (const e& it)
movetostar();
int left = 0, right = length()-1;
int mid;
auto get = [&](int pos) -> const e&
;auto f = [&]() -> bool
mid = left + (right-left)/2;
const e& temp = get(mid);
if(it1;
return
true;
}else
};while( f() ) ;
llist::insert(it);
}using llist::movetostar;
using llist::prev;
using llist::next;
using llist::length;
using llist::movetopos;
using llist::getvalue;
using llist::currpos;
using llist::clear;
using llist::movetoend;
using llist::remove;
};
其中,涉及到關鍵碼的比較,但是我將整個鍵值對封裝為e的模板了,所以鍵值對中是需要定義實現過載大於、小於號的。
同時,在鍵值對的類中,應該使用指標指向相應的記錄,再將指標與關鍵碼關聯起來
實現有序字典的話,二分查詢幾乎是需要的使用技能了。
在實現的過程中,我先按照自己的想法,實現如下:
/*
因為 find 函式被修飾成 const 了,並不能呼叫類中其他非 const 的
函式,即使類中有slist 成員,也不能呼叫 slist 成員的非const 函式。
這時候就需要用到指標,使用 slist 指標,就可以成功在 find 函式中調
用 slist 的非const成員函式了
*/e find(const key& k) const
if(get(left).key()==k)
return
get(left).value();
else
return nullptr;
}
e find(const key& k) const
return nullptr;
}
簡潔明瞭,同時避免了需要增加判斷字典為空時的狀態
所有實現**均可以在本人github上找到:
xiaosa233
–end–
資料結構 字典
字典是一種以 鍵 值 對形式儲存結構的資料結構,就像 號碼薄裡的名字和 號碼一樣.要找乙個 時,先找名字,名字找到了,緊挨著它的 號碼也就找到了.這裡的 鍵 是指你用來查詢的東西,值 是查詢得到的結果.js的object類就是以字典形式設計的.本章將使用object類本身的特性,實現乙個dictio...
資料結構 字典
字典使用雜湊表作為底層實現,乙個雜湊表裡面可以有多個雜湊表節點,而每個雜湊表節點就儲存了字典中的乙個鍵值對 雜湊表由dict.h dictht結構定義 typedef struct dictht dictht table 是乙個陣列,裡面每個元素都是乙個指向dict.h dictentry結構的指標...
資料結構 字典dict
字典內的元素是由鍵值對組成,每個鍵必須是唯一的。字典具有無序性,故在字典中需要通過鍵來訪問成員。dict1 字典中,鍵是不可變得,與鍵對應的值是可以改變的,可以包含任何其他型別。字典操作 描述dict.copy 複製字典 dict.items 獲取由鍵和值組成的列表list dict.keys 獲取...