1. 查找算法入门从生活场景到代码实现第一次接触查找算法时我盯着课本上的二分查找代码看了整整一个下午也没想明白它为什么能工作。直到有天在图书馆找书无意间用到了这个算法——书架上的书按编号排列我要找TP311.5开头的书直接从中间翻开发现是TP287那就往后半部分继续找。这不就是二分查找吗顺序查找就像在未整理的书架上找书只能一本本翻看。用代码实现是这样的def linear_search(arr, target): for i in range(len(arr)): if arr[i] target: return i return -1当数据量达到10万级别时顺序查找平均需要5万次比较而二分查找最多只需要17次因为2^17131072。这就是算法效率的差距。2. 二分查找的实战技巧与易错点在头歌平台刷题时我提交的第一个二分查找版本总是报错。后来发现是边界条件没处理好——当查找元素不存在时代码会陷入死循环。正确的写法应该注意三个关键点循环条件用while left right而非while left right中间值计算用mid left (right - left) // 2防止整数溢出左右边界更新要1/-1避免死循环def binary_search(arr, target): left, right 0, len(arr) - 1 while left right: mid left (right - left) // 2 if arr[mid] target: return mid elif arr[mid] target: left mid 1 else: right mid - 1 return -1在LeetCode第35题搜索插入位置中这种标准写法需要稍作修改。当target不存在时返回的应该是left指针位置因为这正好是应该插入的位置。3. 二叉排序树动态数据集的查找利器实际项目中数据往往是动态变化的。上周开发一个学生成绩管理系统时我就用到了二叉排序树BST。与数组不同BST的插入和查找时间复杂度都是O(logn)非常适合频繁更新的场景。BST的核心性质是左子树所有节点值 根节点值右子树所有节点值 根节点值左右子树也都是BSTclass TreeNode: def __init__(self, val): self.val val self.left None self.right None def insert(root, val): if not root: return TreeNode(val) if val root.val: root.left insert(root.left, val) else: root.right insert(root.right, val) return root但BST有个致命缺陷当插入有序数据时会退化成链表。这时查找效率降为O(n)就像在一条长走廊里逐个房间找人。4. 平衡二叉树与哈希表的工程选择去年优化一个电商平台的商品搜索时我在AVL树和哈希表间纠结了很久。最终方案是商品ID查询用哈希表O(1)时间复杂度价格区间筛选用红黑树基于TreeMap实现AVL树通过旋转保持平衡确保树高度差不超过1。虽然插入/删除需要额外维护平衡但查询效率稳定在O(logn)。它的旋转操作很有意思就像玩魔方时的特定手法def left_rotate(z): y z.right T2 y.left y.left z z.right T2 return y而哈希表适合精确查找。Python的字典就是用开放寻址法实现的。处理冲突时好的哈希函数能让数据均匀分布。比如用质数取模def hash_func(key, size): return key % 1543 # 大于1000的质数在内存有限的嵌入式设备上我更喜欢用布隆过滤器。它用多个哈希函数和位数组实现虽然有一定误判率但能极大节省空间。