CSC 103 Lecture Notes Week 6
Program Design Issues;
Analytic and Empirical Running Time Calculations
* Phase 1: Test the constructor, building tables of sizes 1, 5, 500, and * the default size; confirm the size of each table. * * Phase 2: Test the enter method, lookup, and delete methods on table of * size 1. * * Phase 3: Test enter method by filling up a table of size 5, including * check of the TableFull exception. * * Phase 4: Test the lookup method on the full table of size 5, expecting * O(N) performance on lookups given full table. * * Phase 5: Test the delete method on table of size 5, removing each entry. * * Phase 6: Repeat phases 3 through 5 to exercise the somewhat tricky * implementation of delete that uses active/inactive flags. * * Phase 7: Successively test the enter, lookup, and delete methods on the * the same table of size 5, with 0 through 7 entries. Expect * O(N) performance on lookups since entries are all marked as * inactive instead of being null. * * Phase 8: Rerun phase 7 on a new table of size 5, expecting O(c) * performance on early lookups. * * Phase 9: Test enter and lookup on a larger more sparsely populated * table, expecting O(c) performance.
        public int findLargest(int[] numbers) {
/* 1 */     int largestValue;                       // Largest value so far
/* 2 */     int i;                                  // Array index
/* 3 */     if ((numbers == null) || (numbers.length == 0)) {
/* 4 */         return Integer.MIN_VALUE;
/* 5 */     }
/* 6 */     for (largestValue = numbers[0], i = 1; i < numbers.length; i++) {
/* 7 */         if (largestValue < numbers[i]) {
/* 8 */             largestValue = numbers[i];
                }
            }
/* 9 */     return largestValue;
        }
public HashTable enter(HashTableEntry entry)
        throws HashTableFull, HashIndexInvalid {
    int index;                      // Hash index
    int i;                          // Vacant entry search loop index
    /*
     * Time = time of getKey method + time of hash method.
     */
    index = entry.hash(entry.getKey(), size);
    /*
     * Time = 2 constant compares + constant throw + constant constructor.
     */
    if ((index < 0) || (index >= size)) {
        throw new HashIndexInvalid(index);
    }
    /*
     * Time = two constant array accesses, one compare, two assigns, one
     * return.
     */
    if (table[index] == null) {
        table[index] = lastEntry = entry;
        return this;
    }
    /*
     * Time = constant array access + return + 2 * time of getKey + time of
     * equals.
     */
    if (table[index].getKey().equals(entry.getKey())) {
        return this;
    }
    /*
     * Time = K * time for loop body, where
     *     K is the number of times through the loop
     *     loop body time = times for elements as computed above
     */
    for (i = index + 1; i != index; i++) {
        /*
         * If we've come to the last entry in the table, set the loop index
         * to -1 so the search will continue at the top of the table.
         */
        if (i == size) {
            i = -1;
            continue;
        }
        /*
         * Output some trace information.
         */
        System.out.println("  Probing entry " + i +
            " with entry key " + entry.getKey());
        /*
         * If we've come to an empty table spot, put the entry there.  Save
         * the entry in the lastEntry data field, for use by lookup.
         *
         */
        if (table[i] == null) {
            table[i] = lastEntry = entry;
            return this;
        }
        /*
         * If the entry at the ith spot has the same key as the given
         * entry, we quit without doing anything.
         */
        if (table[i].getKey().equals(entry.getKey())) {
            return this;
        }
    }
    /*
     * If we've come out of the loop, it means we've fully exhausted all
     * table entries, which means the table is full.
     */
    throw new HashTableFull();
}