乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java 哈希表(google 公司的上機(jī)題)

       小樣樣樣樣樣樣 2021-04-24
      1) 看一個實際需求,google 公司的一個上機(jī)題:
      2) 有一個公司,當(dāng)有新的員工來報道時,要求將該員工的信息加入(id,性別,年齡,住址..),當(dāng)輸入該員工的 id 時,要求查
      找到該員工的 所有信息.
      3) 要求: 不使用數(shù)據(jù)庫,盡量節(jié)省內(nèi)存,速度越快越好=>哈希表(散列)
       
      2 哈希表的基本介紹
      散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通
      過把關(guān)鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組
      叫做散列表。

       

      3. google 公司的一個上機(jī)題:
      有一個公司,當(dāng)有新的員工來報道時,要求將該員工的信息加入(id,性別,年齡,名字,住址..),當(dāng)輸入該員工的 id 時,
      要求查找到該員工的 所有信息.
      要求:
        1) 不使用數(shù)據(jù)庫,,速度越快越好=>哈希表(散列)
        2) 添加時,保證按照 id 從低到高插入 
        3) 使用鏈表來實現(xiàn)哈希表, 該鏈表不帶表頭[即: 鏈表的第一個結(jié)點就存放雇員信息]
        4) 思路分析并畫出示意圖
        5) 代碼實現(xiàn)
      public class HashTableDemo {    public static void main(String[] args) {
              
              HashTable hashTable = new HashTable(7);
              
              String key = "";
              Scanner scanner = new Scanner(System.in);        while(true) {
              
                  System.out.println("add:添加雇員");
                  System.out.println("list:查看雇員");
                  System.out.println("find:查找雇員");
                  System.out.println("del:刪除雇員");
                  System.out.println("exit:退出");
                          
                  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);
                      hashTable.add(emp);                break;            case "list":
                      hashTable.list();                break;            case "find":
                      System.out.println("請輸入id:");                int id2 = scanner.nextInt();
                      hashTable.findEmpById(id2);                break;            case "del":
                      System.out.println("請輸入id:");                int id3 = scanner.nextInt();
                      hashTable.del(id3);                break;            case "exit":
                      System.exit(10);            default:                break;
                  }
              }
          }
      }

       

      // empclass Emp{    public int id;    public String name;    public Emp next;    public Emp(int id, String name) {        super();        this.id = id;        this.name = name;
          }
      }

       

      // EmpLinkedListclass EmpLinkedList{    // 頭指針,執(zhí)行第一個Emp,因此我們這個鏈表的head,是直接指向第一個Emp
          private Emp head;    
          // 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;
              }
              curEmp.next = emp;
          }    
          public void list(int no) {        if(head == null) {
                  System.out.println("第" + (no+1) +  "條鏈表為空!");            return;
              }
              System.out.println("第" + (no+1) +  "條鏈表信息為:");
              Emp curEmp = head;        while(true) {
                  System.out.printf("=> id=%d name=%s\t",curEmp.id,curEmp.name);            if(curEmp.next == null) {                break;
                  }
                  curEmp = curEmp.next;
              }
              System.out.println();
          }    
          // 根據(jù)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) {
                      System.out.println("遍歷完了,沒有找到!");
                      curEmp = null;                break;
                  }
                  curEmp = curEmp.next;
              }        return curEmp;
          }    
          // 根據(jù)id進(jìn)行刪除
          public boolean del(int id) {        boolean flag = false;        if(head == null) {
                  System.out.println("當(dāng)前鏈表為空!");            return flag;
              }        if(head.id == id) {
                  head = null;
                  flag = true;            return flag;
              }
              Emp curEmp = head;        while(true) {            // 找到了改雇員
                  if(curEmp.next.id == id) {
                      curEmp.next = curEmp.next.next;
                      curEmp.next = null;                return (flag == false);
                  }            // 沒有找到
                  if(curEmp.next == null) {
                      System.out.println("沒有找改雇員!");
                      curEmp = null;                return flag;
                  }
                  curEmp = curEmp.next;
              }
          }
      }

       

      // 哈希表class HashTable{    
          private EmpLinkedList[] empLinkedListArr;    private int size;    public HashTable(int size) {        super();        this.size = size;
              empLinkedListArr = new EmpLinkedList[size];        
              for(int i = 0; i < size; i++){
                  empLinkedListArr[i] = new EmpLinkedList();
              }
          }    
          // 添加雇員
          public void add(Emp emp) {        // 根據(jù)員工的id得到改員工應(yīng)該添加到哪條鏈表
              int empLinkedListNo = hashFun(emp.id);        // 將emp添加到對應(yīng)的鏈表中        empLinkedListArr[empLinkedListNo].add(emp);
          }    
          public void list() {        for (int i = 0; i < empLinkedListArr.length; i++) {
                  empLinkedListArr[i].list(i);
              }
          }    
          public void findEmpById(int id) {        int empLinkedListNo = hashFun(id);
              Emp emp = empLinkedListArr[empLinkedListNo].findEmpByid(id);        if(emp != null) {
                  System.out.println("在第" + (empLinkedListNo+1) + "條鏈表中找到id = " + id + "雇員");
              } else {
                  System.out.println("在哈希表中沒有找到");
              }
          }    
          public void del(int id) {        int empLinkedListNo = hashFun(id);        boolean flag = empLinkedListArr[empLinkedListNo].del(id);        if(flag == true) {
                  System.out.println("在第" + (empLinkedListNo+1) + "條鏈表中刪除了id = " + id + "雇員");
              } else {
                  System.out.println("在哈希表中沒有找到");
              }
              
          }    
          public int hashFun(int id) {        return id %size;
          }
      }

       

       

       

       

      注意:不要把鏈表的第一個節(jié)點(頭節(jié)點)刪除了,不然整條鏈表沒了。(還可以改良)

      思考:如果 id 不是從低到高插入,但要求各條鏈表仍是從低到高,怎么解決?

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多