Advertisement
andruhovski

sp0204

Oct 17th, 2014
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.07 KB | None | 0 0
  1. // sp0205.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <Windows.h>
  6. #include <vector>
  7. #include <algorithm>
  8. #include <numeric>
  9.  
  10. template <typename IDATA>
  11. class IndexedList {
  12.     class INode
  13.     {
  14.     public:
  15.         IDATA value;
  16.         unsigned int index;
  17.         class INode *next;
  18.         INode() {};
  19.         INode(IDATA v, unsigned int p)
  20.         {
  21.             value = v;
  22.             index = p;
  23.         }
  24.     };
  25.  
  26.     INode* head, *tail;
  27.     IDATA default_value;
  28.     unsigned int maxpos;
  29. public:
  30.     IndexedList() { head=tail=NULL; default_value=0; maxpos=0;}
  31.     IndexedList(IDATA initV, unsigned int pos, IDATA df) {
  32.         head=tail=new INode (initV, pos);
  33.         default_value=df;
  34.         maxpos=pos;
  35.     }
  36.     bool addNodeByIndex(IDATA val, unsigned pos);
  37.     IDATA getNodeByIndex(unsigned pos);
  38.     bool DeleteNodeByIndex(unsigned pos);
  39.     IDATA operator[](int nSubscript) { return getNodeByIndex(nSubscript); }
  40. };
  41.  
  42.  
  43. template <typename IDATA>
  44. class HashedList {
  45.     class INode
  46.     {
  47.     public:
  48.         IDATA value;
  49.         unsigned int index;
  50.         class INode *next;
  51.         INode() {};
  52.         INode(IDATA v, unsigned int p)
  53.         {
  54.             value = v;
  55.             index = p;
  56.         }
  57.     };
  58.  
  59.     INode* *hashTable;
  60.     unsigned int hashTableSize;
  61.     IDATA default_value;
  62.     unsigned int maxpos;
  63. public:
  64.     HashedList() { hashTableSize = 100; }
  65.     HashedList(IDATA initV, unsigned int pos, IDATA df) {
  66.         hashTableSize = 1000;
  67.         hashTable = new INode*[hashTableSize];
  68.         for (unsigned int i = 0; i < hashTableSize; i++)
  69.         {
  70.             hashTable[i]=NULL;
  71.         }
  72.         addNodeByIndex(initV, pos);
  73.         default_value = df;
  74.         maxpos = pos;
  75.     }
  76.     bool addNodeByIndex(IDATA val, unsigned pos);
  77.     IDATA getNodeByIndex(unsigned pos);
  78.     bool DeleteNodeByIndex(unsigned pos);
  79.     IDATA operator[](int nSubscript) { return getNodeByIndex(nSubscript); }
  80.     int hash(unsigned int pos) { return (pos % hashTableSize); }   
  81. };
  82.  
  83.  
  84. template <typename IDATA>
  85. bool IndexedList<IDATA>::addNodeByIndex(IDATA val, unsigned pos)
  86. {
  87.     if (val == default_value)
  88.         return false;
  89.  
  90.     INode* newElement = new INode(val,pos);
  91.     if (pos > maxpos)
  92.     {
  93.         tail = tail->next = newElement;
  94.         maxpos = pos;
  95.     }
  96.     else{
  97.             INode* i = head;
  98.             while (i->next->index < pos)
  99.                 i = i->next;       
  100.             newElement->next = i->next;
  101.             i->next = newElement;
  102.         }
  103.     return true;
  104. }
  105.  
  106. template <typename IDATA>
  107. IDATA IndexedList<IDATA>::getNodeByIndex(unsigned pos){
  108.     if (pos<=maxpos)
  109.         for (INode* i = head; i!=NULL; i = i->next)
  110.             if (i->index == pos) return i->value;      
  111.     return default_value;
  112. }
  113.  
  114. template <typename IDATA>
  115. bool IndexedList<IDATA>::DeleteNodeByIndex(unsigned pos)
  116. {
  117.     class INode* temp, *temp1;
  118.     temp= temp1 = head;
  119.     if (head->index == pos)
  120.     {
  121.         head = temp->next;
  122.         delete temp;
  123.         return true;
  124.     }
  125.     else
  126.     {
  127.         for (temp = head->next; temp != NULL; temp1 = temp, temp = temp->next)
  128.             if (temp->index == pos) {
  129.             temp1->next = temp->next;
  130.             delete temp;
  131.             return true;
  132.             }
  133.     }
  134.     return false;
  135. }
  136.  
  137. template <typename IDATA>
  138. bool HashedList<IDATA>::addNodeByIndex(IDATA val, unsigned pos)
  139. {
  140.     INode *p, *p0;
  141.     int bucket;
  142.     if (val == default_value)
  143.         return false;
  144.  
  145.     bucket = hash(pos);
  146.     p0 = hashTable[bucket];
  147.     p = new INode(val, pos);
  148.     hashTable[bucket] = p;
  149.     p->next = p0;  
  150.  
  151.     return true;
  152. }
  153.  
  154. template <typename IDATA>
  155. IDATA HashedList<IDATA>::getNodeByIndex(unsigned pos){
  156.     INode *p;
  157.     for (p = hashTable[hash(pos)]; p!=NULL; p=p->next)
  158.     {
  159.         if (p->index == pos) return p->value;
  160.     }
  161.    
  162.     return default_value;
  163. }
  164.  
  165. template <typename IDATA>
  166. bool HashedList<IDATA>::DeleteNodeByIndex(unsigned pos)
  167. {
  168.     return false;
  169. }
  170.  
  171. LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
  172. LARGE_INTEGER Frequency;
  173.  
  174. int _tmain(int argc, _TCHAR* argv[])
  175. {
  176.     FILE *fileA, *fileB;
  177.     int xVal;
  178.     long int scalar_d=0;
  179.     int index = 0;
  180.     std::vector<int> A;
  181.     std::vector<int> B;
  182.     errno_t err;
  183.  
  184.     err=fopen_s(&fileA,"vector_a.txt","rt");
  185.     if (err!=0)
  186.     {
  187.         printf ("Error %d",err);
  188.         return -1;
  189.     }
  190.    
  191.     fscanf_s(fileA,"%d",&xVal);
  192.     HashedList<int> listA(xVal,index,0);
  193.     A.push_back(xVal);
  194.     while (fscanf_s(fileA, "%d", &xVal) > 0)
  195.     {
  196.         listA.addNodeByIndex(xVal, ++index);
  197.         A.push_back(xVal);
  198.     }
  199.     fclose(fileA);
  200.  
  201.     err=fopen_s(&fileB,"vector_b.txt","rt");
  202.     if (err!=0)
  203.     {
  204.         printf ("Error %d",err);
  205.         return -1;
  206.     }
  207.    
  208.     fscanf_s(fileB,"%d",&xVal);
  209.     index=0;
  210.     HashedList<int> listB(xVal, index, 0);
  211.     B.push_back(xVal);
  212.     while (fscanf_s(fileB, "%d", &xVal) > 0) {
  213.         listB.addNodeByIndex(xVal, ++index);
  214.         B.push_back(xVal);
  215.     }
  216.        
  217.     fclose(fileB);     
  218.     QueryPerformanceCounter(&StartingTime);
  219.     for (int i = 0; i <10000; i++)
  220.     {      
  221.         scalar_d += listA[i] * listB[i];
  222.     }  
  223.     QueryPerformanceCounter(&EndingTime);
  224.  
  225.     ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;;
  226.     printf( "\n%2.1ld \n", ElapsedMicroseconds.QuadPart ); 
  227.     printf("\nS=%ld", scalar_d);
  228.    
  229.     QueryPerformanceCounter(&StartingTime);
  230.     scalar_d = std::inner_product(A.begin(), A.end(), B.begin(), 0);
  231.     QueryPerformanceCounter(&EndingTime);
  232.  
  233.     ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;;
  234.     printf("\n%2.1ld \n", ElapsedMicroseconds.QuadPart);
  235.     printf("\nS=%ld", scalar_d);
  236.  
  237.     return 0;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement