一个算法问题,有点难度。 ( 积分: 200 )

  • 主题发起人 主题发起人 element
  • 开始时间 开始时间
E

element

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:我知道一组IP地址,要最快的在这组地址中查找需要的IP。
1:这组IP地址怎么组织存储,已便于查找
2:由于需要查找的IP来的很快也很多。怎样查找快。
数据不能使用数据库,先谢谢大家咯。
 
问题:我知道一组IP地址,要最快的在这组地址中查找需要的IP。
1:这组IP地址怎么组织存储,已便于查找
2:由于需要查找的IP来的很快也很多。怎样查找快。
数据不能使用数据库,先谢谢大家咯。
 
放在数据库中呀,利用数据库的查找功能呀!够快吧!
 
还有一个比较简单有效的方法是将IP地址放到TStringList变量中,将这个变量的Sorted属性设为true,然后用Find方法查找(二分法,速度很快的).
 

你要找的IP='192.168.123.123'
MyList = TStringList.Create;
if MyList.IndexOf(你要找的IP) <&gt
-1 then
ShowMessage(找到了~~~)


 
1、提高速度无非在算法和组织数据上下功夫。Delphi 提供的类使用起来可能很方便,但实际它的代码展开来不知有多少行,因此想提高速度最好自己写;
2、算法有很多,如二分法、哈西算法就是不错的查找方法;
3、每个 IP 地址对应一个整数,你可以用 inet_addr(PChar(IP)) 将每个 IP 地址转化为整数后存储在数组或链表中,从而使比较字符串变为比较整数,在数据量很大的情况下要快很多;
4、还可以仿造缓存的原理,再开辟一个数组,里面存储访问频繁的 IP 地址在原数组中的位置,一旦有查找任务,先在该缓存中查找,如找不到再到原数组中查找。
5、采用多线程。虽然单 CPU 并不是真正的多线程,但几个人排队买面包总比一个人排队要快一些。
6、一点建议,见笑了。
 
我研究过一个算法,就算一下来几十万 ip 都没问题,只是确定某 ip 是否来过;
非常的超爽快,第尾个和第一个来查都一样的快;

你得再详细说一下你的想法;

是不是网络服务器用啊; 查找需要的IP ???
 
THashString可能可以。
我没用过,你可以看看帮助。
 
用哈希表.........................................[:D]
 
对啊就是网络服务器用的。金卡绣球jk8.com能看看你的代码嘛。
 
"你得再详细说一下你的想法;"

不方便的话请 MailTo: 1#jk8.com ,(把#变@)

俺需要确定一下你的服务器想用这个干吗,
验证用户?
防“超生游击队”?
等等...

最后俺再说的嘞;


 
用TStringList是一个办法,但快慢就不好说了。
如果几万个IP地址查询,主要还是在存入的过程。
 
根据 IP的第1段分成N组 比如
第1段有4大组 218, 220, 168, 161
把这几个数字做成个hash table
然后分别将第1段相同的IP保存到同1个TStringList
查询的时候就是
先取得第1个段 然后hash这个段找到对应的TStringList 然后再 TStringList.indexof(你要找的ip)
 
一点小建意:
不知到你具体是通过什么来查找,如果只是查找一个IP是否存在过那很简单:
根据IP的特点无非是四个整数,
所以用四个长度定长的整型数组分别代表IP的四节数字,
存在过的数组中存放'0' 或 '1'来表示是否存在过;
这样存的时候很快直接根据数组下标定位赋值 '1' ,所有IP的存储速度都一样,
就是定位四次数组并赋值'1';
查找时,也一样,将IP直接分成四个整数,直接分别在四个数组中直接定位
如果有一个数组中存放的不是'1'就是新IP;

所以我这个算法的速度是衡定的,于数据量无关;
不知我的想法是否能符合你的要求。。。。。。
 
后退
顶部