64,654
社区成员
发帖
与我相关
我的任务
分享
class Interval
{
public:
int m_min;
int m_max;
int m_hashdata;
Interval()
{
m_min = -1;
m_max = -1;
m_hashdata = -1;
}
Interval(int min1,int max1,int hashdata):m_min(min1),m_max(max1),m_hashdata(hashdata){}
};
void BinarySearch(int begin,int end,int data,map<int,Interval*>::iterator &it)
{
int Half = (begin + end)/2;
int i = 0;
if (data == it->first || (data > it->first && data < it->second->m_max))
{
return;
}else if(data > it->first)
{
for (i = 0;i < Half;i++)
{
it++;
}
}else if(data < it->first)
{
for (i = 0;i < Half;i++)
{
it--;
}
}
if (data == it->first || (data > it->first && data < it->second->m_max))
{
return;
}else if(data > it->first)
{
BinarySearch(Half,end,data,it);
}else if(data < it->first)
{
BinarySearch(begin,Half,data,it);
}
}
int main()
{
map<int,Interval*> rang_map;
rang_map.insert(pair<int,Interval*>(1,new Interval(1,2,20)));
rang_map.insert(pair<int,Interval*>(3,new Interval(3,37,75)));
rang_map.insert(pair<int,Interval*>(45,new Interval(45,157,12)));
rang_map.insert(pair<int,Interval*>(160,new Interval(160,200,23)));
rang_map.insert(pair<int,Interval*>(210,new Interval(210,255,121)));
rang_map.insert(pair<int,Interval*>(10000,new Interval(10000,20000,1)));
rang_map.insert(pair<int,Interval*>(30000,new Interval(30000,40000,2)));
rang_map.insert(pair<int,Interval*>(50000,new Interval(50000,60000,3)));
rang_map.insert(pair<int,Interval*>(70000,new Interval(70000,80000,4)));
rang_map.insert(pair<int,Interval*>(90000,new Interval(90000,100000,5)));
size_t start,end;
start = GetTickCount();
for (int i = 0;i < 100000;i++)
{
map<int,Interval*>::iterator it = rang_map.begin();
BinarySearch(0,rang_map.size(),78,it);
}
end = GetTickCount();
cout << "时间=" << end - start << endl;
return 0;
}
class Interval
{
public:
void Init(int min, int max, int value)
{
m_min = min;
m_max = max;
m_value = value;
}
bool operator==(const int &k)
{
if (m_min <= k && k <= m_max )
{
return true;
}
else
{
return false;
}
}
bool operator>(const int &k)
{
if (m_min > k)
{
return true;
}
else
{
return false;
}
}
private:
int m_min;
int m_max;
int m_value;
};
int _tmain(int argc, _TCHAR* argv[])
{
TTree<int, Interval> interval_map;
TLeaf<int, Interval> interval[10];
interval[0].m_Key = 0;
interval[0].m_Value.Init(0, 20000, 1);
interval[1].m_Key = 30000;
interval[1].m_Value.Init(30000, 35000, 2);
interval[2].m_Key = 40000;
interval[2].m_Value.Init(40000, 41000, 3);
interval[3].m_Key = 42000;
interval[3].m_Value.Init(42000, 43000, 4);
interval[4].m_Key = 44000;
interval[4].m_Value.Init(44000, 45000, 5);
interval[5].m_Key = 46000;
interval[5].m_Value.Init(46000, 48000, 6);
interval[6].m_Key = 50000;
interval[6].m_Value.Init(50000, 60000, 7);
interval[7].m_Key = 70000;
interval[7].m_Value.Init(70000, 75000, 8);
interval[8].m_Key = 80000;
interval[8].m_Value.Init(80000, 90000, 9);
interval[9].m_Key = 95000;
interval[9].m_Value.Init(95000, 100000, 10);
for (int i = 0; i < 10; i++)
{
interval_map.Insert(interval + i);
}
int num = 0;
float times = 0.0f;
CPerformance perf;
LARGE_INTEGER dwQPart;
perf.Start(dwQPart);
for (int i = 0; i < 100000; i++)
{
interval_map.Find(i);
}
times = perf.End(dwQPart);
printf("%f\n", times);
getchar();
return 0;
}