noip模擬65[第一次在知道難度的情況下做題]
阿新 • • 發佈:2021-10-01
雜湊表
也叫散列表,是根據關鍵碼值而直接進行訪問的資料結構。也就是說它通過把關鍵碼值對映到列表
中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散
列表
陣列+連結串列
陣列+二叉樹
使用雜湊表管理僱員資訊
建立七個連結串列,每一個連結串列指向一堆僱員資訊
建立一個僱員類,一個連結串列類,建立一個HashTable類,裡面有一個連結串列陣列,陣列有七個連結串列
程式碼實現
package hashtab; import java.util.Scanner; public class HashTabDemo { public static void main(String[] args) { //建立一個雜湊表 HashTab hashTab = new HashTab(7); //寫一個簡單的選單來測試 String key=""; Scanner scanner = new Scanner(System.in); while (true) { System.out.println("add:新增僱員"); System.out.println("list:顯示僱員"); System.out.println("exit:退出系統"); System.out.println("find:查詢僱員"); key=scanner.next(); switch (key){ case "add": System.out.println("請輸入使用者的id"); int id = scanner.nextInt(); System.out.println("請輸入僱員的名字"); String name = scanner.next(); Emp emp = new Emp(id, name); hashTab.add(emp); break; case "list": hashTab.list(); break; case "find": System.out.println("請輸入要查詢的id"); id=scanner.nextInt(); hashTab.findEmpById(id); break; case "exit": scanner.close(); System.exit(0); default: break; } } } } //建立HashTable class HashTab { private EmpLinkedList[] empLinkedListArray; private int size;//表示一共有多少條連結串列 //構造器 public HashTab(int size) { empLinkedListArray = new EmpLinkedList[size]; for (int i = 0; i < empLinkedListArray.length; i++) { this.size = size; empLinkedListArray[i] = new EmpLinkedList(); } } //新增僱員 public void add(Emp emp) { //根據員工的id確定該新增哪一條連結串列 int empLinkedListNo = hashFun(emp.id); empLinkedListArray[empLinkedListNo].add(emp); } //根據id查詢僱員 public void findEmpById(int id){ //使用雜湊函式確定在哪一條連結串列中查詢 int empLinkedListNo = hashFun(id); Emp emp = empLinkedListArray[empLinkedListNo].findEmpById(id); if (emp!=null){ //找到 System.out.println("在第"+(empLinkedListNo+1)+"條連結串列找到該僱員"); }else { System.out.println("沒有找到該僱員"); } } //編寫一個雜湊函式,使用一個簡單地取模法 public int hashFun(int id) { return id % size; } //遍歷所有的連結串列 public void list(){ for (int i=0;i<size;i++){ empLinkedListArray[i].list(i); } } } //建立一個僱員類 class Emp { public int id; public String name; public Emp next;//next預設null public Emp(int id, String name) { super(); this.id = id; this.name = name; } } //建立一個EmpLinkedList,表示連結串列 class EmpLinkedList { //頭指標,執行第一個Emp,因此我們這個連結串列的head是直接指向第一個僱員的 private Emp head;//預設為空 //新增僱員到連結串列 //假定新增僱員的時候就是新增在連結串列的最後,id是自增長的,即id的分配總是從小到大 //因此我們將該僱員直接加入到本連結串列的最後即可 public void add(Emp emp) { //如果是新增第一個僱員 if (head == null) { head = emp; return; } //如果不是新增第一個僱員,就使用一個輔助指標,幫助直到最後 Emp curEmp = head; while (true) { if (curEmp.next == null) { break; } curEmp = curEmp.next; } //退出時直接將emp加入連結串列 curEmp.next = emp; } //遍歷連結串列的僱員資訊 public void list(int no) { if (head == null) { //說明連結串列為空 System.out.println("第"+(no+1)+"條連結串列為空"); return; } System.out.print("第"+(no+1)+"條連結串列的資訊為"); Emp curEmp = head; while (true) { System.out.print(" ==> "); System.out.print(curEmp.id + "===" + curEmp.name); if (curEmp.next == null) { break; } curEmp = curEmp.next; } System.out.println(); } //根據id查詢僱員 public Emp findEmpById(int id){ if (head==null){ System.out.println("連結串列為空"); return null; } Emp curEmp=head; while (true){ if (curEmp.id==id){ break; } if (curEmp.next==null){ curEmp=null; break; } curEmp=curEmp.next; } return curEmp; } }