Advertisement
Guest User

Fibonacci Heap Test

a guest
Apr 17th, 2018
627
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.99 KB | None | 0 0
  1. /*
  2. n vertices, d density: binary_heap fibonacci_heap
  3.  
  4. 512 vertices, 0.2 density: 0 0
  5. 512 vertices, 0.4 density: 0.003 0.001
  6. 512 vertices, 0.6 density: 0 0
  7. 512 vertices, 0.8 density: 0.008 0
  8. 512 vertices, 1 density: 0.016 0
  9.  
  10. 1024 vertices, 0.2 density: 0 0.015
  11. 1024 vertices, 0.4 density: 0.016 0
  12. 1024 vertices, 0.6 density: 0.016 0
  13. 1024 vertices, 0.8 density: 0.022 0.016
  14. 1024 vertices, 1 density: 0.033 0.007
  15.  
  16. 2048 vertices, 0.2 density: 0.017 0
  17. 2048 vertices, 0.4 density: 0.053 0
  18. 2048 vertices, 0.6 density: 0.058 0.016
  19. 2048 vertices, 0.8 density: 0.09 0.021
  20. 2048 vertices, 1 density: 0.113 0.026
  21.  
  22. 4096 vertices, 0.2 density: 0.095 0.01
  23. 4096 vertices, 0.4 density: 0.171 0.056
  24. 4096 vertices, 0.6 density: 0.285 0.047
  25. 4096 vertices, 0.8 density: 0.357 0.085
  26. 4096 vertices, 1 density: 0.459 0.085
  27.  
  28. 8192 vertices, 0.2 density: 0.385 0.085
  29. 8192 vertices, 0.4 density: 0.716 0.17
  30. 8192 vertices, 0.6 density: 1.116 0.263
  31. 8192 vertices, 0.8 density: 1.501 0.327
  32. 8192 vertices, 1 density: 1.946 0.406
  33. */
  34.  
  35. #include <iostream>
  36. #include <queue>
  37. #include <ctime>
  38. #include "fibheap.h"
  39.  
  40. using namespace std;
  41.  
  42. vector<int> dijkstra(vector<vector<pair<int, int>>>& adj)
  43. {
  44.   priority_queue<pair<int,int>> q;
  45.   vector<int> dist(adj.size(), -1);
  46.   dist[0] = 0;
  47.   q.push({0, 0});
  48.  
  49.   while( !q.empty() )
  50.   {
  51.     int i = q.top().second; q.pop();
  52.  
  53.     for(pair<int,int>& edge : adj[i])
  54.       if( dist[edge.first] == -1 || dist[i] + edge.second < dist[edge.first] )
  55.       {
  56.         dist[edge.first] = dist[i] + edge.second;
  57.         q.push({-dist[edge.first], edge.first});
  58.       }
  59.   }
  60.  
  61.   return dist;
  62. }
  63.  
  64. vector<int> fibonacci_dijkstra(vector<vector<pair<int, int>>>& adj)
  65. {
  66.   fibonacci_queue<pair<int,int>> q;
  67.   vector<int> dist(adj.size(), -1);
  68.   vector<void*> nodes(adj.size(), NULL);
  69.   dist[0] = 0;
  70.   nodes[0] = q.insert({0, 0});
  71.  
  72.   while( q.size() > 0 )
  73.   {
  74.     int i = q.find_min().second; q.remove_min();
  75.  
  76.     for(pair<int,int>& edge : adj[i])
  77.       if( dist[edge.first] == -1 || dist[i] + edge.second < dist[edge.first] )
  78.       {
  79.         dist[edge.first] = dist[i] + edge.second;
  80.         if( nodes[edge.first] == NULL ) {
  81.           nodes[edge.first] = q.insert({dist[edge.first], edge.first});
  82.         } else {
  83.           q.decrease_key(nodes[edge.first], {dist[edge.first], edge.first});
  84.         }
  85.       }
  86.   }
  87.  
  88.   return dist;
  89. }
  90.  
  91. // https://stackoverflow.com/questions/26237419/faster-than-rand
  92. static unsigned int g_seed;
  93.  
  94. // Used to seed the generator.          
  95. inline void fast_srand(int seed) {
  96.     g_seed = seed;
  97. }
  98.  
  99. // Compute a pseudorandom integer.
  100. // Output value in range [0, 32767]
  101. inline int fast_rand(void) {
  102.     g_seed = (214013*g_seed+2531011);
  103.     return (g_seed>>16)&0x7FFF;
  104. }
  105.  
  106. vector<vector<pair<int, int>>> generate_graph(int n, double density) {
  107.   auto ret = vector<vector<pair<int, int>>>(n);
  108.   for( int i = 0; i < n * (n-1) * density; ++i ) {
  109.     int a = fast_rand() % n;
  110.     int b = fast_rand() % n;
  111.     ret[a].push_back({b, fast_rand() % 100 + 1});
  112.     ret[b].push_back({a, fast_rand() % 100 + 1});
  113.   }
  114.   return ret;
  115. }
  116.  
  117. pair<double, double> time_check(int n, double density) {
  118.   pair<double, double> ret;
  119.  
  120.   auto graph = generate_graph(n, density);
  121.  
  122.   clock_t t1 = clock();
  123.   vector<int> ans = dijkstra(graph);
  124.   clock_t t2 = clock();
  125.   ret.first = (t2-t1) / (double)CLOCKS_PER_SEC;
  126.  
  127.   t1 = clock();
  128.   vector<int> ans2 = fibonacci_dijkstra(graph);
  129.   t2 = clock();
  130.   ret.second = (t2-t1) / (double)CLOCKS_PER_SEC;
  131.  
  132.   for( int i = 0; i < n; ++i ) {
  133.     if( ans[i] != ans2[i] ) {
  134.       return {-1, -1};
  135.     }
  136.   }
  137.  
  138.   return ret;
  139. }
  140.  
  141. int main() {
  142.   fast_srand(1234);
  143.   cout << "n vertices, d density: binary_heap fibonacci_heap\n" << endl;
  144.   for( int i = 512; i <= 10000; i *= 2 ) {
  145.     for( double j = 0.2; j <= 1.1; j += 0.2 ) {
  146.       pair<double, double> ret = time_check(i, j);
  147.       cout << i << " vertices, " << j << " density: " << ret.first << " " << ret.second << endl;
  148.     }
  149.     cout << endl;
  150.   }
  151.  
  152.   return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement