map是一種對映類集合,相比於set既有鍵也有值,以一對鍵值對形式儲存,不能存在相同元素(鍵不能相同),首先和前面的set一樣,定義乙個map介面類,分別用鍊錶和二分搜尋樹來實現,由於結點元素需要儲存的是一對鍵值對,所以不用前面文章的鍊錶和二分搜尋樹,重新定製一下結點資訊和相應的資料結構,下面是實現過程。
1、map介面
public inte***ce map
2、用鍊錶實現map
public class linkedlistmapimplements map
public node(k key, v value)
public node()
@override
public string tostring()
}private node dummyhead; //宣告虛擬頭結點
private int size; //宣告尺寸大小
public linkedlistmap()
//輔助函式 根據鍵獲取到相應結點
private node getnode(k key)
return null; //遍歷整個map集合都沒找到,返回空
}@override
public void add(k key, v value) else
//否則,此鍵存在,則更新其值
node.value = value;
}//刪除元素
@override
public v remove(k key)
if(prev.next != null)
return null;
}@override
public void set(k key, v newvalue)
@override
public v get(k key)
@override
public int getsize()
@override
public boolean isempty()
@override
public boolean contain(k key)
}2、用二分搜尋樹實現map
public class bstmap, v> implements map
}private node root; //宣告根結點
private int size; //宣告尺寸大小
public bstmap()
@override
public int getsize()
@override
public boolean isempty()
//私有輔助函式,根據傳入結點和鍵找到與其相應的結點,採取遞迴思想
private node getnode(node node, k key)
@override
public boolean contain(k key)
@override
public void add(k key, v value)
//真正呼叫的新增元素,根據傳入結點、鍵值對實現新增操作,私有化,遞迴思想
private node add(node node, k key, v value)
//如果鍵比當前結點鍵小則在左子樹遞迴尋找
if (key.compareto(node.key) < 0) else if (key.compareto(node.key) > 0)
//如果該鍵已存在則以傳入的值更新該結點的值
else
return node;
}//找到最小鍵的結點的函式,私有化,遞迴思想,也就是一直找到樹中最左邊結點
private node minimum(node node)
//刪除最小鍵結點函式,遞迴思想
private node removemin(node node)
node.left = removemin(node.left);
return node;
}//根據鍵刪除該結點
@override
public v remove(k key)
return null;
}//刪除結點真正呼叫的函式,遞迴思想
private node remove(node node, k key) else if (key.compareto(node.key) > 0) else
// 待刪除結點右子樹為空的情況
if (node.right == null)
// 待刪除節點左右子樹均不為空的情況
// 找到比待刪除節點大的最小節點, 即待刪除節點右子樹的最小節點
// 用這個節點頂替待刪除節點的位置
node successor = minimum(node.right);
successor.right = removemin(node.right);
successor.left = node.left;
node.left = node.right = null;
return successor;}}
//根據鍵為相應結點設定新值
@override
public void set(k key, v newvalue)
//根據鍵獲取相應的值
@override
public v get(k key)
以上是兩種實現集合的方法,linkedlistmap對於增、查、刪的時間複雜度都是o(n),bstmap對於增、查、刪平均時間複雜度為o(log n)優於linkedlistmap,但對於二分搜尋樹最壞的情況下是退化成煉表所以其時間複雜度最壞情況是o(n).下面是與前面文章set一樣的方式讀取檔案分析詞彙比較消耗時間,下面是整個過程。
首先是檔案操作工具類
public class fileoperation
scanner scanner;
try
else
return false;
}catch(ioexception ioe)
if (scanner.hasnextline()) else
i++;
}return true;
}private static int firstcharacterindex(string s, int start)
}然後是測試程式
public class main
system.out.println("total different words: " + map.getsize());
system.out.println("frequency of pride: " + map.get("pride"));
system.out.println("frequency of prejudice: " + map.get("prejudice"));
}long endtime = system.nanotime();
return (endtime - starttime) / 1000000000.0;
}public static void main(string args)
}下面是測試結果
操作相同的詞彙量的文字,正如預見性的一樣bstmap優於linkedlistmap,但是需要規避二分搜尋樹出現退化為單鏈表情況,所以有了後面的平衡二叉樹等結構,以上整個過程實現了map基本功能
資料結構之Java實現底層Stack
棧是一種先進後出的線性資料結構,先進後出,只能觀察到棧頂元素,利用上篇文章 實現的動態陣列來實現底層棧的資料結構。首先建立了乙個stack介面類如下 public inte ce stack 下面是利用動態陣列實現棧 public class arraystackimplements stack p...
資料結構 佇列底層實現
1 佇列是一種線性結構 2 相比陣列,佇列對應的操作可以看作是陣列的子集 3 只能從一端新增 隊尾 資料,從另一端取出資料 隊首 4 fifo先進先出fist in first out public inte ce queue public class arrayqueue implements q...
STL底層資料結構實現
c stl 的實現 1.vector 底層資料結構為陣列 支援快速隨機訪問 2.list 底層資料結構為雙向鍊錶,支援快速增刪 3.deque 底層資料結構為乙個 控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾 中間不能 快速增刪,也支援隨機訪問 deque是乙個雙端佇列 double...