Question: /* * CS 301 Homework Assignment 3 verison 1.0 * Instructions: * This class is a simple variation on the BinarySearchST class from section 3.1

/*

* CS 301 Homework Assignment 3 verison 1.0

* Instructions:

* This class is a simple variation on the BinarySearchST class from section 3.1

* Like the BinarySearchST, this class stores a sybmol table in ordered form in two parallel arrays

* many of the basic API functions are provided for you. For example: contains, get.*

* put and delete rely on two functions shiftright, shiftleft that you need to complete . See the

* Misc. Note below

* Your assignment is to complete the ToDo items:some are coding questions, the others require you

* to construct test cases. Search for ToDo. The header comment for each ToDo contain more

* specific instructions for that function

* As provided, the program will run, but the most of the test cases will fail.

* One exception is the rank function tests. These should all pass because a linear-time

* version of the rank function is supplied. One of the ToDos is to replace the linear-time rank

* function with a logarithmic time version (i.e. binary search). Since the rank function is used by other functions in the class,

* if your new version of rank is incorrect, other parts of the program may break.*

* Misc. Note. put *may* increase the size of the symbol table. You will need add code to record this fact

* There are two 'reasonable' places to put such code; one of these places would be the put function

* Likewise, delete will decrease the size of the table and you will need to add code for this as well.

* One place (of the two places) to do this would be in the delete function*

* Your code may have to resize the underlying arrays - a resize function has been provided for you - look through the file!

* You may not modify methods in this file except as indicated. If you are unsure, ask.

* You may add additional methods for modularity

* You may not use other Java data structures (e.g. ArrayList, HashSet, etc)

*/

package CSC301SP18Homework; // change the package if you want

import stdlib.StdOut;

public class SortedArrayST, Value> {

private static final int MIN_SIZE = 2;

private Key[] keys; // the keys array

private Value[] vals; // the values array

private int N = 0; // size of the symbol table,

// may be less than the size of the arrays

/**

* Constructor

*

* Initializes an empty symbol table.

*/

public SortedArrayST() {

this(MIN_SIZE);

}

/**

* Constructor

*

* Initializes an empty symbol table of given size.

*/

@SuppressWarnings("unchecked")

public SortedArrayST(int size) {

keys = (Key[])(new Comparable[size]);

vals = (Value[])(new Object[size]);

}

/**

* Constructor

*

* Initializes a symbol table with given sorted key-value pairs.

* If given keys list is not sorted in (strictly) increasing order,

* then the input is discarded and an empty symbol table is initialized.

*/

public SortedArrayST(Key[] keys, Value[] vals) {

this(keys.length < MIN_SIZE ? MIN_SIZE : keys.length);

N = (keys.length == vals.length ? keys.length : 0);

int i;

for (i = 1; i < N && keys[i].compareTo(keys[i - 1]) > 0; i++);

if (i < N) { // input is not sorted

System.err.println("SortedArrayST(Key[], Value[]) constructor error:");

System.err.println("Given keys array of size " + N + " was not sorted!");

System.err.println("Initializing an empty symbol table!");

N = 0;

} else {

for (i = 0; i < N; i++) {

this.keys[i] = keys[i];

this.vals[i] = vals[i];

}

}

}

/**

* keysArray

*

* Returns the keys array of this symbol table.

*/

public Comparable[] keysArray() {

return keys;

}

/**

* valsArray

*

* Returns the values array of this symbol table.

*/

public Object[] valsArray() {

return vals;

}

/**

* size

*

* Returns the number of keys in this symbol table.

*/

public int size() {

return N;

}

/**

* checkFor

*

* Returns whether the given key is contained in this symbol table at index r.

*/

private boolean checkFor(Key key, int r) {

return (r >= 0 && r < N && key.equals(keys[r]));

}

/**

* get

*

* Returns the value associated with the given key in this symbol table.

*/

public Value get(Key key) {

int r = rank(key);

if (checkFor(key, r)) return vals[r];

else return null;

}

/**

* put

*

* Inserts the specified key-value pair into the symbol table, overwriting the old

* value with the new value if the symbol table already contains the specified key.

* Deletes the specified key (and its associated value) from this symbol table

* if the specified value is null.

*/

public void put(Key key, Value val) {

int r = rank(key);

if (!checkFor(key, r)) {

shiftRight(r); // make space for new key/value pair

keys[r] = key; // put the new key in the table

}

vals[r] = val; // ?

}

/**

* delete

*

* Removes the specified key and its associated value from this symbol table

* (if the key is in this symbol table).

*/

public void delete(Key key) {

int r = rank(key);

if (checkFor(key, r)) {

shiftLeft(r); // remove the specified key/value

}

}

/**

* contains

*

* return true if key is in the table

*/

public boolean contains(Key key) {

return ( this.get(key)!= null);

}

/**

* resize

*

* resize the underlying arrays to the specified size

* copy old contents to newly allocated storage

*/

@SuppressWarnings("unchecked")

private void resize(int capacity) {

if (capacity <= N) throw new IllegalArgumentException ();

Key[] tempk = (Key[]) new Comparable[capacity];

Value[] tempv = (Value[]) new Object[capacity];

for (int i = 0; i < N; i++) {

tempk[i] = keys[i];

tempv[i] = vals[i];

}

vals = tempv;

keys = tempk;

}

/**

* shiftRight

*

* preconditons ?

*

* Shifts the keys (and values) at indices r and larger to the right by one

* The key and value at position r do not change.

* This function must call the resize method (if needed) to increase the size of the

* underlying keys,vals arrays

*

*/

private void shiftRight(int r) {

return; // ToDo1: fix this

}

/**

* shiftLeft

*

* preconditions:

* r >=0

* N > 0

* postcondition:

* the keys (and values) at indices x > r shifted to the left by one

* in effect, removing the key and value at index r

* 'clear' the original 'last' elements by setting them to null

* this function does NOT need to decrease the size of the underlying arrays

*/

private void shiftLeft(int r) {

// TODO2: fix this

}

/**

* rank returns the number of keys in this symbol table that is less than the given key.

*/

public int rank(Key key) {

return linearTimeRank(key);

// ToDo3 : replace the above call to linearTimeRank with

// a logarithmic time implementation

}

/**

* Linear time implementation of rank

*/

private int linearTimeRank(Key key) {

int r;

for (r = 0; r < N && key.compareTo(keys[r]) > 0; r++);

return r;

}

/**

* floor

*

* floor returns the largest key in the symbol table that is less than or equal to key.

* it returns null if there is no such key.

* must be logarithmic time for full credit. Hint : rank

*/

public Key floor(Key key) {

return null; // ToDo4: fix this

}

/**

* countRange

*

* countRange returns the number of keys in the table within the range [key1, key2] (inclusive)

* note that keys may not be in order (key1 may be larger than key2)

* must run in logarithmic time for full credit. hint: rank

*/

public int countRange(Key key1, Key key2) {

;

return -1; // ToDo5: fix this

}

/**

* Driver program

*

* run all the tests

*/

public static void main(String[] args) {

// Testing the rank function

// Inputs: String of keys, String of values, Key to search on, expected answer

testRank("BDFK","1234", "A",0);

testRank("BDFK","1234","B",0);

testRank("BDFK","1234","C",1);

testRank("BDFK","1234","D",1);

testRank("BDFK","1234","K",3);

testRank("BDFK","1234","Z",4);

StdOut.println();

// Testing the delete function (actually testing your shiftLeft implementation)

// Inputs: String of keys, String of values, key to delete, expected keys & values

testDelete("ABDFK","12345", "A","BDFK","2345"); // delete first

testDelete("ABDFK","12345", "B","ADFK","1345"); // delete from 'middle'

testDelete("ABDFK","12345", "K","ABDF","1234"); // delete last

// ToDo 6.1, 6.2 add two additional test cases for delete

// include comments to describe what your case is checking for

// try to think of an 'extreme' case

StdOut.println();

// Testing the put function (actually testing your shiftRight implementation)

// Inputs: String of keys, String of values, key,value to insert, expected keys & values

testPut("AEIOU","13456", "B","2", "ABEIOU","123456");

// ToDo 6.3 , 6.4 add two additional test cases for put

// include comments to describe what your case is checking for

// try to think of an 'extreme' case

StdOut.println();

// Testing the floor function

// Inputs:String of keys, String of values, key to test, expected answer

testFloor("AEIOU","13456", "B","A");

testFloor("AEIOU","13456", "E","E");

testFloor("AEIOU","13456", "Z","U");

testFloor("VWXYZ","13456", "A",null);

StdOut.println();

// Testing the countRange function

// Inputs: String of keys, String of values, range: [key1,key2] expected answer

testCountRange("BEIOU","13456", "B","U", 5); // whole Range

testCountRange("BEIOU","13456", "U","B", 5); // whole Range

testCountRange("BEIOU","13456", "A","Z",5); // whole Range

testCountRange("BEIOU","13456", "C","P",3); // partial Range

}

/* testing suite

*

* nothing for you to change below

*

* */

/*

* from

*

* a Utility function used by the testing framework to

* build and return a symbol table from a pair of strings.

* The individual characters of each string are extracted as substrings of length 1

* and then stored in parallel arrays.

* The parallel arrays are used as input to the SortArrayST constructor

* The characters in the keyData need to be in sorted order.

*

*/

public static SortedArrayST from (String keyData, String valData) {

int n = keyData.length();

if ( n != valData.length()) throw new NullPointerException(" from: mismatch sizes");

String[] keys = new String[n];

String[] vals = new String[n];

for (int i=0; i < n; i++ ) {

keys[i] = keyData.substring(i, i+1); // ith key is ith char-string of keyData string

vals[i] = valData.substring(i, i+1); // ith key is ith char-string of valData string

}

return new SortedArrayST(keys,vals);

}

/*

* testRank

*

* Test the rank function.

* build a symbol table from the input key,val strings

* (keyData characters must be in sorted order)

* then call the rank function, compare to the expected answer

*/

public static void testRank( String keyData, String valData, String theKey, int expected) {

SortedArrayST x = from(keyData,valData);

int actual = x.rank(theKey);

if ( actual == expected) // test passes

StdOut.format("rankTest: Correct Keys: %s, searchKey %s actual: %d expected: %d ", keyData, theKey, actual,expected);

else

StdOut.format("rankTest: *Error* Keys: %s, searchKey %s actual: %d expected: %d ", keyData, theKey, actual,expected);

}

/*

* testPut

*

* Test the Put function.

* build a symbol table from the input key,val strings

* (keyData characters must be in sorted order)

* then call the put function, compare to the expected answer

*/

public static void testPut(String keyInData, String valInData,

String putKey, String putVal,

String keyOutData, String valOutData) {

SortedArrayST actual = from(keyInData,valInData);

SortedArrayST expected = from(keyOutData, valOutData);

actual.put(putKey, putVal);

String actualKeys = actual.keysString();

String actualVals = actual.valsString();

String expectedKeys = expected.keysString();

String expectedVals = expected.valsString();

if ( actualKeys.equals(expectedKeys) && actualVals.equals(expectedVals) ) // test passes

StdOut.format("testPut: Correct actual keys %s expected keys %s ", actualKeys,expectedKeys);

else {

StdOut.format("testput: *Error* actual keys %s expected keys %s ", actualKeys,expectedKeys);

StdOut.format(" actual vals %s expected keys %s ", actualVals,expectedVals);

}

}

/*

* testDelete

*

* Test the delete function.

* build a symbol table from the input key,val strings

* (keyData characters must be in sorted order)

* then call the delete function, compare to the expected answer

*/

public static void testDelete(String keyInData, String valInData, String delKey,

String keyOutData, String valOutData) {

SortedArrayST actual = from(keyInData,valInData);

SortedArrayST expected = from(keyOutData, valOutData);

actual.delete(delKey);

String actualKeys = actual.keysString();

String actualVals = actual.valsString();

String expectedKeys = expected.keysString();

String expectedVals = expected.valsString();

if ( actualKeys.equals(expectedKeys) && actualVals.equals(expectedVals) ) // test passes

StdOut.format("testDelete: Correct actual keys %s expected keys %s ", actualKeys,expectedKeys);

else {

StdOut.format("testDelete: *Error* actual keys %s expected keys %s ", actualKeys,expectedKeys);

StdOut.format(" actual vals %s expected vals %s ", actualVals,expectedVals);

}

}

/*

* testFloor

*

* Test the floor function.

* build a symbol table from the input key,val strings

* (keyData characters must be in sorted order)

* then call the floor function, compare to the expected answer

*

*/

public static void testFloor( String keyData, String valData, String theKey, String expected) {

SortedArrayST x = from(keyData,valData);

String actual = x.floor(theKey);

//report result

if ( expected == null) {

if (actual == null)

StdOut.format("floorTest: Correct String %s Answer: null ", keyData);

else

StdOut.format("floorTest: *Error* String %s Expected: null Actual: %s ", keyData,actual);

return;

}

if (actual == null && expected != null ) { // error

StdOut.format("floorTest: *Error* String %s Expected: %s Actual: null ", keyData,expected);

return;

}

if ( actual.equals(expected)) // test passes

StdOut.format("floorTest: Correct String %s Actual: %s ", keyData,actual);

else

StdOut.format("floorTest: *Error* String %s Expected %s Actual: %s ", keyData,expected,actual);

}

/*

* testCountRange

*

* Test the countRange function.

* build a symbol table from the input key,val strings

* (keyData characters must be in sorted order)

* then call the countRange function, compare to the expected answer

* testCountRange("BEIOU","13456", "B","U", 5); // whole Range

*/

public static void testCountRange( String keyData, String valData, String key1,String key2, int expected) {

SortedArrayST x = from(keyData,valData);

int actual = x.countRange(key1,key2);

if ( actual == expected) // test passes

StdOut.format("countRangeTest: Correct Keys: %s, key1: %s key2: %s actual: %d expected: %d ", keyData, key1,key2, actual,expected);

else

StdOut.format("countRangeTest: *Error* Keys: %s, key1: %s key2: %s actual: %d expected: %d ", keyData, key1,key2, actual,expected);

}

/* keysString

*

* returns the keys of the table as a single String

* used by the testing suite

*/

public String keysString(){

StringBuilder S = new StringBuilder();

S.append('[');

for (int i=0; i < N; i++)

S.append(keys[i]);

S.append(']');

return S.toString();

}

/* valsString

*

* returns the values of the table as a single String

* used by the testing suite

*/

public String valsString(){

StringBuilder S = new StringBuilder();

S.append('[');

for (int i=0; i < N; i++)

S.append(vals[i]);

S.append(']');

return S.toString();

}

}

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!