没事写个散列玩~

感觉散列的查找性能真心不错,如果使用普通线性结构查找,平均时间是n/2.而刚才用实验,256大小的散列,存储128个数据,平均时间为2次以内。感觉真心NB

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <cstdlib>
  5 #include <ctime>
  6 
  7 using namespace std;
  8 typedef bool BOOL;
  9 typedef unsigned long DWORD;
 10 typedef unsigned char UINT8;
 11 //typedef true TRUE;
 12 //typedef false FALSE;
 13 DWORD g_dwTotalTimes = 0;
 14 DWORD g_dwCount = 0;
 15 #define INIT_TL { g_dwTotalTimes = 0, g_dwCount = 0; }
 16 #define CALL_COUNT(t) { g_dwTotalTimes += t,++ g_dwCount; }
 17 #define AVERAGE ( (float)g_dwTotalTimes / g_dwCount )
 18 
 19 void RandString ( string & szRandString, unsigned int unAriseLength, unsigned int unMiniLength = 5 );
 20 //Data In Struct
 21 typedef class A1
 22 {
 23 public:
 24     string szSampleKey;
 25     string szRealData;
 26 }SampleData;
 27 
 28 //Data Normal
 29 typedef class A
 30 {
 31 #define MAX_SIZE_OF_DB (256)
 32 #define MAX_ADDR_OF_DB (MAX_SIZE_OF_DB)
 33 
 34 private:
 35     vector<SampleData> Array;
 36     vector<int> UsedFlagArray;
 37     DWORD dwLeftDataSize;
 38 private://function
 39     DWORD GetAddrByKey ( string & KeyStr );
 40     BOOL SaveDataToDB ( SampleData & KeyToGet, DWORD dwAddr );
 41 public:
 42     A();
 43     ~A();
 44     BOOL AddToArray( SampleData & sd );
 45     SampleData & FindInArray( string & Key );
 46 }NormalArray;
 47 
 48 NormalArray::A()
 49 {
 50     INIT_TL;
 51     UsedFlagArray.resize ( MAX_SIZE_OF_DB );
 52     Array.resize ( MAX_SIZE_OF_DB );
 53     dwLeftDataSize = MAX_SIZE_OF_DB;
 54 }
 55 
 56 NormalArray::~A()
 57 {
 58     ;
 59 }
 60 
 61 BOOL NormalArray::AddToArray ( SampleData & sd )
 62 {
 63     if ( 0 == dwLeftDataSize )
 64     {
 65         return false;
 66     }
 67     //根据Key值计算出地址信息
 68     DWORD dwAddr = GetAddrByKey ( sd.szSampleKey );
 69     //根据地址信息将数据存放在数据库中
 70     SaveDataToDB ( sd, dwAddr );
 71     return true;
 72 }
 73 
 74 DWORD NormalArray::GetAddrByKey ( string & KeyStr )
 75 {
 76     DWORD dwSize = KeyStr.size ();
 77     DWORD dwKeySum = 0;
 78     while ( dwSize -- )
 79     {
 80         dwKeySum += (UINT8)KeyStr[dwSize];
 81     }
 82     //根据上限值计算出结果
 83     return dwKeySum % ( MAX_ADDR_OF_DB );
 84 }
 85 
 86 BOOL NormalArray::SaveDataToDB ( SampleData & KeyToGet, DWORD dwAddr )
 87 {
 88     if ( 0 == dwLeftDataSize )
 89     {
 90         return false;
 91     }
 92     while ( 0 != UsedFlagArray[dwAddr] )
 93     {
 94         (++ dwAddr)  %= MAX_ADDR_OF_DB;
 95     }
 96     //在这个地址保存数据
 97     Array[dwAddr].szSampleKey = KeyToGet.szSampleKey;
 98     Array[dwAddr].szRealData = KeyToGet.szRealData;
 99     //地址信息更新
100     UsedFlagArray[dwAddr] = 1;
101     -- dwLeftDataSize;
102 
103     return true;
104 }
105 
106 SampleData & NormalArray::FindInArray( string & Key )
107 {
108     DWORD dwSearchTime = 1;
109     DWORD dwAddr = GetAddrByKey (Key);
110     while ( Array[dwAddr].szSampleKey != Key )
111     {
112         ++ dwSearchTime;
113         (++ dwAddr) %= MAX_ADDR_OF_DB;
114     }
115     CALL_COUNT(dwSearchTime);
116     cout << "Find " << Key << " With " << dwSearchTime << " Times.\n";
117     return Array[dwAddr];
118 }
119 void InitialSampleData( vector<SampleData> & SampleDataList )
120 {
121     srand ( time ( NULL ) );
122     unsigned int unListSize = SampleDataList.size();
123     //Start
124     for ( unsigned int unloop = 0; unloop < unListSize ;++ unloop )
125     {
126         RandString ( SampleDataList[unloop].szSampleKey, 3 );
127         //what the Data is
128         RandString ( SampleDataList[unloop].szRealData, 7 );
129     }
130 }
131 
132 void RandString ( string & szRandString, unsigned int unAriseLength, unsigned int unMiniLength )
133 {
134     const char cBaseVal = 'a';
135     char cIncreaseVal = 0;
136     unsigned int bUpper = 0;
137     unsigned int unLength = 0;
138     //the length of string
139     unLength = rand () % unAriseLength + unMiniLength;
140     //init the Key size
141     szRandString.resize( unLength + 1 );
142     for ( unsigned int unWordLoop = 0; unWordLoop < unLength; ++ unWordLoop )
143     {
144         //0or1
145         bUpper = rand () & 0x01;
146         //what the Key is
147         cIncreaseVal = rand () % 26;
148         //Make It;
149         char tmp = cBaseVal + cIncreaseVal;
150         bUpper ? tmp -= 32 : tmp ;
151         szRandString[unWordLoop] = tmp;
152     }
153     szRandString[unLength] = '\0';
154 }
155 
156 void DspDataConsol ( const vector<SampleData> & SampleDataList )
157 {
158     unsigned int unListSize = SampleDataList.size();
159     for ( unsigned int unLoop = 0; unLoop < unListSize; ++ unLoop )
160     {
161         cout << unLoop << endl;
162         cout << SampleDataList[unLoop].szSampleKey << endl;
163         cout << SampleDataList[unLoop].szRealData << endl;
164     }
165 }
166 //Data Map
167 
168 
169 int main ()
170 {
171     //初始化测试数据
172     vector<SampleData> TestData;
173     TestData.resize (128);
174     InitialSampleData ( TestData );
175     //DspDataConsol ( TestData );
176     NormalArray Na;
177     for ( DWORD dwLoop = 0; dwLoop < 128; ++ dwLoop )
178     {
179         Na.AddToArray ( TestData[dwLoop] );
180     }
181     for ( DWORD dwLoop = 0; dwLoop < 128; ++ dwLoop )
182     {
183         Na.FindInArray( TestData[dwLoop].szSampleKey );
184     }
185     cout << "平均查找时间:" << AVERAGE << endl;
186     return 0;
187 }

 

posted @ 2015-01-03 23:19  Matrix_R  阅读(274)  评论(0编辑  收藏  举报