別再搞混檢索和搜索!一文講透技術(shù)演進(jìn)與架構(gòu)邏輯
或許 99% 的開(kāi)發(fā)者不會(huì)深度參與全網(wǎng)搜索引擎的搭建,但幾乎每個(gè)人都在業(yè)務(wù)中實(shí)現(xiàn)過(guò) “檢索” 功能 —— 小到查詢后臺(tái)的一條訂單記錄,大到篩選電商平臺(tái)的千萬(wàn)級(jí)商品數(shù)據(jù)?!皺z索” 與 “搜索” 僅一字之差,背后卻藏著從簡(jiǎn)單查詢到復(fù)雜系統(tǒng)的技術(shù)躍遷。本文將從業(yè)務(wù)需求出發(fā),拆解搜索與檢索的核心技術(shù)、架構(gòu)設(shè)計(jì),以及不同階段的解決方案,讓復(fù)雜邏輯變得清晰可感。
一、從 “做個(gè)谷歌” 說(shuō)起:全網(wǎng)搜索引擎的核心架構(gòu)
曾有人提出需求:“想做一個(gè)全網(wǎng)搜索引擎,和谷歌類(lèi)似就行,兩個(gè)月能上線嗎?” 看似簡(jiǎn)單的訴求,背后卻是一套涉及數(shù)據(jù)抓取、索引構(gòu)建、結(jié)果排序的復(fù)雜系統(tǒng)。要理解其難度,首先得拆解全網(wǎng)搜索引擎的宏觀架構(gòu)與核心流程。
1. 三大核心子系統(tǒng):支撐 “從網(wǎng)頁(yè)到結(jié)果” 的全鏈路
全網(wǎng)搜索引擎的核心能力由三個(gè)子系統(tǒng)協(xié)同實(shí)現(xiàn)(對(duì)應(yīng)架構(gòu)中粉色模塊),缺一不可:
- Spider 爬蟲(chóng)系統(tǒng)相當(dāng)于搜索引擎的 “觸角”,負(fù)責(zé)主動(dòng)遍歷互聯(lián)網(wǎng)上的網(wǎng)頁(yè)。它需要智能判斷 URL 優(yōu)先級(jí)(如資訊類(lèi)網(wǎng)頁(yè)更新快,優(yōu)先抓?。?,應(yīng)對(duì)不同網(wǎng)站的反爬策略(如驗(yàn)證碼、IP 限制),還要處理網(wǎng)頁(yè)編碼異常、死鏈等問(wèn)題,是數(shù)據(jù) “入口” 的關(guān)鍵。
- Search&Index 索引系統(tǒng) 分為 “建索引” 和 “查索引” 兩大功能,是搜索引擎的 “中樞”。
Build_index將 Spider 抓取的網(wǎng)頁(yè)內(nèi)容加工處理 —— 先做分詞(如 “人工智能發(fā)展趨勢(shì)” 拆分為 “人工智能”“發(fā)展”“趨勢(shì)”),再構(gòu)建正排索引和倒排索引,把雜亂的網(wǎng)頁(yè)轉(zhuǎn)化為可快速查詢的結(jié)構(gòu)化數(shù)據(jù);
Search_index接收用戶的搜索詞,通過(guò)索引快速定位匹配的網(wǎng)頁(yè),完成 “初步篩選”。
- Rank 打分排序系統(tǒng)決定用戶最終看到的結(jié)果順序。它會(huì)結(jié)合網(wǎng)頁(yè)相關(guān)性(如搜索詞在標(biāo)題中出現(xiàn)比在正文出現(xiàn)權(quán)重高)、網(wǎng)頁(yè)權(quán)威性(如政府官網(wǎng)比個(gè)人博客權(quán)重高)、用戶行為(如點(diǎn)擊量、停留時(shí)間)等上百個(gè)維度計(jì)算得分,是 “搜索體驗(yàn)優(yōu)劣” 的核心,也是谷歌、百度等引擎體驗(yàn)差異的關(guān)鍵。
2. 兩大核心數(shù)據(jù):連接 “抓取” 與 “檢索” 的橋梁
系統(tǒng)的運(yùn)轉(zhuǎn)依賴兩類(lèi)核心數(shù)據(jù):
- Web 網(wǎng)頁(yè)庫(kù)存儲(chǔ) Spider 抓取的原始網(wǎng)頁(yè)數(shù)據(jù),相當(dāng)于 “數(shù)據(jù)倉(cāng)庫(kù)”。由于要容納千億級(jí)網(wǎng)頁(yè),它必須是分布式存儲(chǔ)系統(tǒng)(如 HDFS),且需支持高容錯(cuò)(避免單節(jié)點(diǎn)故障丟失數(shù)據(jù))和動(dòng)態(tài)擴(kuò)容(隨網(wǎng)頁(yè)量增長(zhǎng)增加節(jié)點(diǎn))。
- Index 索引數(shù)據(jù)即Build_index生成的正排索引和倒排索引,是 “快速查詢的鑰匙”。它的設(shè)計(jì)直接決定檢索速度 —— 好的索引結(jié)構(gòu)能讓 “從搜索詞到網(wǎng)頁(yè)” 的查詢耗時(shí)控制在毫秒級(jí)。
3. 核心邏輯:“寫(xiě)入” 與 “檢索” 分離
全網(wǎng)搜索引擎的業(yè)務(wù)特性,決定了它必須是 “寫(xiě)入” 和 “檢索” 分離的系統(tǒng):
全網(wǎng)搜索引擎的業(yè)務(wù)特性,決定了它必須是 “寫(xiě)入” 和 “檢索” 分離的系統(tǒng):
- 寫(xiě)入流程(數(shù)據(jù)進(jìn)入系統(tǒng)):由 Spider 和 Search&Index 協(xié)同完成。
Spider 根據(jù) URL 隊(duì)列,批量抓取互聯(lián)網(wǎng)網(wǎng)頁(yè);
將網(wǎng)頁(yè)內(nèi)容(含 HTML、圖片鏈接等)存儲(chǔ)到 Web 網(wǎng)頁(yè)庫(kù);
Build_index從網(wǎng)頁(yè)庫(kù)讀取數(shù)據(jù),清洗無(wú)效內(nèi)容(如廣告代碼)后分詞;
生成正排索引和倒排索引,存入 Index 索引數(shù)據(jù)中。這個(gè)過(guò)程是 “離線 + 異步” 的 —— 網(wǎng)頁(yè)抓取后不會(huì)立刻進(jìn)入索引,需經(jīng)過(guò)處理和構(gòu)建,保證索引的完整性和高效性。
- 檢索流程(用戶獲取結(jié)果):由 Search&Index 和 Rank 協(xié)同完成。
用戶輸入搜索詞(如 “2024 新能源汽車(chē)銷(xiāo)量”),Search_index先對(duì)搜索詞分詞;
通過(guò)倒排索引查詢匹配的網(wǎng)頁(yè)(初篩結(jié)果);
Rank 對(duì)初篩結(jié)果按得分排序,過(guò)濾低質(zhì)量網(wǎng)頁(yè)(如惡意跳轉(zhuǎn)頁(yè));
返回排序后的 Top 結(jié)果(如首頁(yè) 10 條)。這個(gè)過(guò)程是 “實(shí)時(shí) + 同步” 的 —— 用戶等待時(shí)間需控制在 1-3 秒內(nèi),否則會(huì)直接放棄搜索。
二、檢索的基石:正排索引與倒排索引
無(wú)論是全網(wǎng)搜索還是業(yè)務(wù)中的簡(jiǎn)單檢索,核心都依賴 “正排索引” 和 “倒排索引” 這兩種數(shù)據(jù)結(jié)構(gòu)。理解它們,就掌握了 “快速查詢” 的關(guān)鍵。
1. 正排索引:從 “key” 找 “內(nèi)容”
正排索引的邏輯很簡(jiǎn)單:通過(guò)唯一標(biāo)識(shí)(key)快速查詢對(duì)應(yīng)的實(shí)體內(nèi)容,類(lèi)似我們用手機(jī)號(hào)查聯(lián)系人信息。
- 舉例 1:訂單表t_order(order_id, user_id, amount, status),通過(guò)order_id=10086查詢到user_id=123,amount=999,status=已支付,就是正排索引查詢;
- 舉例 2:商品庫(kù)t_goods(goods_id, name, price, category),通過(guò)goods_id=567查詢到name=無(wú)線耳機(jī),price=299,category=數(shù)碼,也是正排索引查詢。
在搜索場(chǎng)景中,網(wǎng)頁(yè)內(nèi)容會(huì)先分詞,此時(shí)正排索引可理解為Map<url_id, List<分詞項(xiàng)>>—— 比如url_id=2001對(duì)應(yīng)分詞["人工智能", "發(fā)展", "趨勢(shì)"],能通過(guò)url_id快速定位網(wǎng)頁(yè)的分詞結(jié)果,時(shí)間復(fù)雜度接近 O (1)。
2. 倒排索引:從 “內(nèi)容” 找 “key”
倒排索引與正排索引相反:通過(guò) “內(nèi)容片段(如分詞項(xiàng))” 快速查詢對(duì)應(yīng)的唯一標(biāo)識(shí)(key),是搜索的核心。它的結(jié)構(gòu)可理解為Map<分詞項(xiàng), List<url_id>>—— 比如分詞 “人工智能” 對(duì)應(yīng)[2001, 2003, 2005],表示url_id=2001“2003”“2005” 的網(wǎng)頁(yè)都包含 “人工智能” 這個(gè)詞。
舉個(gè)具體例子理解:
假設(shè)有 3 個(gè)網(wǎng)頁(yè),正排索引(分詞后)如下:
- url_id=2001 → 內(nèi)容 “人工智能發(fā)展趨勢(shì)” → 分詞["人工智能", "發(fā)展", "趨勢(shì)"]
- url_id=2002 → 內(nèi)容 “人工智能應(yīng)用場(chǎng)景” → 分詞["人工智能", "應(yīng)用", "場(chǎng)景"]
- url_id=2003 → 內(nèi)容 “應(yīng)用場(chǎng)景分析” → 分詞["應(yīng)用", "場(chǎng)景", "分析"]
對(duì)應(yīng)的倒排索引就是:
- “人工智能” → [2001, 2002]
- “發(fā)展” → [2001]
- “趨勢(shì)” → [2001]
- “應(yīng)用” → [2002, 2003]
- “場(chǎng)景” → [2002, 2003]
- “分析” → [2003]
當(dāng)用戶搜索 “人工智能應(yīng)用” 時(shí),系統(tǒng)先分詞為["人工智能", "應(yīng)用"],再通過(guò)倒排索引找到兩個(gè)分詞對(duì)應(yīng)的url_id列表,最后求交集[2002]—— 這就是 “初篩結(jié)果” 的由來(lái)。
3. 關(guān)鍵優(yōu)化:有序集合求交集的 5 種方法
檢索的核心步驟 “求分詞結(jié)果的交集”,其效率直接影響搜索速度。由于倒排索引的List<url_id>會(huì)提前排序(便于優(yōu)化),我們可以通過(guò)不同方法提升交集效率:

以跳表為例:若url_id列表是[101,102,103,104,201,202,301,302],可建立一級(jí)索引[101,201,301]。查詢 “201” 時(shí),無(wú)需遍歷前 4 個(gè)元素,直接通過(guò)索引跳到 201,效率大幅提升 —— 這也是谷歌、百度等主流搜索引擎的核心優(yōu)化手段。
三、業(yè)務(wù)檢索的 4 個(gè)階段:從簡(jiǎn)單到復(fù)雜的演進(jìn)
并非所有檢索需求都需要 “全網(wǎng)搜索” 級(jí)別的架構(gòu)。隨著數(shù)據(jù)量、并發(fā)量的增長(zhǎng),業(yè)務(wù)檢索會(huì)經(jīng)歷 4 個(gè)階段,每個(gè)階段對(duì)應(yīng)不同的技術(shù)方案。
1. 原始階段:用 SQL 的 LIKE 實(shí)現(xiàn)(創(chuàng)業(yè)初期)
核心邏輯:直接用數(shù)據(jù)庫(kù)的LIKE語(yǔ)句匹配內(nèi)容,無(wú)需額外開(kāi)發(fā)。比如查詢標(biāo)題包含 “無(wú)線耳機(jī)” 的商品:
SELECT goods_id FROM t_goods WHERE name LIKE '%無(wú)線耳機(jī)%'優(yōu)點(diǎn):零開(kāi)發(fā)成本,10 分鐘就能上線;
缺點(diǎn):全表掃描,數(shù)據(jù)量超 10 萬(wàn)就會(huì)卡頓(如查詢耗時(shí)從 0.1 秒增至 5 秒以上);不支持分詞(如搜 “無(wú)線耳機(jī)降噪” 無(wú)法匹配 “降噪無(wú)線耳機(jī)”)。適用場(chǎng)景:創(chuàng)業(yè)初期,數(shù)據(jù)量 < 10 萬(wàn),并發(fā)量 < 100 的業(yè)務(wù)驗(yàn)證場(chǎng)景(如小電商試運(yùn)營(yíng))。
2. 初級(jí)階段:數(shù)據(jù)庫(kù)全文索引(數(shù)據(jù)量百萬(wàn)級(jí))
核心邏輯:利用數(shù)據(jù)庫(kù)的全文索引特性,替代LIKE,支持分詞和快速查詢。
比如 MySQL 中創(chuàng)建商品標(biāo)題的全文索引:
ALTER TABLE t_goods ADD FULLTEXT INDEX idx_goods_name (name);
-- 查詢時(shí)用MATCH AGAINST實(shí)現(xiàn)分詞檢索
SELECT goods_id FROM t_goods WHERE MATCH(name) AGAINST ('無(wú)線耳機(jī)降噪');優(yōu)點(diǎn):支持分詞,效率比LIKE高 50-100 倍(百萬(wàn)數(shù)據(jù)查詢耗時(shí)從 10 秒降至 0.1 秒);無(wú)需引入外部系統(tǒng),運(yùn)維成本低;
缺點(diǎn):僅支持 MyISAM 引擎(InnoDB 需 MySQL 5.6+);檢索與 CURD 耦合(如大促期間下單量高,會(huì)導(dǎo)致檢索卡頓);數(shù)據(jù)量超百萬(wàn)后性能驟降,難以水平擴(kuò)展。
適用場(chǎng)景:數(shù)據(jù)量 10 萬(wàn) - 100 萬(wàn),并發(fā)量 100-500 的成長(zhǎng)型業(yè)務(wù)(如區(qū)域型電商)。
3. 中級(jí)階段:開(kāi)源外置索引(數(shù)據(jù)量千萬(wàn) - 10 億級(jí))
核心邏輯:將 “檢索” 與 “存儲(chǔ)” 分離 —— 原始數(shù)據(jù)存在數(shù)據(jù)庫(kù)(負(fù)責(zé) CURD),檢索用外置索引系統(tǒng)(負(fù)責(zé)分詞、查詢),通過(guò) “雙寫(xiě)”“定時(shí)同步” 保證數(shù)據(jù)一致性。主流方案是ElasticSearch(ES),它基于 Lucene 內(nèi)核,封裝了高可用、負(fù)載均衡能力,提供 RESTful 接口,開(kāi)箱即用。ES 的優(yōu)勢(shì):
- 支持 10 億級(jí)數(shù)據(jù)存儲(chǔ),并發(fā)量可達(dá) 5000+(壓測(cè)場(chǎng)景下,單集群支持每秒 5000 次查詢);
- 天然支持集群,水平擴(kuò)展簡(jiǎn)單(新增節(jié)點(diǎn)即可擴(kuò)容,無(wú)需修改代碼);
- 豐富的插件生態(tài)(如ik_smart中文分詞插件、geo_point地理位置插件),滿足個(gè)性化需求(如 “附近的咖啡店” 檢索)。
- 實(shí)際案例:某生鮮平臺(tái)用 ES 支撐 “商品檢索”(5 億級(jí)數(shù)據(jù))和 “訂單日志查詢”(3 億級(jí)數(shù)據(jù)),日常并發(fā) 2000+,大促期間通過(guò)擴(kuò)容節(jié)點(diǎn)輕松應(yīng)對(duì) 5000 + 并發(fā)。
- 適用場(chǎng)景:數(shù)據(jù)量 100 萬(wàn) - 10 億,并發(fā)量 500-5000 的成熟業(yè)務(wù)(如全國(guó)性電商、物流平臺(tái))。
4. 高級(jí)階段:自研搜索引擎(數(shù)據(jù)量 100 億 +,并發(fā) 10 萬(wàn) +)
當(dāng)數(shù)據(jù)量突破 100 億、并發(fā)達(dá)到每秒 10 萬(wàn)次,且業(yè)務(wù)有強(qiáng)定制化需求(如特殊打分規(guī)則、極致實(shí)時(shí)性)時(shí),開(kāi)源系統(tǒng)的 “通用性” 會(huì)成為瓶頸 —— 此時(shí)需要自研搜索引擎。
自研核心思路:無(wú)限擴(kuò)展(加機(jī)器即擴(kuò)容)以 “電商商品檢索” 的自研引擎 E-search 為例,架構(gòu)分為三層:
- Proxy 接入層(無(wú)狀態(tài))接收用戶搜索請(qǐng)求(如 “2024 新款無(wú)線耳機(jī)”),根據(jù)負(fù)載均衡策略轉(zhuǎn)發(fā)到 Merger 層。無(wú)狀態(tài)設(shè)計(jì)讓 “加機(jī)器就提升并發(fā)能力”,輕松應(yīng)對(duì) 10 萬(wàn) + QPS。
- Merger 邏輯層(無(wú)狀態(tài))接收 Proxy 的請(qǐng)求,分發(fā)到多個(gè) Searcher 節(jié)點(diǎn)查詢,合并各節(jié)點(diǎn)結(jié)果后執(zhí)行 Rank 打分(如 “新品權(quán)重 + 銷(xiāo)量權(quán)重 + 好評(píng)率權(quán)重”)。業(yè)務(wù)規(guī)則在此靈活配置,同樣支持水平擴(kuò)容。
- Searcher 檢索層(數(shù)據(jù)與服務(wù)綁定)將索引數(shù)據(jù)水平切分(如按商品類(lèi)目分成 8 組),每組冗余 3 份(保證高可用,避免單節(jié)點(diǎn)故障)。服務(wù)啟動(dòng)時(shí)加載索引到內(nèi)存,查詢直接操作內(nèi)存,響應(yīng)時(shí)間控制在 100 毫秒內(nèi)。需要擴(kuò)容時(shí),增加切分組數(shù)或冗余節(jié)點(diǎn)即可。
適用場(chǎng)景:超大規(guī)模業(yè)務(wù)(數(shù)據(jù) 100 億 +,并發(fā) 10 萬(wàn) +),或有強(qiáng)定制化需求的大廠業(yè)務(wù)(如阿里、京東的商品搜索)。
四、高級(jí)話題:如何實(shí)現(xiàn) “1 秒前的訂單可檢索”?
需求三提出:“必須檢索出 5 分鐘前的新聞、1 秒前的訂單,不復(fù)雜吧?” 看似簡(jiǎn)單的 “實(shí)時(shí)性”,在超大規(guī)模數(shù)據(jù)場(chǎng)景下,需要特殊的架構(gòu)設(shè)計(jì) —— 核心是 “索引分級(jí)” 與 “Dump&Merge”。
1. 核心矛盾:實(shí)時(shí)更新與索引效率的沖突
倒排索引為了保證檢索效率,必須 “緊密存儲(chǔ)”(無(wú)碎片)。若每新增一條訂單就修改索引,會(huì)產(chǎn)生大量碎片(如索引文件中出現(xiàn)空洞),導(dǎo)致檢索速度從 100 毫秒降至 1 秒以上。因此,“實(shí)時(shí)修改索引” 不可行 —— 需用 “分級(jí)索引” 解決。
2. 索引分級(jí):用 “多庫(kù)協(xié)同” 實(shí)現(xiàn)實(shí)時(shí)性
將索引分為三級(jí),不同級(jí)別對(duì)應(yīng)不同時(shí)間范圍的數(shù)據(jù):
- 全量庫(kù)存儲(chǔ) 500 億 + 歷史訂單數(shù)據(jù),索引緊密無(wú)碎片,檢索速度最快(50 毫秒內(nèi));
- 日增量庫(kù)存儲(chǔ) 1 天內(nèi)新增 / 修改的訂單(約 2000 萬(wàn)條),同樣緊密存儲(chǔ),檢索速度 100 毫秒內(nèi);
- 分鐘增量庫(kù)存儲(chǔ) 5 分鐘內(nèi)新增 / 修改的訂單(約 50 萬(wàn)條),數(shù)據(jù)量小,查詢速度 30 毫秒內(nèi)。
更新邏輯:新增 / 修改訂單時(shí),只寫(xiě)入 “分鐘增量庫(kù)”(避免影響全量庫(kù));
查詢邏輯:同時(shí)查詢?nèi)繋?kù)、日增量庫(kù)、分鐘增量庫(kù),合并結(jié)果后去重 —— 既保證全量數(shù)據(jù)的檢索效率,又能獲取 1 秒前的最新訂單。
3. Dump&Merge:異步合并,保持索引整潔
分級(jí)索引會(huì)導(dǎo)致 “數(shù)據(jù)分散”,需通過(guò)兩個(gè)工具異步合并,保證各級(jí)索引數(shù)據(jù)量可控:
- Dumper(導(dǎo)出)每 5 分鐘將 “分鐘增量庫(kù)” 的數(shù)據(jù)導(dǎo)出為離線文件(如 JSON 格式),清空分鐘庫(kù);
- Merger(合并)每 24 小時(shí)將 “日增量庫(kù)” 的數(shù)據(jù)合并到 “全量庫(kù)”,同時(shí)清空日庫(kù)。
優(yōu)勢(shì):分鐘庫(kù)數(shù)據(jù)量始終控制在 50 萬(wàn)條內(nèi),保證實(shí)時(shí)性;全量庫(kù)通過(guò)定時(shí)合并保持緊密存儲(chǔ),保證檢索效率。若業(yè)務(wù)規(guī)模更大,還可增加 “秒級(jí)庫(kù)”“月庫(kù)”,進(jìn)一步細(xì)化分級(jí)。
總結(jié):
- 全網(wǎng)搜索引擎的核心架構(gòu)由三大子系統(tǒng)組成,分別是負(fù)責(zé)抓取網(wǎng)頁(yè)數(shù)據(jù)的 spider 爬蟲(chóng)系統(tǒng)、處理索引構(gòu)建與查詢的 search&index 系統(tǒng),以及實(shí)現(xiàn)結(jié)果排序的 rank 打分系統(tǒng)。
- 站內(nèi)搜索引擎與全網(wǎng)搜索引擎的核心差異在于數(shù)據(jù)獲取方式:站內(nèi)搜索無(wú)需 spider 子系統(tǒng),可直接從內(nèi)部業(yè)務(wù)系統(tǒng)(如內(nèi)容發(fā)布系統(tǒng))獲取數(shù)據(jù),而全網(wǎng)搜索需依賴 spider 主動(dòng)抓取互聯(lián)網(wǎng)網(wǎng)頁(yè)。
- 從系統(tǒng)屬性來(lái)看,spider 爬蟲(chóng)系統(tǒng)和 search&index 索引系統(tǒng)更偏向工程實(shí)現(xiàn),通過(guò)合理的架構(gòu)設(shè)計(jì)(如分布式部署、任務(wù)調(diào)度)即可滿足基礎(chǔ)功能需求;但 rank 打分系統(tǒng)需結(jié)合業(yè)務(wù)場(chǎng)景、用戶偏好持續(xù)優(yōu)化模型與權(quán)重,是一個(gè)需要長(zhǎng)期迭代積累的過(guò)程。
- 正排索引(forward index)是一種高效的數(shù)據(jù)結(jié)構(gòu),核心作用是通過(guò)網(wǎng)頁(yè)唯一標(biāo)識(shí) url_id,快速定位并獲取該網(wǎng)頁(yè)分詞后的內(nèi)容集合 list<item>,實(shí)現(xiàn) “標(biāo)識(shí)到內(nèi)容” 的快速映射。
- 倒排索引(inverted index)則與正排索引方向相反,它以分詞 item 為 key,可快速查詢到包含該分詞的所有網(wǎng)頁(yè)唯一標(biāo)識(shí)集合 list<url_id>,是實(shí)現(xiàn) “內(nèi)容到標(biāo)識(shí)” 檢索的核心。
- 用戶檢索的完整流程可拆解為三步:首先對(duì)輸入的搜索詞進(jìn)行分詞處理,得到多個(gè) item;接著通過(guò)倒排索引分別查詢每個(gè) item 對(duì)應(yīng)的網(wǎng)頁(yè) url_id 集合;最后對(duì)多個(gè)集合求交集,篩選出同時(shí)包含所有搜索詞的網(wǎng)頁(yè),完成初篩。
- 針對(duì)有序集合求交集,常見(jiàn)的實(shí)現(xiàn)方法及特性如下:
二重 for 循環(huán)法:邏輯簡(jiǎn)單但效率極低,時(shí)間復(fù)雜度為 O (n2),僅適用于極小數(shù)據(jù)量場(chǎng)景;
拉鏈法:通過(guò)雙指針遍歷有序集合,元素最多被比較一次,時(shí)間復(fù)雜度優(yōu)化至 O (n),是中小規(guī)模數(shù)據(jù)的常用方案;
水平分桶 + 多線程并行:將集合按區(qū)間拆分到不同 “桶” 中,通過(guò)多線程并行計(jì)算各桶交集,再合并結(jié)果,可利用多核資源提升大規(guī)模數(shù)據(jù)處理效率;
bitmap 法:用 bit 位表示集合元素存在狀態(tài),通過(guò) “位與” 操作快速求交集,運(yùn)算并行度高,時(shí)間復(fù)雜度為 O (n),但對(duì)內(nèi)存有一定要求;
跳表法:在有序集合上構(gòu)建多層索引,減少無(wú)效遍歷次數(shù),將時(shí)間復(fù)雜度降至接近 O (log n),是超大規(guī)模數(shù)據(jù)場(chǎng)景(如搜索引擎)的核心方案。

































