The fundamentals of Hash tables?

前端 未结 11 789
灰色年华
灰色年华 2020-12-07 08:23

I\'m quite confused about the basic concepts of a Hash table. If I were to code a hash how would I even begin? What is the difference between a Hash table and just a normal

相关标签:
11条回答
  • 2020-12-07 09:03

    Here is, in short, how a hash table works.

    Imagine you have a library, full of books. If you were to store the books in an array, you would put each book on a spot on a shelf, and then when someone asked you to find a book, you'd look through all the shelves -- pretty slow. If someone said "book #12345", you could find it pretty easily, though.

    Let's say instead you say, if the book title starts with 'A', it goes in row 1. If the second letter is 'B', it goes in row 1, rack 2. If the third letter is 'C', it goes in row 1, rack 2, shelf 3... and so on until you identify the book position. Then, based on the title of the book, you could know exactly where it should be.

    Now, there are some problems in the simplistic "hashing" algorithm I described -- some shelves are going to be way overloaded while others stand empty, some books will be assigned to the same slot.. so the real hash functions are carefully constructed to try to avoid such problems.

    But this is the basic idea.

    0 讨论(0)
  • 2020-12-07 09:03

    Hash table is a data structure that is created for quick look up.

    The hash tables are not effective when the number of entries are very small.

    reference

    Some examples:

        import java.util.Collection;
        import java.util.Enumeration;
        import java.util.Hashtable;
        import java.util.Set;
    
        public class HashtableDemo {
    
        public static void main(String args[]) {
    
    // Creating Hashtable for example
    
         Hashtable companies = new Hashtable();
    
    
    // Java Hashtable example to put object into Hashtable
    // put(key, value) is used to insert object into map
    
         companies.put("Google", "United States");
         companies.put("Nokia", "Finland");
         companies.put("Sony", "Japan");
    
    
    // Java Hashtable example to get Object from Hashtable
    // get(key) method is used to retrieve Objects from Hashtable
    
         companies.get("Google");
    
    
    // Hashtable containsKey Example
    // Use containsKey(Object) method to check if an Object exits as key in
    // hashtable
    
         System.out.println("Does hashtable contains Google as key: "+companies.containsKey("Google"));
    
    
    // Hashtable containsValue Example
    // just like containsKey(), containsValue returns true if hashtable
    // contains specified object as value
    
          System.out.println("Does hashtable contains Japan as value: "+companies.containsValue("Japan"));
    
    
    // Hashtable enumeration Example
    // hashtabl.elements() return enumeration of all hashtable values
    
          Enumeration enumeration = companies.elements();
    
          while (enumeration.hasMoreElements()) {
          System.out.println("hashtable values: "+enumeration.nextElement());
          }
    
    
    // How to check if Hashtable is empty in Java
    // use isEmpty method of hashtable to check emptiness of hashtable in
    // Java
    
           System.out.println("Is companies hashtable empty: "+companies.isEmpty());
    
    
    // How to find size of Hashtable in Java
    // use hashtable.size() method to find size of hashtable in Java
    
          System.out.println("Size of hashtable in Java: " + companies.size());
    
    
    // How to get all values form hashtable in Java
    // you can use keySet() method to get a Set of all the keys of hashtable
    // in Java
    
          Set hashtableKeys = companies.keySet();
    
    
    // you can also get enumeration of all keys by using method keys()
    
          Enumeration hashtableKeysEnum = companies.keys();
    
    
    // How to get all keys from hashtable in Java
    // There are two ways to get all values form hashtalbe first by using
    // Enumeration and second getting values ad Collection
    
          Enumeration hashtableValuesEnum = companies.elements();
    
    
          Collection hashtableValues = companies.values();
    
    
    // Hashtable clear example
    // by using clear() we can reuse an existing hashtable, it clears all
    // mappings.
    
           companies.clear();
          }
         }
    

    Output:

    Does hashtable contains Google as key: true
    
    Does hashtable contains Japan as value: true
    
    hashtable values: Finland
    
    hashtable values: United States
    
    hashtable values: Japan
    
    Is companies hashtable empty: false
    
    Size of hashtable in Java: 3
    
    0 讨论(0)
  • 2020-12-07 09:06

    Something I didn't see specifically noted yet:

    The point of using a hash table over an array is performance.

    Iterating through an array would typically take anywhere from O(1) to O(x) where x is the number of items in the array. However the time to find your item will be extremely variable, expecially if we are talking about hundreds of thousands of items in the array.

    A properly weighted hash table typically has an almost constant access time of just over O(1), no matter how many items are in the hash table.

    0 讨论(0)
  • 2020-12-07 09:09

    You wouldn't want to use a hash table for 100 randomly generated numbers.

    A good way to think about hash tables is to think about value pairs. Let's use students, and say everyone has a student ID number. In your program you store information on students (names, phone numbers, bills, etc). You want to find all of the information about a student using only basic information (name or student ID, for example).

    Let's say you have 10,000 students. If you store them all in an array, then you have to loop through the entire array comparing each entry's student ID with the one you are looking for.

    If, instead, you "hash" (see below) their student ID number to a position in the array, then you only have to search student's who's numbers have the same hash. Much less work to find what you wanted.

    In this example, let's say student IDs are just 6 digit numbers. Our hash function could be use only the bottom 3 digits of the number as the "hash key". Thus 232145 is hashed to array location 145. So then you only need an array of 999 element (each element being a list of students).

    That should be a good start for you. You should, of course, read a text book or wikipedia for this kind of info. But I assume you've already done that and are tired of reading.

    0 讨论(0)
  • 2020-12-07 09:10

    Hashtables are associative. This is a huge difference from arrays, which are just linear data structures. With an array, you might do something like this:

    int[] arr = ...
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i] + 1);
    }
    

    Notice how you are getting an element out of the array by specifying an exact memory offset (i). This contrasts with hashtables, which allow you to store key/value pairs, later retrieving the value based on the key:

    Hashtable<String, Integer> table = new Hashtable<String, Integer>();
    table.put("Daniel", 20);
    table.put("Chris", 18);
    table.put("Joseph", 16);
    

    With the above table, we can make the following call:

    int n = table.get("Chris");
    

    ...and be assured that n will be valued at 18.

    I think this will probably answer most of your questions. The implementation of a hashtable is a fairly interesting topic, one which Wikipedia addresses passably well.

    0 讨论(0)
提交回复
热议问题