m4n71k0r

Untitled

Jun 9th, 2012
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <vector>
  5. #include <chrono>
  6. #include <utility>
  7. #include <cmath>
  8.  
  9. const size_t records_number = 1000000;
  10. const size_t check_status_chunk_size = records_number / 100;
  11. const size_t check_pass_chunk_size = records_number / 1000;
  12.  
  13. struct star_info
  14. {
  15.     long x,y,z;
  16.  
  17.     unsigned long long distance_square(const star_info& another_star_info) const
  18.     {
  19.         unsigned long long dx = x - another_star_info.x, dy = y - another_star_info.y, dz = z - another_star_info.z;
  20.  
  21.         return dx * dx + dy * dy + dz * dz;
  22.     }
  23. };
  24.  
  25. std::basic_istream<char>& operator>>(std::basic_istream<char>& is, star_info& str)
  26. {
  27.     is >> str.x >> str.y >> str.z;
  28.     return is;
  29. }
  30.  
  31. std::basic_ostream<char>& operator<<(std::basic_ostream<char>& is, const star_info& str)
  32. {
  33.     is << "{" << str.x << "; " << str.y << "; " << str.z << "}";
  34.     return is;
  35. }
  36.  
  37. template<class R, class T>
  38. inline R duration(const T& time_point1,const T& time_point2)
  39. {
  40.     auto d = std::chrono::duration_cast<std::chrono::duration<R>>(time_point2 - time_point1);
  41.     return d.count();
  42. }
  43.  
  44. void print_loading_status(size_t percent)
  45. {
  46.     std::cout << "\rLoading: " << std::setw(3) << percent << " %";
  47. }
  48.  
  49. template<class F>
  50. void load_data(std::ifstream& data, std::vector<star_info>& stars, F process_data)
  51. {
  52.     auto t = std::chrono::high_resolution_clock::now();
  53.     size_t i = 0;
  54.  
  55.     while (!data.eof() && i < records_number)
  56.     {
  57.         data >> stars[i];
  58.         ++i;
  59.  
  60.         if (i % check_status_chunk_size == 0)
  61.         {
  62.             print_loading_status(i * 100.0 / records_number);
  63.         }
  64.     }
  65.     std::cout << "\nDone! - " << duration<double>(t, std::chrono::high_resolution_clock::now()) << " sec" << std::endl << std::endl;
  66.  
  67.     process_data();
  68. }
  69.  
  70. auto main() -> int
  71. {
  72.     auto t0 = std::chrono::high_resolution_clock::now();
  73.     std::ifstream data("stars.dat");
  74.  
  75.     if (data.is_open())
  76.     {
  77.         std::vector<star_info> stars(records_number);
  78.  
  79.         load_data(data, stars, [&]()
  80.         {
  81.             unsigned long long min_distance_square = (unsigned long long)-1;
  82.             size_t min_distance_square_star_indexes[2] = {0, 0};
  83.             auto t1 = std::chrono::high_resolution_clock::now();
  84.             auto t2 = t1;
  85.  
  86.             for (size_t current = 0; current < stars.size() - 1; ++current)
  87.             {
  88.                 for (size_t i = current + 1; i < stars.size(); ++i)
  89.                 {
  90.                     auto current_distance_square = stars[current].distance_square(stars[i]);
  91.  
  92.                     if (current_distance_square < min_distance_square)
  93.                     {
  94.                         min_distance_square = current_distance_square;
  95.                         min_distance_square_star_indexes[0] = current;
  96.                         min_distance_square_star_indexes[1] = i;
  97.                     }
  98.                 }
  99.                 if ( current % check_pass_chunk_size == 0)
  100.                 {
  101.                     std::cout << "Pass # " << current <<" done - " << duration<double>(t2, std::chrono::high_resolution_clock::now()) << " sec" << std::endl;
  102.                     t2 = std::chrono::high_resolution_clock::now();
  103.                 }
  104.             }
  105.  
  106.             std::cout << "\nAll passes done - " << duration<double>(t1, std::chrono::high_resolution_clock::now()) << " sec" << std::endl;
  107.             std::cout << "Minimal distance = " << pow(min_distance_square, 0.5) << std::endl;
  108.             std::cout << "Stars:{ID: " << min_distance_square_star_indexes[0] << ":" << stars[min_distance_square_star_indexes[0]] << "; ID: " << min_distance_square_star_indexes[1] << ":" << stars[min_distance_square_star_indexes[1]] << ")\n";
  109.         });
  110.     }
  111.     else
  112.     {
  113.         std::cout << "Can't open data file!" << std::endl;
  114.     }
  115.     std::cout << "Work done - " << duration<double>(t0, std::chrono::high_resolution_clock::now()) << " sec" << std::endl;
  116.     std::cin.get();
  117. }
Advertisement
Add Comment
Please, Sign In to add comment