Advertisement
Guest User

Untitled

a guest
Jun 20th, 2020
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <set>
  4. #include <random>
  5. #include <bitset>
  6. #include <unordered_set>
  7. #include <x86intrin.h>
  8. #include <algorithm>
  9.  
  10.  
  11. std::vector<int> arr;
  12.  
  13. //Задать возможно одинаковые
  14. void reset(int n,int a,int b){
  15.     arr.resize(n);
  16.     std::default_random_engine gen(_rdtsc());
  17.     std::uniform_int_distribution<int> ds(a,b);
  18.     for (int i=0;i<n;i++)
  19.         arr[i]=ds(gen);
  20. }
  21.  
  22. //Задать точно случайные
  23. void reset_sl(int n,int a,int b){
  24.     std::default_random_engine gen(_rdtsc());
  25.     std::uniform_int_distribution<int> ds(a,b);
  26.     std::unordered_set<int> brr(n);
  27.     while (brr.size()<n)
  28.         brr.insert(ds(gen));
  29.     arr.clear();
  30.     arr.insert(arr.begin(),brr.cbegin(),brr.cend());
  31. }
  32.  
  33. //Через размер set
  34. bool test_1(){
  35.     std::set brr(arr.begin(),arr.end());
  36.     return arr.size()==brr.size();
  37. }
  38.  
  39. //Через миллиард элементов
  40. bool test_2(){
  41.     std::vector<char> brr(1000000000,0);
  42.     for (int i=0;i<arr.size();i++)
  43.         if (brr[arr[i]])
  44.             return false;
  45.         else
  46.             brr[arr[i]]=1;
  47.     return true;
  48. }
  49.  
  50. //Через миллиард bool
  51. bool test_3(){
  52.     std::vector<bool> brr(1000000000,false);
  53.     for (int i=0;i<arr.size();i++)
  54.         if (brr[arr[i]])
  55.             return false;
  56.         else
  57.             brr[arr[i]]=true;
  58.     return true;
  59. }
  60.  
  61. //Через сортировку без дополнительной памяти
  62. bool test_4(){
  63.     sort(arr.begin(),arr.end());
  64.     for (int i=0;i<arr.size()-1;i++)
  65.         if (arr[i]==arr[i+1])
  66.             return false;
  67.     return true;
  68. }
  69.  
  70. void timeit(int n,int a,int b,bool(*te)(void),const char* name){
  71.     size_t t1,t2;
  72.     constexpr int N=5;
  73.     constexpr double mod=1.0/(N-1);
  74.     double t;
  75.  
  76.     printf("%s[%d]={'n':[],'s':[]}\n",name,n);
  77.  
  78.     t=0;
  79.     for (int i=0;i<N;i++){
  80.         reset(n,a,b);
  81.         t1=_rdtsc();
  82.         te();
  83.         t2=_rdtsc();
  84.         if (i) //Первый замер скипаю, пока там память разогревается
  85.             t+=(t2-t1)*1e-6;
  86.     }
  87.     printf("%s[%d]['n'].append(%.10f)\n",name,n,t*mod);
  88.  
  89.     t=0;
  90.     for (int i=0;i<N;i++){
  91.         reset_sl(n,a,b);
  92.         t1=_rdtsc();
  93.         te();
  94.         t2=_rdtsc();
  95.         if (i)
  96.             t+=(t2-t1)*1e-6;
  97.     }
  98.     printf("%s[%d]['s'].append(%.10f)\n",name,n,t*mod);
  99.  
  100. }
  101.  
  102.  
  103. int main()
  104. {
  105.     printf("set_i={}\n");
  106.     printf("vector_i={}\n");
  107.     printf("vector_b={}\n");
  108.     for (int i:{10,     30,     90,    271,    815,   2451,   7368,  22143,
  109.           66548, 200000}){
  110.         timeit(i,1,1000000000,test_1,"set_i");
  111.         timeit(i,1,1000000000,test_2,"vector_i");
  112.         timeit(i,1,1000000000,test_3,"vector_b");
  113.         timeit(i,1,1000000000,test_4,"sort");
  114.     }
  115.  
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement