高分求解优化查找算法,请看帖子

asaili 2005-05-09 12:00:01
有一组数据:
ID begin end
A 1 10
B 11 20
C 21 30
D 31 40
.........
数据存在内存中,大概有几千组,begin和end互相没有交集。

比如
给出 15,应该查找到B
给出 25,应该查找到C。

请问各位大侠,除了遍历之外有没有好的算法。
...全文
199 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzw2004 2005-05-10
  • 打赏
  • 举报
回复
up~
MagicCarmack 2005-05-10
  • 打赏
  • 举报
回复
并查集是怎么一回事?
blackmouth 2005-05-10
  • 打赏
  • 举报
回复
source.txt文件里的数据为:
A 1 10
B 15 20
C 24 30
D 37 40
hello 55 66
world 70 100
刚才打漏了
blackmouth 2005-05-10
  • 打赏
  • 举报
回复
用二分法实现,通过测试,代码如下:
#include<vector>
#include<fstream>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;

string MyId(int k,vector<vector<int> > &data,const vector<string> &IdVec)
{
sort(data.begin(),data.end());
int size=data.size();
int l=0;
int r=size-1;
while(r>l)
{
int pos=(r+l)/2;
if(k<data[pos][0])
{
r=pos;
continue;
}
else if(k==data[pos][0])
return IdVec[data[pos][2]];
else
{
if(k<=data[pos][1])
return IdVec[data[pos][2]];
l=pos+1;
continue;
}
}
if(k>=data[l][0] && k<=data[l][1])
return IdVec[data[l][2]];
return "Not Exist!";
}
void main()
{
int number=-9;
ifstream infile("source.txt");
vector<vector<int> > data;
vector<string> IdVec;
while(!infile.eof())
{
static int j=0;
vector<int> tmp;
string t_id;
int t_data;
infile>>t_id;
IdVec.push_back(t_id);
infile>>t_data;
tmp.push_back(t_data);
infile>>t_data;
tmp.push_back(t_data);
tmp.push_back(j++);
data.push_back(tmp);

}
cout<<MyId(number,data,IdVec)<<endl;
}
测试:source.txt文件里的数据为:
A 1 10
B 15 20
C 24 30
D 37 40

测试1:置number=-9,则在屏幕打印出Not Exist!;
置number=9, 则在屏幕打印出A;
置number=11,则在屏幕打印出Not Exist!;
置number=37,则在屏幕打印出D;
置number=50,则在屏幕打印出Not Exist!;
置number=60,则在屏幕打印出hello;

qhfu 2005-05-09
  • 打赏
  • 举报
回复
兄弟这方法不错,不过数组是从0开始的, A是idvec[0]的话,B应该是idvec[1];
blackmouth 2005-05-09
  • 打赏
  • 举报
回复
先把ID存为一个数组
idvec={A,B,C,D,...};
那么n对应的ID为:
idvec[ceil(n/10)]。
例如当n=15, idvec[ceil(n/10)]=idvec[ceil(15/10)]=idvec[2]=B
当n=25, idvec[ceil(n/10)]=idvec[ceil(25/10)]=idvec[3]=C
ceil是库函数,可以直接调用的
flying_dancing 2005-05-09
  • 打赏
  • 举报
回复
折半也就是2分查找..
qhfu 2005-05-09
  • 打赏
  • 举报
回复
排序吗? 排序可用2分查找
asaili 2005-05-09
  • 打赏
  • 举报
回复
数据以结构体数组存在内存中。
xoyoren 2005-05-09
  • 打赏
  • 举报
回复
怎么这么像给 IP 地址查看地区捏
二分吧
inlin 2005-05-09
  • 打赏
  • 举报
回复
排序可用2分查找
whoho 2005-05-09
  • 打赏
  • 举报
回复
有一种简便方法:使用STL的map
这样即可:
struct value{
std::string id;
int end;
};

int main()
{
std::map<int, value> DataMap;
//插入数据,略

//查询:
std::map<int, value>::iterator it;
it = DataMap.find(11);
std::cout << ( (it!=DataMap.end()) ? DataMap[11].id : "not found" );

}
asaili 2005-05-09
  • 打赏
  • 举报
回复
明白怎么用二分法了。

请问QuickKeyBoard() 并查集是怎么样的算法。

xoyoren(forcey) 说对了 我确实是用作查询IP地址段。
asaili 2005-05-09
  • 打赏
  • 举报
回复
这个怎么用二分?
可能我举例子误导了大家,实际上可能不是连续的

ID begin end
A 1 10
B 15 20
C 24 30
D 37 40

类似这样的怎么排序才可以用二分法呀
healer_kx 2005-05-09
  • 打赏
  • 举报
回复
先看规律呗...
看你给的这些数字, 我看有规律啊.

没有规律用map
QuickKeyBoard 2005-05-09
  • 打赏
  • 举报
回复
使用并查集可以轻松实现,复杂度O(1)的。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧