zoukankan      html  css  js  c++  java
  • CS 61B homework6

    。。一直出现nullpointexception 查了半天。。竟然是忘了initialize。。

          buckets = new DList[capacity];  //buckets
    //      for(int i=0;i<capacity;i++)
    //          buckets[i]=new DList();

    但是,当我加上注释内容还是出现了exception。。继续查

    发现我的makeEmpty是这么写的。。。。。可能最开始理解错了,后来又忘记改了。。

      public void makeEmpty() {
        // Your solution here.
          for(int i=capacity-1;i>=0;i--){
              buckets[i]=null;
          }
          n_Entries=0;
    
      }
      

    应该这么写

      public void makeEmpty() {
        // Your solution here.
          for(int i=capacity-1;i>=0;i--){
              buckets[i]=new DList();
          }
          n_Entries=0;
    
      }

    关于数据结构,最开始其实想的是,

        ListNode[] buckets;

    然后每次insert的时候再new DList(), 并让buckets[x]=newDList.front(); 完成part one 还是没有问题的,但是到后面需要返回每个DLIst的size,就buckets[x].myList.size..但是发现myList是protected的。。无法在其他package使用。。所以还是

        List[] buckets;

    compression function 用的

         int hashcode = code % capacity;

    完整代码:

      public boolean equals(Object board) {
        // Replace the following line with your solution.  Be sure to return false
        //   (rather than throwing a ClassCastException) if "board" is not
        //   a SimpleBoard.
          for(int i=0;i<DIMENSION;i++)
              for(int j=0;j<DIMENSION;j++){
                   if(((SimpleBoard)board).grid[i][j]!=this.grid[i][j]){
                   return false;}
              }
        return true;
      }
    
      /**
       *  Returns a hash code for this SimpleBoard.
       *  @return a number between Integer.MIN_VALUE and Integer.MAX_VALUE.
       */
    
      public int hashCode() {
        // Replace the following line with your solution.
          int cellToInt =0;
          for(int i=0;i<DIMENSION;i++)
              for(int j=0;j<DIMENSION;j++){
                  cellToInt=(int)(cellToInt+this.grid[i][j]*3^(i*(8)+j));
              }
        return cellToInt;
      }
    /* HashTableChained.java */
    
    package dict;
    
    import list.*;
    /**
     *  HashTableChained implements a Dictionary as a hash table with chaining.
     *  All objects used as keys must have a valid hashCode() method, which is
     *  used to determine which bucket of the hash table an entry is stored in.
     *  Each object's hashCode() is presumed to return an int between
     *  Integer.MIN_VALUE and Integer.MAX_VALUE.  The HashTableChained class
     *  implements only the compression function, which maps the hash code to
     *  a bucket in the table's range.
     *
     *  DO NOT CHANGE ANY PROTOTYPES IN THIS FILE.
     **/
    
    public class HashTableChained implements Dictionary {
    
      /**
       *  Place any data fields here.
       **/
        protected int n_Entries=0;
        protected int capacity;  //number of buckets
        List[] buckets;
    
    
    
      /** 
       *  Construct a new empty hash table intended to hold roughly sizeEstimate
       *  entries.  (The precise number of buckets is up to you, but we recommend
       *  you use a prime number, and shoot for a load factor between 0.5 and 1.)
       **/
    
       public boolean isPrime(int n){
           if(n < 2) return false;
           if(n == 2) return true;
           if(n%2==0) return false;
           for(int i = 3; i*i <= n; i += 2)
               if(n%i == 0) return false;
           return true;
           }
      
      public HashTableChained(int sizeEstimate) {
        // Your solution here.
          while(!isPrime(sizeEstimate)){
              sizeEstimate++;
          }
          capacity = sizeEstimate;
          buckets = new List[capacity];  //buckets
          for(int i=0;i<capacity;i++)
              buckets[i]=new DList();
      }
    
      /** 
       *  Construct a new empty hash table with a default size.  Say, a prime in
       *  the neighborhood of 100.
       **/
    
      public HashTableChained() {
        // Your solution here.
          this(100);
      }
    
      /**
       *  Converts a hash code in the range Integer.MIN_VALUE...Integer.MAX_VALUE
       *  to a value in the range 0...(size of hash table) - 1.
       *
       *  This function should have package protection (so we can test it), and
       *  should be used by insert, find, and remove.
       **/
    
      int compFunction(int code) {
        // Replace the following line with your solution.
         int hashcode = code % capacity;
         if(hashcode<0){
             hashcode=hashcode+capacity;
         }
        return hashcode;
      }
    
      /** 
       *  Returns the number of entries stored in the dictionary.  Entries with
       *  the same key (or even the same key and value) each still count as
       *  a separate entry.
       *  @return number of entries in the dictionary.
       **/
    
      public int size() {
        // Replace the following line with your solution.
        return n_Entries;
      }
    
      /** 
       *  Tests if the dictionary is empty.
       *
       *  @return true if the dictionary has no entries; false otherwise.
       **/
    
      public boolean isEmpty() {
        // Replace the following line with your solution.
          if(n_Entries==0)
              return true;
          else return false;
      }
    
      /**
       *  Create a new Entry object referencing the input key and associated value,
       *  and insert the entry into the dictionary.  Return a reference to the new
       *  entry.  Multiple entries with the same key (or even the same key and
       *  value) can coexist in the dictionary.
       *
       *  This method should run in O(1) time if the number of collisions is small.
       *
       *  @param key the key by which the entry can be retrieved.
       *  @param value an arbitrary object.
       *  @return an entry containing the key and value.
       **/
    
      public Entry insert(Object key, Object value) {
        // Replace the following line with your solution.
          Entry entry = new Entry();
          entry.key=key;
          entry.value=value;
          int hashcode = compFunction(key.hashCode());      
          buckets[hashcode].insertBack(entry);
          n_Entries++;
        return entry;
      }
    
      /** 
       *  Search for an entry with the specified key.  If such an entry is found,
       *  return it; otherwise return null.  If several entries have the specified
       *  key, choose one arbitrarily and return it.
       *
       *  This method should run in O(1) time if the number of collisions is small.
       *
       *  @param key the search key.
       *  @return an entry containing the key and an associated value, or null if
       *          no entry contains the specified key.
       **/
    
      public Entry find(Object key) {
        // Replace the following line with your solution.
          int hashcode = compFunction(key.hashCode());
          try{
          if(!buckets[hashcode].isEmpty()){
              Entry entry = (Entry)(buckets[hashcode].front().item());
              return entry;
              }
          }catch(InvalidNodeException e){System.err.println ("Caught InvalidNodeException that should not happen."
                  );}
        return null;
      }
    
      /** 
       *  Remove an entry with the specified key.  If such an entry is found,
       *  remove it from the table and return it; otherwise return null.
       *  If several entries have the specified key, choose one arbitrarily, then
       *  remove and return it.
       *
       *  This method should run in O(1) time if the number of collisions is small.
       *
       *  @param key the search key.
       *  @return an entry containing the key and an associated value, or null if
       *          no entry contains the specified key.
       */
    
      public Entry remove(Object key) {
        // Replace the following line with your solution.
          int hashcode = compFunction(key.hashCode());
          try{
          if(!buckets[hashcode].isEmpty()){      
              Entry entry = (Entry)buckets[hashcode].front().item();
              buckets[hashcode].front().remove();
              n_Entries--;
              return entry;
              }
          }catch(InvalidNodeException e){System.err.println ("Caught InvalidNodeException that should not happen."
                  );}
        return null;
      }
    
      /**
       *  Remove all entries from the dictionary.
       */
      public void makeEmpty() {
        // Your solution here.
          for(int i=capacity-1;i>=0;i--){
              buckets[i]=new DList();
          }
    //      buckets = new DList[capacity];
          n_Entries=0;
    
      }
      
      public void histograph(){
          //print the table
          int SumOfCollisions = 0;
          for(int i=0;i<this.capacity;i++){
              if(this.buckets[i].length()!=0){
              SumOfCollisions=SumOfCollisions+this.buckets[i].length()-1;
              System.out.print("["+this.buckets[i].length()+"]");}
              else System.out.print("[0]"); 
              if(i%10==0){System.out.println();}
          }      
          System.out.println("expected number of collisions:"+(double)(n_Entries-capacity+(double)capacity*Math.pow((1-1.0/capacity), n_Entries)));
          System.out.println("actual number of collisions:"+SumOfCollisions);
      }
    
    }
    HashTableChained

  • 相关阅读:
    变量在函数内外的作用域 3
    php中用大括号把?>和<?php框起来的作用
    变量在函数内外的作用域 2
    变量在函数内外的作用域
    字母大小写对变量和函数的区别
    require()和include()代码重用
    str_place()替换函数
    【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善
    android SQLite使用SQLiteOpenHelper类对数据库进行操作
    tomcat设置IP地址或者域名访问
  • 原文地址:https://www.cnblogs.com/developerchen/p/7262255.html
Copyright © 2011-2022 走看看