目录
一、背景介绍
二、环境准备与算法思路
三、核心实现步骤
四、案例实现演示
五、注意事项与原创声明
六、总结
一、背景介绍
测试开发面试题经常问到:如何进行ip地址的排序,这里分享用简单的算法思想,实现对ip地址进行排序。
二、环境准备与算法思路
-
Python 3.6+
-
将ip地址使用.进行分割,分别获取4段ip地址的数字值,使用int函数转换为整数类型,然后通过每一段数字的位移分别获取一个32位的2进制数,再将4段二进制数求和。
例如:IP: 192.168.1.1
第1段(192):左移24位 192 * (2^24)
第2段(168):左移16位 168 * (2^16)
第3段(1): 左移8位 1 * (2^8)
第4段(1): 不移位 1 * (2^0)192.168.1.1 的二进制表示:
192 = 11000000
168 = 10101000
1 = 00000001
1 = 00000001位移后:
192 << 24: 11000000 00000000 00000000 00000000
168 << 16: 00000000 10101000 00000000 00000000
1 << 8: 00000000 00000000 00000001 00000000
1: 00000000 00000000 00000000 00000001相加后:
1、11000000 10101000 00000001 00000001 (32位)
2、转换后可以直接使用数值比较
3、利用Python的sorted()函数
4、使用key参数自定义排序规则
三、核心实现步骤
1.思路:
(1)第一步将ip地址去.号,分割每一部分存储到list中
(2)第二步将分割后的list进行位移运算,再相加得到一个整数
(3)第三步将得到整数直接进行排序,使用sorted()函数
# 将IP地址转换int类型整数,便于比较和排序
def ip_to_int(ip):
parts = ip.split('.')
return (int(parts[0]) << 24) + \
(int(parts[1]) << 16) + \
(int(parts[2]) << 8) +\
int(parts[3])
# 对IP列表进行排序
def sort_ip_address(ip_list):
return sorted(ip_list,key=ip_to_int)
# 主函数main
def main():
ips = {
"192.168.1.1",
"10.0.0.1",
"172.16.0.1",
"8.8.8.8"
}
sorted_ips = sort_ip_address(ips)
print("排序后ip地址")
for ip in sorted_ips:
print(ip)
if __name__ == "__main__":
main()
四、案例实现演示
- 排序后ip地址
排序后ip地址
8.8.8.8
10.0.0.1
172.16.0.1
192.168.1.1
五、注意事项与原创声明
复杂度分析:
1.时间复杂度:
(1)转换IP:O(1)
(2)排序:O(n log n)(Python使用Timsort算法)
(3)总体时间复杂度:O(n log n)
2.空间复杂度:
(1)转换IP:O(1)
(2)排序:O(n)
(3)总体空间复杂度:O(n)
注意事项:
(1)假设IP地址格式合法
(2)适用于IPv4地址
(3)不处理特殊IP格式
六、总结
1.技术优点:
(1)转换方法高效
(2)代码简洁清晰
(3)利用Python内置排序
2.学习价值:
(1)IP地址转整数的高效实现
(2)利用Python内置排序的灵活性
(3)函数式编程思想
(4)排序的键函数设计
(5)代码可维护性
(6)IP地址的底层表示
3.扩展方向:
(1)支持IPv6地址
(2)异常处理与输入验证
(3)性能优化