Laboratory 8 Solutions
Solution to search_compare.cc code:
/*******************************************************************
* Name: Brenda Student
* Date: 3/25/04
* Course: CSCI 262 Section 01
* Assignment: Lab 8
* Instructor: Royden
* Program: search_compare.cc
* Purpose: Program to count the number of comparisons made in
* different search algorithms: Sequential, binary search 1 and binary search 2
***************************************************************************/
enum Error_code { success, fail, range_error, underflow, overflow, fatal,
not_present, duplicate_error, entry_inserted, entry_found,
internal_error };
#include <iostream.h>
#include <stdlib.h>
#include "list.h"
#include "list.cc"
#include "key.h"
#include "key.cc"
typedef Key Record;
void test_search(int, List &);
int Randomize(int);
Error_code sequential_search(const List &,
const Key &, int &);
Error_code recursive_binary_1(const List &, const Key &,
int, int, int &);
Error_code run_recursive_search_1(const List &,
const Key &, int &);
Error_code recursive_binary_2(const List &, const Key &,
int, int, int &);
Error_code run_recursive_search_2(const List &,
const Key &, int &);
int main()
{
int list_size = 20, searches = 100;
int i;
List the_list;
cout << "Enter the size of the list to test: " << endl;
cin >> list_size;
cout << "Timing and testing of search algorithms on a list of size "
<< list_size << endl << endl;
for (i = 0; i < list_size; i++)
if (the_list.insert(i, 2 * i + 1) != success){
cout << " Overflow in filling list." << endl;
}
test_search(searches, the_list);
}
/*Testing program:*/
void print_out(char *comment, int comp_ct, int searches)
{
float average;
cout << comment << " Search Statistics: " << endl;
cout << "Total number of comparisons was " << comp_ct << endl;
average = (( float )comp_ct)/ (( float )searches) ;
cout << " Average number of comparisons per search was " << average
<< endl;
}
void test_search(int searches, List &the_list)
/*
Pre: None.
Post: The number of key comparisons and CPU time for a
sequential searching funtion
have been calculated.
Uses: Methods of the classes List, Random, and Timer,
together with an output function print_out
*/
{
int list_size = the_list.size();
if (searches <= 0 || list_size < 0){
cout << " Exiting test: " << endl
<< " The number of searches must be positive." << endl
<< " The number of list entries must exceed 0." << endl;
return;
}
int i, target, found_at;
cout << "Testing successful comparisons for sequential search: " << endl;
Key::comparisons = 0;
for (i = 0; i < searches; i++){
target = 2 * Randomize(list_size - 1)+ 1;
if (sequential_search(the_list, target, found_at)== not_present)
cout << "Error: Failed to find expected target " << target << endl;
}
print_out("Successful Sequential", Key::comparisons, searches);
cout << endl << "Testing successful comparisons for binary search 1: "
<< endl;
Key::comparisons = 0;
for (i = 0; i < searches; i++){
target = 2 * Randomize(list_size - 1)+ 1;
if (run_recursive_search_1(the_list, target, found_at)== not_present)
cout << "Error: Failed to find expected target " << target << endl;
}
print_out("Successful Binary Search 1", Key::comparisons, searches);
cout << endl << "Testing successful comparisons for binary search 2: "
<< endl;
Key::comparisons = 0;
for (i = 0; i < searches; i++){
target = 2 * Randomize(list_size - 1)+ 1;
if (run_recursive_search_2(the_list, target, found_at)== not_present)
cout << "Error: Failed to find expected target " << target << endl;
}
print_out("Successful Binary Search 2", Key::comparisons, searches);
cout << endl <<"Testing unsuccessful searches for Sequential search: "
<< endl;
Key::comparisons = 0;
for (i = 0; i < searches; i++){
target = 2 * Randomize(list_size);
if (sequential_search(the_list, target, found_at)== success)
cout << "Error: Found unexpected target " << target
<< " at " << found_at << endl;
}
print_out("Unsuccessful", Key::comparisons, searches);
cout << endl<<"Testing unsuccessful searches for Binary search 1: "
<< endl;
Key::comparisons = 0;
for (i = 0; i < searches; i++){
target = 2 * Randomize(list_size);
if (run_recursive_search_1(the_list, target, found_at)== success)
cout << "Error: Found unexpected target " << target
<< " at " << found_at << endl;
}
print_out("Unsuccessful", Key::comparisons, searches);
cout << endl<<"Testing unsuccessful searches for Binary search 2: "
<< endl;
Key::comparisons = 0;
for (i = 0; i < searches; i++){
target = 2 * Randomize(list_size);
if (run_recursive_search_2(the_list, target, found_at)== success)
cout << "Error: Found unexpected target " << target
<< " at " << found_at << endl;
}
print_out("Unsuccessful", Key::comparisons, searches);
}
Error_code sequential_search(const List &the_list,
const Key &target, int &position)
/*
Post: If an entry in the_list has key equal to target, then return
success and the output parameter position locates such an entry
within the list.
Otherwise return not_present and position becomes invalid.
*/
{
int s = the_list.size();
for (position = 0; position < s; position++){
Record data;
the_list.retrieve(position, data);
if ((Key)data == target)return success;
}
return not_present;
}
Error_code run_recursive_search_1(const List &the_list,
const Key &target, int &position)
/*
Post: If an entry in the_list has key equal to target, then return
success and the output parameter position locates such an entry
within the list.
Otherwise return not_present and position becomes invalid.
*/
{
return recursive_binary_1(the_list, target, 0, the_list.size() -1, position);
}
Error_code recursive_binary_1(const List &the_list, const Key &target,
int bottom, int top, int &position)
/* Pre: The indices bottom to top define the range in the list to search for the
target.
Post: If a Record in the range of locations from bottom to top in the_list has
key equal to target, then position locates one such entry and a code of
success is returned. Otherwise, the Error_code of not_present is returned
and position becomes undefined.
Uses: recursive_binary_1 and methods of the classes List and Record. */
{
Record data;
if (bottom < top) { // List has more than one entry.
int mid = (bottom + top)/2;
the_list.retrieve(mid, data);
if (data < target) // Reduce to top half of list.
return recursive_binary_1(the_list, target, mid + 1, top, position);
else // Reduce to bottom half of list.
return recursive_binary_1(the_list, target, bottom, mid, position);
} else if (top < bottom)
return not_present; // List is empty.
else { // List has exactly one entry.
position = bottom;
the_list.retrieve(bottom, data);
if (data == target) return success;
else return not_present;
}
}
Error_code recursive_binary_2(const List &the_list, const Key &target,
int bottom, int top, int &position) {
Record data;
if (bottom <= top) {
int mid = (bottom + top) / 2;
the_list.retrieve(mid, data);
if (data == target) {
position = mid;
return success;
} else if (data < target) {
return recursive_binary_2(the_list, target, mid+1, top, position);
} else {
return recursive_binary_2(the_list, target, bottom, mid-1, position);
}
} else {
return not_present;
}
}
Error_code run_recursive_search_2(const List &the_list,
const Key &target, int &position) {
return recursive_binary_2(the_list, target, 0, the_list.size() -1, position);
}
/**********Randomize*****************************
*Get a random number between 0 and range *
*************************************************/
int Randomize(int range)
{
return ( ( (rand() * range) / 32769 ) );
}
Home | | Syllabus | | Assignments | | Lecture Notes