社区
C++ 语言
帖子详情
高分求解优化查找算法,请看帖子
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
打赏
收藏
高分求解优化查找算法,请看帖子
有一组数据: ID begin end A 1 10 B 11 20 C 21 30 D 31 40 ......... 数据存在内存中,大概有几千组,begin和end互相没有交集。 比如 给出 15,应该查找到B 给出 25,应该查找到C。 请问各位大侠,除了遍历之外有没有好的算法。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)的。
计算机考研机试攻略 -
高分
篇(试读).pdf
2.7
查找
类问题 54 2.8 贪心类问题 61 2.9 链表类问题 65 第三章 数学 68 3.1 同模余定理 69 3.2 最大公约数(GCD) 72 3.3 最小公倍数(LCM) 74 3.4 斐波那契数列 75 3.5 素数判定 76 3.6 素数筛选 78 ...
基于图像的运动物体六自由度参数测量方法研究_付亮
线很有可能并不相交,因此利用最小二乘法对以上的方程组进行
求解
。最 后,将同一时刻下 3 个特征点的动体坐标和世界坐标带入到相应的数学模型 中,求出动体坐标系与世界坐标系之间的转换矩阵,进一步解算便可以得到 ...
第十三章_
优化
算法
文章目录第一十三章
优化
算法
13.1 CPU 和 GPU 的区别?13.2 如何解决训练样本少的问题13.3 什么样的样本集不适合用深度学习?13.4 有没有可能找到比已知
算法
更好的
算法
?13.5 何为共线性, 跟过拟合有啥关联?13.6 广义...
算法
导论期末详细归纳总结(含习题和完整
算法
代码)
4号
算法
导论期末考试,这篇文章帮助各大学子备考期末,冲刺
高分
一: 各种
算法
时间复杂度 (一) 排序
算法
: 直接插入排序: O(n2n^2n2)、稳定 shell排序: O(n1.3n^{1.3}n1.3)、不稳定 归并排序: O(nlgnlgnlgn)、稳定...
第十章
优化
算法
第十章
优化
算法
13.1 CPU 和 GPU 的区别? 概念: CPU 全称是 central processing unit,CPU 是一块超大规模的集成电路,是一台计算机的运 算和控制核心,它的主要功能是解释计算机指令和处理计算机软件中...
C++ 语言
64,648
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章