A Hash table is a data structure that is directly accessed based on a key value.
That is, it accesses records by mapping key code values to a location in the table to speed up the search.This mapping function is called a hash function, and the array of records is called a hash list.
In the following figure, 16 arrays are defined, each of which holds a list of chains. When inserting data, the first step is to find out which list (array) the element is in by modularizing the number of arrays with its value, and then insert it as a list of chains
We have a computer question from google to learn the Hash table:
There is a company that asks for information about a new employee (id, gender, age, name, address...) When you enter the employee's id, you are asked to find all the information about the employee.
Requirement:
- Without a database, the faster the better=>hash table (hash)
- When adding, make sure to insert from low to high by id [Think: If id is not insert from low to high, but requires each chain list to be low to high, what can I do?]
- A hash table is implemented using a chain table without a header [that is, the first node of the chain table stores employee information]
- Ideas analyze and draw diagrams
- Code implementation [add/delete check (show all employees, query by id)]
code implementation
- Create a single element entity Emp in a chain table
-
Create a linked list entity EmpLinkedList to store the above elements and add, delete, and change checking methods
Here, because the head er was not initialized at the beginning, you need to make a separate decision when deleting it - Create HashTab, write hash function, and implement Hash table add-delete search method
/** * Hash table for data storage * * @author TimePause * @create 2020-02-09 10:53 */ public class HashDemo { /** * Employee class */ class Emp { public int id; public String name; public Emp next;//next defaults to null public Emp(int id, String name) { this.id = id; this.name = name; } } /** * Store employee information in a linked list */ class EmpLinkedList { //Header pointer, executes the first Emp, so the head er of our list points directly to the first Emp //***Default null, but if uninitialized here, null pointer exceptions will occur without initialization when deleting linked list nodes based on id*** //private Emp head=new Emp(0, ");//This initialization is OK, but the first element of each chain table is id=0,name=, which takes up extra space private Emp head=null; // Add Employee Method public void add(Emp emp){ // If you add the first employee if (head==null){ head = emp; return;//Sign out } // If you are not adding the first employee, use a secondary pointer to help you navigate to the end Emp curEmp = head; while (true){ if (curEmp.next==null){//Instructions traversed to the end break;//End the current cycle } //Otherwise move the pointer back curEmp = curEmp.next; } // Add emp at the end of the list curEmp.next = emp; } /** * Delete node elements * @param no */ public void del(int no){ //***If there is only one element in the list, simply emptying it is a deletion*** if (head!=null && head.next==null){ head = null; return; }else{ System.out.println("Chain list is empty,Cannot Delete"); } //If normal. Delete node Emp curEmp = head; // Auxiliary variable flag, indicating whether the element being looked for exists boolean flag = false; while (true){ if (curEmp.next==null){//Indicates that the end of the chain has been reached break; } if (curEmp.next.id==no){ flag = true; break; } curEmp=curEmp.next; } if (flag){ curEmp.next = curEmp.next.next; }else { System.out.println("Node to delete does not exist"); } } //Traversing shows basic information about employees in a list of chains public void list(int no){ if(head == null) { //Explanation chain list is empty System.out.println("No. "+(no+1)+" Chain list is empty"); return; } System.out.print("No. "+(no+1)+" The information in the list is"); Emp curEmp = head; //Auxiliary Pointer while(true) { System.out.printf(" => id=%d name=%s\t", curEmp.id, curEmp.name); if(curEmp.next == null) {//Explains that curEmp is already the last node break;//Exit the current loop } curEmp = curEmp.next; //Move back, traverse } System.out.println(); } // Finds employees based on id, returns Emp if found, and returns null if not found public Emp findEmpById(int id){ // Determine if the list is empty if (head==null){ System.out.println("Chain list is empty"); return null; } // If the list is not empty, look up the list // First create an auxiliary variable Emp curEmp = head; while (true){ if (curEmp.id==id){ break; } //If not found at the end of the list, leave the current element empty and return if (curEmp.next==null){ curEmp = null; break; } curEmp = curEmp.next;//Move back } return curEmp; } } /** * Establish HashTab,Manage Multiple Chain Lists */ class HashTab{ private EmpLinkedList[] empLinkedListArray;//Store multiple chain lists private int size;//Indicates how many chained lists there are //constructor public HashTab(int size){ this.size = size; // Initialize employee list array this.empLinkedListArray = new EmpLinkedList[size]; // Do not forget to initialize each list!!! for (int i = 0; i < size; i++) { empLinkedListArray[i] = new EmpLinkedList();//size initializes several arrays as soon as possible } } // Write hash functions for simple modulo public int hashFun(int id){ return id % size; } //Add Employee public void add(Emp emp){ // Based on employee id, query which chain the employee should add to int empLinkedNo = hashFun(emp.id); // Add emp to the corresponding list of chains empLinkedListArray[empLinkedNo].add(emp); } /** * Delete Employee */ public void del(int no){ int empLinkedNo = hashFun(no); empLinkedListArray[empLinkedNo].del(no); } // Traverse through all linked lists, by traversing HashTab public void list(){ for (int i = 0; i<size;i++) { empLinkedListArray[i].list(i); } } //Find employees based on the input id public void findEmpById(int id) { //Use hash function to determine which list to look for int empLinkedListNO = hashFun(id); // Query the data in that list based on id Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id); if(emp != null) {//find System.out.printf("In%d Employees found in the chain list id = %d\n", (empLinkedListNO + 1), id); }else{ System.out.println("The employee was not found in the hash table~"); } } }
When testing code, write an interface in the main() method to test
public static void main(String[] args) { //Create a hash table HashTab hashTab = new HashTab(7); //Write a simple menu String key = ""; Scanner scanner = new Scanner(System.in); while(true) { System.out.println("add: Add Employee"); System.out.println("list: Show Employees"); System.out.println("find: Find Employees"); System.out.println("del: delete"); System.out.println("exit: Exit System"); key = scanner.next(); switch (key) { case "add": System.out.println("input id"); int id = scanner.nextInt(); System.out.println("Enter a name"); String name = scanner.next(); //Create Employee Emp emp = new Emp(id, name); hashTab.add(emp); break; case "list": hashTab.list(); break; case "find": System.out.println("Please enter what you are looking for id"); id = scanner.nextInt(); hashTab.findEmpById(id); break; case "del": System.out.println("Please enter the one you want to delete id"); id = scanner.nextInt(); hashTab.del(id); break; case "exit": scanner.close(); System.exit(0); default: break; } } } }