{"name":"查找","id":"算法与数据结构-查找","content":"# 查找（Search）\n\n## 一、查找的第一性原理\n\n**查找的本质不是“比较”，而是：**\n\n> **在给定约束条件下，用尽可能低的成本，缩小目标的不确定性空间。**\n\n所有查找结构，本质上都在回答三个问题：\n\n1. **不确定性如何被缩小？**\n2. **缩小的代价是什么？**\n3. **这种代价是否可以被接受？**\n\n因此，查找问题的核心权衡只有四个维度：\n\n* **时间成本**（CPU / IO / 延迟）\n* **空间成本**（内存 / 存储冗余）\n* **正确性要求**（精确 or 概率）\n* **数据约束**（是否有序、是否静态、是否可随机访问）\n\n---\n\n## 二、查找问题的整体知识结构\n\n```\n查找（Search）问题体系\n├── 一、确定性查找（精确定位）\n│   ├── 顺序查找（无结构）\n│   ├── 二分查找（有序 + 随机访问）\n│\n├── 二、空间换时间的直接映射\n│   ├── Bitmap\n│   ├── Hash 映射\n│\n├── 三、概率型存在性查找\n│   ├── 布隆过滤器\n│   ├── 布谷鸟过滤器\n│\n├── 四、时间维度上的查找（调度索引）\n│   ├── 单层时间轮\n│   ├── 分层时间轮\n│\n└── 五、工程级抽象：索引\n    ├── 索引的本质\n    ├── 选型约束与权衡\n```\n\n---\n\n## 三、确定性查找：用结构消除不确定性\n\n### 1. 顺序查找（Linear Search）\n\n**本质原理**\n\n* 无任何先验结构\n* 每比较一次，只能排除一个候选项\n\n**不确定性收敛速度**\n\n* 线性下降\n* 时间复杂度：`O(n)`\n\n```c\nint seq_search(int array[], int n, int key)\n{\n    for(int i = 0; i < n; i++)\n    {\n        if(key == array[i])\n            return i;\n    }\n    return -1;\n}\n```\n\n**工程哲学**\n\n* 顺序查找并不“低级”，它是：\n\n  * 数据规模很小\n  * 或查找次数极低\n    时最稳健的选择\n\n---\n\n### 2. 二分查找（Binary Search）\n\n**本质原理**\n\n> 二分查找不是“技巧”，而是**利用全序关系进行信息熵减半**。\n\n每一次比较，都会排除 **一半的可能性空间**。\n\n![二分查找](/assets/屏幕截图%202022-07-09%20134232.png)\n\n```java\nint l = 0, r = a.length - 1;\nwhile (l <= r) {\n    int mid = l + (r - l) / 2;\n    if (a[mid].equals(target)) {\n        return mid;\n    }\n    if (less(target, a[mid])) {\n        r = mid - 1;\n    } else {\n        l = mid + 1;\n    }\n}\nreturn -1;\n```\n\n**隐含约束（本质代价）**\n\n* 数据必须有序\n* 必须支持随机访问\n* 通常依赖连续内存\n\n**工程迁移能力**\n\n> 二分查找是一种**问题拆解思维**：\n> 不仅用于数据查找，也用于：\n\n* Bug 定位\n* 系统分层排查\n* 性能瓶颈收敛\n\n---\n\n## 四、空间换时间：用存储消除计算\n\n### 1. Bitmap（位图）\n\n**本质原理**\n\n> 用空间换取 O(1) 的存在性判断。\n\n* 数据值 → 数组下标\n* 是否存在 → 位是否为 1\n\n```js\n1存在 => 010000\n2存在 => 001000\n1,2都存在 => 011000\n```\n\n**本质代价**\n\n* 空间与值域强相关\n* 适用于：\n\n  * ID 连续\n  * 值域有限\n  * 强存在性判断\n\n---\n\n## 五、概率型查找：允许错误以换取极致效率\n\n### 1. 布隆过滤器（Bloom Filter）\n\n![布隆过滤器](/assets/2022712144645.webp)\n\n**本质原理**\n\n> 用**多重哈希 + 位图**判断“是否可能存在”。\n\n* 查询结果只有两种：\n\n  * 一定不存在\n  * 可能存在\n\n**关键权衡**\n\n* 不支持精确删除\n* 存在误判（假阳性）\n* 但：\n\n  * 查询极快\n  * 空间极省\n\n**工程哲学**\n\n> 布隆过滤器的真正价值在于：\n> **提前否定不可能发生的请求**。\n\n---\n\n### 2. 布谷鸟过滤器（Cuckoo Filter）\n\n![2022817204730](/assets/2022817204730.jpg)\n\n**本质原理**\n\n* 基于布谷鸟哈希\n* 存储的是 key 的 **指纹（fingerprint）**\n* 每个 key 有两个候选桶\n\n**相比布隆过滤器的演进**\n\n* 支持删除\n* 减少假阳性\n* 引入：\n\n  * 误删风险\n  * 桶溢出复杂度\n\n---\n\n## 六、时间维度的查找：时间轮\n\n> 时间轮本质不是“定时器”，而是\n> **在时间轴上建立索引结构**。\n\n### 1. 单层时间轮（Round）\n\n![2022616155327](/assets/2022616155327.png)\n\n**本质思想**\n\n* 时间被离散化为 slot\n* 当前时间 → 指针位置\n* 任务 → 未来 slot\n\n**round 的意义**\n\n> 用“圈数”表示未来的距离，\n> 将无限时间映射为有限结构。\n\n---\n\n### 2. 分层时间轮\n\n![2022616155817](/assets/2022616155817.png)\n\n**本质演进**\n\n* 单层时间轮无法覆盖大时间跨度\n* 通过 **时间分层**（小时 → 分钟 → 秒）：\n\n  * 降低单层轮盘规模\n  * 保持调度精度\n\n**本质类比**\n\n> 分层时间轮 ≈\n> **时间维度上的 B+ 树**\n\n---\n\n## 七、工程级抽象：索引（Index）\n\n### 1. 索引的本质\n\n> 索引不是数据结构，\n> 而是 **“查找约束下的组织方式”**。\n\n### 2. 功能性约束\n\n* 数据形态：结构化 / 非结构化\n* 数据变化：静态 / 动态\n* 查询类型：单值 / 区间 / 组合\n* 存储介质：内存 / 磁盘\n\n### 3. 非功能性约束\n\n* 空间消耗\n* 维护成本\n* 更新代价\n* 并发与一致性\n\n### 4. 常见索引结构（按思想分类）\n\n| 思想 | 结构         |\n| -- | ---------- |\n| 映射 | Hash       |\n| 有序 | 红黑树 / B+ 树 |\n| 跳跃 | 跳表         |\n| 否定 | 布隆过滤器      |\n\n---\n\n## 八、查找结构的演进总览\n\n```\n线性扫描\n→ 有序结构（二分 / 树）\n→ 映射定位（Hash / Bitmap）\n→ 概率容错（Bloom / Cuckoo）\n→ 维度扩展（时间轮）\n→ 系统级索引\n```\n\n---\n\n## 九、总结：查找不是算法，而是认知方式\n\n> **所有查找结构，都是对\"不确定性\"的不同妥协方式。**\n\n* 二分查找：牺牲顺序自由，换取对数时间\n* Bitmap：牺牲空间，换取常数时间\n* 布隆过滤器：牺牲准确性，换取吞吐\n* 时间轮：牺牲精度，换取规模\n\n## 关联内容（自动生成）\n\n- [/算法与数据结构/散列表.md](/算法与数据结构/散列表.md) 哈希查找与散列表是实现O(1)查找的重要数据结构，与查找算法中的哈希映射部分密切相关\n- [/算法与数据结构/排序.md](/算法与数据结构/排序.md) 排序与查找密切相关，有序数据是二分查找等高效算法的前提条件\n- [/中间件/数据库/索引.md](/中间件/数据库/索引.md) 数据库索引是查找算法在工程实践中的重要应用，包括B+树、哈希索引等\n- [/数据技术/检索技术.md](/数据技术/检索技术.md) 检索技术是查找算法在大数据领域的扩展应用，包括倒排索引、哈希检索等\n- [/中间件/数据库/ElasticSearch.md](/中间件/数据库/ElasticSearch.md) 搜索引擎中的查找技术，体现了查找算法在分布式系统中的实际应用\n- [/中间件/数据库/redis/数据结构.md](/中间件/数据库/redis/数据结构.md) Redis中的数据结构和查找实现，特别是Hash数据结构的查找优化\n- [/算法与数据结构/树.md](/算法与数据结构/树.md) 二叉查找树等树形结构是实现高效查找的重要数据结构\n- [/中间件/数据库/数据库优化.md](/中间件/数据库/数据库优化.md) 数据库优化与查找算法密切相关，特别是索引优化和查询优化\n- [/计算机网络/http/爬虫/爬虫.md](/计算机网络/http/爬虫/爬虫.md) 爬虫系统中的URL去重等技术使用了布隆过滤器等查找算法\n","metadata":"tags: ['算法', '数据结构', '数据结构与算法']","hasMoreCommit":true,"totalCommits":16,"commitList":[{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2026-01-08T11:52:55+08:00","author":"MY","message":"doc(java-collections): 重构文档","hash":"e0203004013ac1a831e58f218e6acaca027ed080"},{"date":"2025-12-29T14:42:58+08:00","author":"MY","message":"docs(算法与数据结构): 重构查找算法文档，完善理论体系和工程实践","hash":"16681a459a3d1b51233c08f5dd40426f97b1df3e"},{"date":"2024-02-27T20:07:27+08:00","author":"MY","message":"✏算法","hash":"8a6529c0b37f98855cb1857f560564cc6401fd7b"},{"date":"2024-02-22T19:29:07+08:00","author":"MY","message":"📦算法与数据结构","hash":"a43c1f5ba155151373c1c4acad9c95803f6ca65a"},{"date":"2024-02-21T19:16:03+08:00","author":"MY","message":"✏查找","hash":"31129e7113453bdc123670f04658b145a3927aea"},{"date":"2024-02-20T19:15:31+08:00","author":"MY","message":"✏查找","hash":"03ecf112bbc77ebde7f8d3b54d923f5a82cff6fc"},{"date":"2023-03-09T09:41:00+00:00","author":"My","message":"🛠替换在线图片","hash":"0c8b08bc22fbe482ba02da2f1fcad211441d3c23"},{"date":"2022-07-13T14:09:29+08:00","author":"cjiping","message":"✏️更新 定时算法","hash":"9e2f23d2d92e2e8257b36b252f33c3674d3e8889"},{"date":"2022-07-09T15:26:49+08:00","author":"MY","message":"✏️更新 算法","hash":"2d8ca900074aa66c48b668e03cc082547eae7449"}],"createTime":"2019-12-02T21:11:00+08:00"}