请教高手:内存中快速查找问题

ycbao 2003-09-29 10:53:29
我想将一大批ID号及信息放入内存,然后按ID号在内存中实现快速查询。请问:通过何种数据结构存放数据,查询起来最快?链表的查询操作好象显得有点慢。
...全文
41 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyunet 2003-11-20
  • 打赏
  • 举报
回复
你可以对数据库中的记录进行缓存,这样频繁访问的记录就可以在缓存中直接命中,至于缓存本身你可以用map或者hash-map,不用自己写,用现成的。还有一个问题就是如何控制缓存中数据和数据库的同步以及缓存容量的控制,需要你仔细考虑。
apogeecsj 2003-11-19
  • 打赏
  • 举报
回复
平衡查找树,b-树
rtdb 2003-11-19
  • 打赏
  • 举报
回复
楼主一开始没说清啊。

你若是有ORACLE, 记录还是千万级的,
那么最好的选择只能是在数据库中查询。

适当优化一下数据库, 用ID号作索引,
一般查询应该是可以控制在数秒内的。

自已写程序全部读入内存再查询, 肯定能再快一些,

1.你有那么多内存用么?
2.更新时如何同步?



geeksky 2003-11-19
  • 打赏
  • 举报
回复
hash_map
ycbao 2003-11-19
  • 打赏
  • 举报
回复
似乎没有我要的答案。在UNIX下,ID号存在上千万条记录,从数据库(ORACLE)中读我已嫌慢了,我要将这批ID通过某种方法放到内存,这样的背景下,我想寻找一种方法。还请高手指点。
lvcheng606717 2003-10-07
  • 打赏
  • 举报
回复
你既然在这里问,就用map好了
sdtea 2003-10-07
  • 打赏
  • 举报
回复
当然使用std::map了,有现成的不用,自己写是很费力的。
step_by_step 2003-10-07
  • 打赏
  • 举报
回复
具体问题具体分析,在我工作的过程中,我用的比较多的就是建立索引查找,速度很快
晨星 2003-10-01
  • 打赏
  • 举报
回复
vector就是动态数组,不需要事前知道元素个数的多少。

其实自己使用动态申请数组也完全可以呀,先用一条select count语句把元素的个数求出来,然后动态申请空间不就结了?
yhbttfile 2003-10-01
  • 打赏
  • 举报
回复
呵呵~~~
大家都很厉害。
其实,如果是你自己写搜索算法,则需要自己建立索引。索引怎样建立,就看你的查询条件是否是多条件还是单条件了。搜索算法我一般用折半查找,感觉比较快,也很容易实现。
如果你使用STL等库,则map等是你的比较好的选择,不过要实现多条件,map好像也很难实现了。
如果你们的项目里面有数据库支撑,则数据库的搜索算法则是很高效的。对于几十上百万的数据,处理还是没有问题的。
短歌如风 2003-10-01
  • 打赏
  • 举报
回复
一般我用list保存数据(主要是因为list的iterator保持有效的特点),然后用map/multimap<key_type, list<data_type>::iterator>作为索引,需要多少个索引就用多少个map。
对于复合条件检索的实现,应该先分解成多个简单条件的检索,得到一组list<data_type>::iterator的集合,然后用集合运算求解。

如果只需要按一种比较逻辑检索,也可以只使用map或multimap。
ycbao 2003-09-30
  • 打赏
  • 举报
回复
谢谢风雨交加!
RainWindy 2003-09-30
  • 打赏
  • 举报
回复
我对于std不熟,树也没怎么用过,我只是说说我的看法,假如是身份证,由于可能的数据太多,可能需要将身份证号再细分,比如前6位表示地区,后8位表示出身日期(也可能是6位),需要先建立一个前6位的索引(方法可以是线性表、树或其它),查找时首先查找这个索引记录,满足前6位,再从这个索引对应的库中查找。相当于每个人的身份记录都是保存在本地区,如果在其它地方查找,其实系统还是会到对应的地区查找一样。
不过实际中这个很复杂,主要是数据量太大。比如在深圳也有几百万人,一般都是采取后台为数据库,需要查找时发送指令到后台,由后台查找到后返回数据,至于这个数据我想应该是多级索引,这样就可以减少查询的次数。就比如身份证号一样,先建立一个按地区区分的索引(中国有两千多个县、市),再建立其它索引。如果是后台服务器,它还有多CPU功能,同时可以运行多个任务,还有缓冲区,存放经常使用的数据(首先在缓冲区中查找)
呵,我也不知道我在说什么,我不懂工程学
xhj10 2003-09-30
  • 打赏
  • 举报
回复
建立一个链表
djws 2003-09-29
  • 打赏
  • 举报
回复
试用一下这样的方法,创建一个链表,链表单元中的数据是定长数组。
例,要读x个ID号,创建链表的第一个单元,存放500个ID,读取过程中发现x>500,创第二个单元...
,这样创了((int)x/500)+1个单元,损失的内存空间在500字节以下
定长数组的值根据实际情况选取,但太大的话很难分配如此大的连续空间
aflyinghorse 2003-09-29
  • 打赏
  • 举报
回复
可以用vector
或者楼上map也不错
rtdb 2003-09-29
  • 打赏
  • 举报
回复
用map吧,快又好。
ycbao 2003-09-29
  • 打赏
  • 举报
回复
但ID号的数量是放在数据库中的,是不确定个数的
aflyinghorse 2003-09-29
  • 打赏
  • 举报
回复
用数组会很快,查询是常量时间的随机访问
ycbao 2003-09-29
  • 打赏
  • 举报
回复
to 风雨交加:
请教:如果ID号是很长的,如何建立ID号和地址对应的散列函数?比如18位的身份证号,
将每个身份证号对应的用户信息放入内存。怎样快速根据身份证号定位到存放数据的内存地址。树结构是否可行?请赐教。谢谢
加载更多回复(2)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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