基於鍊錶的詞典

2021-07-28 20:25:38 字數 3689 閱讀 4188

詞典(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...