排序算法实战:Python 用基数排序处理 IP 地址排序
·
基数排序处理 IP 地址排序
IP 地址本质上是 32 位无符号整数(IPv4),通常表示为点分十进制格式(如 192.168.1.1)。基数排序非常适合处理此类固定长度的整数序列,以下是 Python 实现:
算法原理
-
IP 地址转换:将点分十进制转换为 32 位整数 $$ \text{IP_int} = a \times 256^3 + b \times 256^2 + c \times 256 + d $$ 其中 $a.b.c.d$ 是 IP 的四段
-
基数排序:从最低有效位到最高有效位(LSD)依次排序
- 创建 256 个桶(对应 8 位二进制)
- 按当前位数字分配到桶中
- 按桶顺序收集元素
- 重复处理所有 4 个字节(32 位)
Python 实现
def radix_sort_ips(ip_list):
# 将IP转换为整数元组 (192, 168, 1, 1)
ips = [tuple(map(int, ip.split('.'))) for ip in ip_list]
# 从最低位(第4段)到最高位(第1段)排序
for i in range(3, -1, -1):
buckets = [[] for _ in range(256)]
# 按当前字节分配到桶
for ip in ips:
buckets[ip[i]].append(ip)
# 收集桶中元素
ips = [ip for bucket in buckets for ip in bucket]
# 转换回IP字符串
return ['.'.join(map(str, ip)) for ip in ips]
# 测试示例
ip_addresses = ["192.168.1.5", "10.0.0.2", "172.16.0.1", "10.0.0.1"]
sorted_ips = radix_sort_ips(ip_addresses)
print(sorted_ips) # 输出: ['10.0.0.1', '10.0.0.2', '172.16.0.1', '192.168.1.5']
算法分析
- 时间复杂度:$O(4n) = O(n)$
- 4 轮排序(对应 4 个字节)
- 每轮 $O(n)$ 的分配和收集操作
- 空间复杂度:$O(n)$(桶的临时存储)
- 稳定性:基数排序是稳定排序,保持相同前缀 IP 的顺序
优化方向
- 整数优化:直接转换为 32 位整数处理
ip_int = (a << 24) | (b << 16) | (c << 8) | d - 并行处理:对海量 IP 可使用多线程分桶
- 内存优化:对超大数据集使用外部排序
基数排序在 IP 排序场景下效率显著优于 $O(n\log n)$ 的通用排序算法,特别适合网络设备日志分析、安全审计等需要处理海量 IP 的场景。
更多推荐
所有评论(0)