Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <chrono>
- #define TIMING
- #ifdef TIMING
- #define TIMER_ALGORITHM(iterations, size) TimeAlgorithm(iterations, size);
- #define INIT_TIMER auto start = std::chrono::high_resolution_clock::now();
- #define START_TIMER start = std::chrono::high_resolution_clock::now();
- #define STOP_TIMER(name) std::cout << "RUNTIME of " << name << ": " << \
- std::chrono::duration_cast<std::chrono::nanoseconds>( \
- std::chrono::high_resolution_clock::now()-start \
- ).count() << " ns " << std::endl;
- #else
- #define INIT_TIMER
- #define START_TIMER
- #define STOP_TIMER(name)
- #endif
- #define INT_MAX std::numeric_limits<int>::max()
- using namespace std;
- int MinDistance2(int A[], size_t n) {
- // Input: Array A[0..n-1] of numbers
- // Output: Minimum distance between two of its elements
- int dmin = INT_MAX;
- int temp;
- for (int i = 0; i <= n - 2; i++) {
- for (int j = i+1; j <= n - 1; j++) {
- temp = abs(A[i] - A[j]);
- if (temp < dmin) {
- dmin = temp;
- }
- }
- }
- return dmin;
- }
- void TimeAlgorithm(int iterations, size_t size) {
- INIT_TIMER
- int testArray [iterations][size];
- // generate many random arrays to get an average of execution times
- for (int i = 0; i < iterations; i++) {
- for (int j = 0; j < size; j++) {
- testArray[i][j] = rand() + 1;
- }
- }
- cout << '-' << size << "- ";
- START_TIMER
- for (int t = 0; t < iterations; t++) {
- MinDistance2(testArray[t], size);
- }
- STOP_TIMER("algorithm")
- }
- int CountBasicOperations(int iterations, int A[], size_t n) {
- // Returns the median value in a given array of n numbers
- // This is the kth element, where k = | n/2 | if the array was sorted
- long int count = 0; // counter for number of basic operations
- // cout << '-' << n << "- ";
- for (int o = 0; o < iterations; o++) {
- for (int i = 0; i < n; i++) {
- A[i] = rand() + 1;
- }
- // Input: Array A[0..n-1] of numbers
- // Output: Minimum distance between two of its elements
- int dmin = INT_MAX;
- int temp;
- for (int i = 0; i <= n - 2; i++) {
- for (int j = i+1; j <= n - 1; j++) {
- count++;
- temp = abs(A[i] - A[j]);
- if (temp < dmin) {
- dmin = temp;
- }
- }
- }
- }
- return count/iterations; // return average count for smooth data
- }
- int main() {
- // seed pseudorandom number generator with time to get different randoms each run
- srand (0);
- int interval = 100;
- int max = 1000;
- for (int size=interval; size <= max; size+=interval) {
- int intArray[size];
- // generate random (or consecutive) numbers to fill array
- // print numbers that are generated so we can test correctness
- for (int i = 0; i < size; i++) {
- intArray[i] = rand() + 1;
- //cout << intArray[i] << " ";
- }
- // timers and counters uncomment line to be used
- for (int i = 0; i < 10; i++) {
- TIMER_ALGORITHM(500, size);
- //cout << CountBasicOperations(100, intArray, size) << endl;
- }
- //cout << "MinDistance is " << MinDistance2(intArray, size);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement