-
Notifications
You must be signed in to change notification settings - Fork 278
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Radix Tree算法效率的问题 #33
Comments
加上ipv6,一共19500个地址段,从次数上看确实是二分法次数少。有两个问题: |
IPv4和 IPv6应该分开处理 对于IPv4
例如
这个存储空间和展开效率应该比现在树的实现更高。
|
IPv6拆成多个32位后,怎么处理更好 |
对于IPv6, 根据CN CIDR的数据
掩码最短是18位,最长是64位。 64位系统js里面一个安全整数的最大值是 2**53 - 1 (52位),因此一个整数无法完整存储这个ipv6前缀 目前想到两种思路:
运行时的数据格式 [
// 192 列
[...,[1097272467968,1097272533504]] //parseInt("ff7a890100000",16),parseInt("ff7a89010FFFF",16)
]
[
[739243944,2416967680,2417033215]
//[parseInt("2c0ff7a8",16),parseInt("90100000",16),parseInt("90100000",16)-1+2**16]
] |
请教一下,这PAC是怎么Debug的? |
用Firefox,工具-浏览器工具-浏览器控制台(不是web控制台)。PAC文件里的alert会出现在这里。 |
最开始是被这个算法吸引的,但是思考之后,似乎不是一个最优的方案。
Radix Tree 的搜索长度基本上对应了子网掩码的位数
对于CN Ipv4 地址区间统计:
也就是说,平均需要 21.6次查询,最少10次,最多31 次。
如果对于7030个区间(有序且d不重叠)采用二分查找,那么最多只有需要13次比较(2^13 = 8192)。
这个最差情况基本上相当于Radix Tree的最好情况了。
数据构建也非常简单,整个数组大数组可直接静态生成。而且查询过程也只需要一次内置函数
convert_addr
进行转换。核心算法的GPT实现
对于IPv6 范围大概是 (12430),二分最多也就14次。
(IPV6 只需要比较64位的,可能需要拆成两个32位数,或者两个块但是算法效果一样)。
The text was updated successfully, but these errors were encountered: