Sie sind auf Seite 1von 7

MUHAMMAD

NAUMAN ALI
02018
DAA ASSIGNMENT NO 1

CODE

//headers
#include <iostream>
#include <vector>
#include "time.h"
using namespace std;

/* Muhammad Nauman Ali 02018*/

//Function to populate two arrays with identical unique random numbers


void populateArray(int *input,int *input1, int size)
{
//seeding time
srand(time(NULL));
int flag,i=0;
int *tempArray = new int[size];
//loop continues till the whole array is filled
for (;;)
{
flag = 0;
//generating a number within a certain negative to positive range
equal to size
int value = (int)(rand() % size*2 - size);
//loop checks if the number already has been added
for (int j = 0; j < i; j++)
{
if (value == tempArray[j])
{
flag = 1;
break;
}
}
//if number hasn't been added
if (flag == 0)
{
tempArray[i++] = value;
}
//breaks loop if the whole array is filled
if (i == size)
break;
}
//copies the temporary array to arrays
for (int i = 0; i < size; i++)
{
input1[i]= input[i] = tempArray[i];
}
}
//function checks for duplicates
bool containsDuplicates(int *input,int size)

{
//returns true if there are duplicates
for (int i = 1; i < size;i++)
if (input[i] == input[i - 1])
return true;
return false;
}
//Partition function for quickSort
int partition(int *input, int start, int end)
{
int temp;
int x = input[end];
int i = start - 1;
for (int j = start; j < end; j++)
{
if (input[j] < x)
{
temp = input[++i];
input[i] = input[j];
input[j] = temp;
}
}
temp = input[i + 1];
input[i + 1] = input[end];
input[end] = temp;
return i + 1;
}
//Recursive function for quickSort
void quickSort(int *input, int start,int end)
{
if (start < end)
{
int pivot = partition(input, start, end);
quickSort(input, start, pivot - 1);
quickSort(input, pivot + 1, end);
}
}
//binarySearch function returns the index of the value
int binarySearch(int *input, int end, int value)
{
int lower, middle, upper;
lower = 0;
upper = end;

while (upper >= lower)


{
middle = (upper + lower) / 2 ;
if (input[middle] == value)
return middle;
else if (input[middle] < value)
lower = middle + 1;
else
upper = middle - 1;
}
//in case the value isn't found, returns -1
return -1;
}
//fastThreeSum implementation
vector<int> fastThreeSum(int *input, int size,int *count)
{
//vector array to store the results
vector<int> result;
//sorts the array
quickSort(input, 0, size - 1);
for (int i = 0; i < size; i++)
{
for (int j = i+1; j < size; j++)
{
int k = binarySearch(input, size-1, -(input[i] + input[j]));
if (k>j)
{
//saving the results
result.push_back(input[i]);
result.push_back(input[j]);
result.push_back(input[k]);
//incrementing the count
(*count)++;
}
}
}
//returns result in vector array form
return result;
}
//ThreeSum implementation using Loops
vector<int> threeSum(int *input, int size,int *count)
{
vector<int> result;
for (int i = 0; i < size; i++)
{

for (int j = i+1; j < size; j++)


{
for (int k = j+1; k < size; k++)
{
if (input[i] + input[j] + input[k] == 0)
{
result.push_back(input[i]);
result.push_back(input[j]);
result.push_back(input[k]);
(*count)++;
}
}
}
}
return result;
};
int main()
{
//Sizes of the list
int list[3] = { 1000, 4000, 8000 };
for (int i = 0; i < 3; i++)
{
//declarations
int size = list[i];
vector<int> result, result1;
int TScount = 0, FTScount = 0;
int *input = new int[size], *input1 = new int[size];
//populating Array with unique numbers
populateArray(input, input1, size);
//check for duplicates in Array
if (containsDuplicates(input, size))
{
cout << "The array contains Duplicates";
return -1;
}
//THREE SUM
cout << "**THREE SUM**" << endl;
clock_t tsStart = clock();
result1 = threeSum(input, size, &TScount);
clock_t tsStop = clock();
cout << "The count of triples is " << TScount << "
taken was " << (float)((tsStop - tsStart)) << " ms." << endl;
//FAST THREE SUM
cout << "**FAST THREE SUM**" << endl;
clock_t ftsStart = clock();
result = fastThreeSum(input1, size, &FTScount);
clock_t ftsStop = clock();

The time

cout <<"The count of triples is "<< FTScount << "


taken was " << (float)((ftsStop - ftsStart)) <<" ms." << endl;

The time

/* To print results
for(vector<int>::size_type i=0; i <FTSresult.size();i++)
{
if(i%3 == 0 && i!=0)
cout<<result[i]<<endl;
else
cout<<result[i]<<" , ";
}
*/
}
return 0;
}

3-sum
Fast 3-sum

Running times for input data in seconds


1k
4k
8k
1.96
89.998
613.244
0.758
10.136
41.886

THE TABLE

THE GRAPH

Das könnte Ihnen auch gefallen