首页 > 代码库 > 没事写个散列玩~
没事写个散列玩~
感觉散列的查找性能真心不错,如果使用普通线性结构查找,平均时间是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 =http://www.mamicode.com/ 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 //Start124 for ( unsigned int unloop = 0; unloop < unListSize ;++ unloop )125 {126 RandString ( SampleDataList[unloop].szSampleKey, 3 );127 //what the Data is128 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 string139 unLength = rand () % unAriseLength + unMiniLength;140 //init the Key size141 szRandString.resize( unLength + 1 );142 for ( unsigned int unWordLoop = 0; unWordLoop < unLength; ++ unWordLoop )143 {144 //0or1145 bUpper = rand () & 0x01;146 //what the Key is147 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 Map167 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 }
没事写个散列玩~
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。