跳轉到

綜合應用案例:搜尋引擎核心演算法(探索版)

本案例以「搜尋引擎開發」為場景,用**核心工程師解決問題的視角**探索演算法設計技巧。你將扮演 SearchX 的工程師,從實際問題出發,逐步發現「為什麼需要這個演算法」。

設計理念:不是「先學演算法,再找應用」,而是「遇到問題 → 需要什麼工具 → 引入演算法」。

與資料結構專題的關係:本專題專注於**演算法設計技巧**(字串、分治、貪心、NP),與資料結構專題互補。


場景背景

你是 SearchX(虛構搜尋引擎公司)的**核心工程師**,負責從爬蟲到排名的全流程。

什麼是搜尋引擎?

**搜尋引擎**的核心任務是:給定用戶的查詢,從數十億網頁中找出最相關的結果。

階段 任務 挑戰
爬蟲 抓取網頁 規模大、去重複
索引 建立倒排索引 儲存壓縮、動態更新
搜尋 字串匹配 速度要快
排名 相關性排序 品質要好
廣告 投放最佳化 收益最大化

本案例中的問題正是搜尋引擎工程師日常會遇到的:怎麼快速匹配字串?怎麼壓縮索引?為什麼有些問題「很難」?

SearchX 系統架構

用戶查詢 "機器學習"
┌───────────────────────────────────────────────────────┐
│                    SearchX 系統                        │
├───────────────────────────────────────────────────────┤
│                                                       │
│   ┌─────────┐    ┌─────────┐    ┌─────────┐          │
│   │  爬蟲   │───▶│  索引   │───▶│  搜尋   │          │
│   │ Crawler │    │ Indexer │    │ Search  │          │
│   └─────────┘    └─────────┘    └────┬────┘          │
│        │              │              │               │
│        ▼              ▼              ▼               │
│   ┌─────────┐    ┌─────────┐    ┌─────────┐          │
│   │重複偵測 │    │  壓縮   │    │字串匹配 │          │
│   │Q2 Rabin │    │Q4 Huffman│   │Q1 KMP   │          │
│   └─────────┘    └─────────┘    └─────────┘          │
│                                                       │
│   ┌─────────────────────────────────────────┐        │
│   │              系統基礎建設                 │        │
│   │  Q3 分治法 │ Q5 平攤分析 │ Q6-8 NP 問題  │        │
│   └─────────────────────────────────────────┘        │
│                                                       │
└───────────────────────────────────────────────────────┘
   搜尋結果

你的日常挑戰

情境 你的問題 對應技術
用戶搜尋關鍵字 「怎麼在網頁中快速找到這個詞?」 KMP 演算法
偵測抄襲內容 「怎麼判斷兩篇文章相似?」 Rabin-Karp
合併爬蟲結果 「多個排序列表怎麼高效合併?」 分治法
壓縮索引檔案 「怎麼用最少空間儲存?」 Huffman 編碼
索引動態更新 「頻繁插入的效能保證?」 平攤分析
查詢太慢 「為什麼這個問題這麼難?」 NP 完備性
廣告投放 「怎麼證明沒有快速解法?」 NP-Complete 證明
伺服器選址 「找不到最佳解,近似解呢?」 近似演算法

目錄

第一部分:字串演算法

第二部分:演算法設計技巧

第三部分:計算複雜度

總結