詞典(dictionary),也稱對映(map),詞典中每個元素都由兩部分組成:乙個關鍵字,通常稱為查詢鍵(search key);乙個與該鍵值相關聯的值,一般將它們稱之為鍵值對。每乙個查詢鍵在詞典中是唯一的,即不存在兩個相同的查詢鍵,這樣就可以通過查詢建來訪問其對應的值。
基於陣列的詞典,每個元素可以是entry類的乙個例項,即鍵值對封裝在乙個物件中,如下圖
另外一種是不使用entry類,而是定義私有node類,其包含3個資料域key、value、next。
public inte***ce dictionaryinte***ce
插入和刪除操作的效率本應該是o(1),但防止出現重複查詢鍵需要從鍊錶的始端開始順序查詢,因此最快情況下的效率為o(n)。
插入:新增元素時,首先定位該查詢鍵是否存在,若不存在,直接插入到鏈頭,若存在,則替換該位置的值
刪除:刪除元素時,首先定位該查詢鍵是否存在,若不存在,則返回null,若存在,則刪除該位置的元素
public class linked_unsorted_dictionaryimplements dictionaryinte***ce
@override
public v add(k key, v value) else
return result;
} @override
public v remove(k key)
if(currentnode!=null && key.equals(currentnode.getkey()))
return result;
} @override
public v getvalue(k key)
@override
public boolean contains(k key)
@override
public boolean isempty()
@override
public boolean isfull()
@override
public int getsize()
@override
public void clear()
@override
public void display()
system.out.println();
} @override
public iteratorgetkeyiterator()
@override
public iteratorgetvalueiterator()
private class keyiterator implements iterator
@override
public boolean hasnext()
@override
public k next()
} private class valueiterator implements iterator
@override
public boolean hasnext()
@override
public v next()
} private class node
private node(k key,v value,node next)
private k getkey()
private v getvalue()
private void setvalue(v value)
private node getnextnode()
private void setnextnode(node nextnode)
}}
測試**
public class main_unsorted_dictionary
}
public class linked_sorted_dictionary,v> implements dictionaryinte***ce
@override
public v add(k key, v value)
if(currentnode!=null && key.compareto(currentnode.getkey())==0)elseelse
} return result;
} @override
public v remove(k key)
if(currentnode!=null && key.compareto(currentnode.getkey())==0)
return result;
} @override
public v getvalue(k key)
@override
public boolean contains(k key)
@override
public boolean isempty()
@override
public boolean isfull()
@override
public int getsize()
@override
public void clear()
@override
public void display()
system.out.println();
} @override
public iteratorgetkeyiterator()
@override
public iteratorgetvalueiterator()
private class keyiterator implements iterator
@override
public boolean hasnext()
@override
public k next()
} private class valueiterator implements iterator
@override
public boolean hasnext()
@override
public v next()
} private class node
private node(k key,v value,node next)
private k getkey()
private v getvalue()
private void setvalue(v value)
private node getnextnode()
private void setnextnode(node nextnode)
}}
測試**
public class main_sorteddictionary
}
詞典各操作在最壞的情況下的效率如下表: 基於詞典的實體識別
ner 命名實體識別 一般是詞典和模型方式結合,詞典負責已有詞識別,模型負責未知詞識別。在不需發現未知詞的情況下基於詞典的實體識別已足夠 基於字典的ner也有兩種做法 字串多模匹配 和 切詞 詞典加入自定義詞庫 多模匹配有兩種基本演算法 trie樹 和 記錄長度集合的最長匹配 trie樹匹配效率更高...
棧的實現(基於鍊錶)
首先定義乙個介面 基於已寫好的鍊錶實現的棧 public inte ce stack定義乙個棧的類,繼承stack介面 基於鍊錶實現棧 author hcc 鍊錶的開頭是棧底,鍊錶的末尾是棧頂 public class linkedstackimplements stack override pub...
基於鍊錶的模板棧
首先建立乙個結構體模板,即乙個鍊錶節點,作為棧的單元。template class t struct linkedlist 然後新建乙個類,該類有兩個成員,分別為棧頂指標top和棧的大小size,top永遠指向鍊錶的頭部,由於棧只能操作棧頂元素,故新的節點可插入到鍊錶的頭部 該類實現了push po...