加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi:TStringList中的搜索字符串

发布时间:2020-12-15 09:39:10 所属栏目:大数据 来源:网络整理
导读:我有一个大的txt(ipaddress.txt),有很多行,每行是一个IP地址,例如: 44.XXX.XXX.XXX45.XXX.XXX.XXX46.XXX.XXX.XXX47.XXX.XXX.XXX48.XXX.XXX.XXX 我在TStringList中加载此列表,例如: FIpAddressList := TStringList.Create();FIpAddressList.Sorted := true;
我有一个大的txt(ipaddress.txt),有很多行,每行是一个IP地址,例如:

44.XXX.XXX.XXX
45.XXX.XXX.XXX
46.XXX.XXX.XXX
47.XXX.XXX.XXX
48.XXX.XXX.XXX

我在TStringList中加载此列表,例如:

FIpAddressList := TStringList.Create();
FIpAddressList.Sorted := true;
FIpAddressList.LoadFromFile('ipaddress.txt');

我想检查列表中是否有IP地址,例如:

function IsIPinList(const IPAddress : string): Boolean;
begin
   Result := (FIpAddressList.IndexOf(IPAddress) <> -1);
end;

它的工作原理……但是TStringList很大.

有没有办法让这个过程更快?

UPDATE

>该列表是静态的,每月更新,少于或多于5’000行.
>在服务器上的每个请求上调用该函数(例如,每秒5次).
>仅在服务器服务启动时加载列表.

解决方法

使这更快的一种方法是安排对列表进行排序,以便可以使用二进制搜索O(log n)而不是线性搜索O(n)来执行搜索.

如果列表是静态的,那么最好的办法是在程序外部对列表进行排序,以便您可以对其进行一次排序.

如果列表更具动态性,那么您必须对其进行排序,并保持所有修改顺序.在这种情况下,如果您进行的搜索次数足以克服排序和维护订单的额外成本,则对列表进行排序只会带来好处.

另一种方法是使用包含您的项目的字典.通常,这将涉及散列每个字符串.虽然查找复杂度为O(n),但散列的成本可能很高.

另一种加快速度的方法是将IP地址字符串转换为32位整数.事实上,这肯定会带来巨大的性能优势,无论出于何种其他问题,您都应该这样做.使用32位整数比使用IP地址的字符串表示更快更清晰.

这些只是一些可能的方法,还有更多.选择哪一项在很大程度上取决于使用权衡.

虽然您可能只是在寻找一些代码来解决您的问题,但我认为这个问题比基于代码的算法更具算法性.在选择算法之前,您需要更好地理解要求,数据大小限制等.一旦确定了算法,或将选择范围缩小到较小的数字进行比较,实现应该是直截了当的.

另一种可能是你误诊了你的问题.即使对作为字符串存储的5000个IP地址列表进行线性搜索,也应该比报告的更快:

>我的电脑可以使用线性搜索每秒搜索这样的列表2000次.
>一旦对列表进行排序并切换到二进制搜索,它就可以每秒管理1,000,000次搜索.
>切换到存储有序的整数数组,每秒可实现超过10,000次搜索.
>使用基于散列的整数字典可以再次提高两倍的性能.

因此,您的搜索性能可以轻松提高20,000倍,我仍然不认为您的性能问题低于您的信念.我想知道你每次搜索时是否正在从磁盘读取文件的真正问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读