色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

C數(shù)據(jù)結(jié)構(gòu)習(xí)題解答落地:ADT、復(fù)雜度實(shí)測與差分對拍

C數(shù)據(jù)結(jié)構(gòu)習(xí)題解答落地:ADT、復(fù)雜度實(shí)測與差分對拍 簡介這份資源是《數(shù)據(jù)結(jié)構(gòu)與算法分析C語言描述》第二版的配套習(xí)題解答手冊面向正在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法分析課程、準(zhǔn)備考試或希望對照課后練習(xí)查漏補(bǔ)缺的讀者。壓縮包內(nèi)僅含1個(gè)PDF文件大小約233KB集中呈現(xiàn)原書多數(shù)練習(xí)的參考答案便于按章節(jié)檢索。內(nèi)容覆蓋算法分析、表?xiàng)Ec隊(duì)列、樹、哈希、優(yōu)先隊(duì)列、排序、不相交集合、圖算法、算法設(shè)計(jì)技巧及攤還分析等主題解答以偽C代碼和思路說明為主細(xì)節(jié)多留給讀者自行補(bǔ)全。已有142人學(xué)習(xí)下載。它適合在完成課后題后核對結(jié)論、理解復(fù)雜度推導(dǎo)與經(jīng)典結(jié)構(gòu)實(shí)現(xiàn)思路也能幫助讀者發(fā)現(xiàn)理解偏差并深化對數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)的掌握。1. 一份習(xí)題解答手冊真正的用法先跑通再對拍最后改參數(shù)很多人拿到 C 語言數(shù)據(jù)結(jié)構(gòu)與算法分析的教材和配套習(xí)題解答手冊第一反應(yīng)是當(dāng)小說翻看完 AVL 旋轉(zhuǎn)覺得自己懂了合上書寫不出三行。真正有用的用法是把解答手冊當(dāng)成一份“規(guī)范文檔 測試用例庫”而不當(dāng)成閱讀材料。手冊里出現(xiàn)的每一種結(jié)構(gòu)都要落成能編譯、能被 sanitizer 檢查、能被隨機(jī)數(shù)據(jù)反復(fù)錘打的一份 C 代碼每一個(gè)復(fù)雜度結(jié)論都要在自己的機(jī)器上換成可測的數(shù)字。這條路徑適合兩類人正在用 C 語言補(bǔ)數(shù)據(jù)結(jié)構(gòu)底子的開發(fā)者以及面試或工程里需要手寫鏈表、堆、散列的熟手。后面從偽代碼落地講到差分對拍把手冊里的答案變成你倉庫里能回歸的資產(chǎn)。2. 從偽代碼到能編譯的 CADT 骨架、指針與內(nèi)存的三條線解答手冊里的代碼片段多半是“示意性”的函數(shù)簽名省略了錯(cuò)誤返回節(jié)點(diǎn)定義省略了 typedef內(nèi)存分配干脆寫成new或者一句話帶過。這些片段作為思路無誤直接貼進(jìn)編輯器就會(huì)連鎖翻車。這一章解決的是最底層的一步把手冊里的抽象數(shù)據(jù)類型ADT描述還原成一份結(jié)構(gòu)清晰、內(nèi)存可控、能開告警編譯的 C 工程骨架。2.1 為什么解答里的偽代碼不能直接抄成 CC 語言版教材的行文習(xí)慣是先用 ADT 定義接口再給實(shí)現(xiàn)思路最后給一段接近 C 但不等同于 C 的代碼。最容易出問題的是三處。第一處是節(jié)點(diǎn)定義。手冊里常寫“設(shè)節(jié)點(diǎn)包含一個(gè)元素和兩個(gè)指針”實(shí)際落地要考慮 key 的類型、是否需要父指針、是否需要維護(hù) size 和 height 這類附加字段。這些字段一旦寫進(jìn)結(jié)構(gòu)體所有旋轉(zhuǎn)、刪除、重建邏輯都要跟著改所以結(jié)構(gòu)體定義必須在動(dòng)手前一次定清楚中途加字段的代價(jià)很高。第二處是錯(cuò)誤處理。手冊里的Insert往往只關(guān)心“插入成功”這一條路徑?jīng)]有說明分配失敗怎么辦、重復(fù)鍵怎么辦、刪除不存在的鍵怎么辦。真實(shí)代碼里這三條路徑都必須有明確返回值否則調(diào)用方只能靠全局變量猜狀態(tài)。第三處是所有權(quán)。手冊講鏈表刪除節(jié)點(diǎn)時(shí)寫“釋放該節(jié)點(diǎn)”但沒講清楚被刪除節(jié)點(diǎn)里的數(shù)據(jù)指針由誰釋放。這在單向鏈表上不致命在多級結(jié)構(gòu)散列表的桶、圖的鄰接表上就會(huì)變成連鎖泄漏。我一般的做法是先寫頭文件把接口和錯(cuò)誤返回定死再寫實(shí)現(xiàn)。接口定下來之后實(shí)現(xiàn)怎么寫都不會(huì)跑偏。2.2 一個(gè)可復(fù)用的 ADT 頭文件骨架下面這份骨架是從手冊里最常見的“帶哨兵的單向鏈表”抽象出來的可以直接當(dāng)模板用/* list.h —— 接口先行所有權(quán)、返回碼、不變量寫清楚 */ #ifndef LIST_H #define LIST_H #include stddef.h typedef int ElementType; /* 元素類型集中在這里改實(shí)現(xiàn)文件不用動(dòng) */ typedef enum { LIST_OK 0, LIST_ERR_ALLOC -1, /* 內(nèi)存分配失敗 */ LIST_ERR_NOT_FOUND -2, /* 刪除/查找目標(biāo)不存在 */ LIST_ERR_INVALID -3 /* 空指針、越界等調(diào)用方錯(cuò)誤 */ } ListStatus; typedef struct ListNode { ElementType value; struct ListNode *next; } ListNode; typedef struct { ListNode *head; /* 哨兵頭節(jié)點(diǎn)不存有效數(shù)據(jù) */ size_t size; /* 維護(hù)長度避免每次都遍歷 */ } List; ListStatus list_init(List *l); ListStatus list_push_front(List *l, ElementType v); ListStatus list_remove(List *l, ElementType v); void list_destroy(List *l); /* 釋放全部節(jié)點(diǎn)調(diào)用后 size 歸零 */ #endif邏輯說明ElementType單獨(dú) typedef 是手冊里 ADT 思想最值錢的一條——換元素類型時(shí)只改一行。哨兵頭節(jié)點(diǎn)讓插入和刪除都不需要特判空鏈表這是教材里反復(fù)強(qiáng)調(diào)的“啞節(jié)點(diǎn)”技巧在 C 里收益尤其明顯因?yàn)槭〉舻氖亲钊菀讓戝e(cuò)的指針分支。參數(shù)說明size用size_t而不是int避免長度比較時(shí)的隱式符號(hào)轉(zhuǎn)換ListStatus用枚舉而不是返回布爾值調(diào)用方能區(qū)分“分配失敗”和“目標(biāo)不存在”排錯(cuò)時(shí)少走很多彎路。list_destroy不返回狀態(tài)因?yàn)獒尫攀≡?C 里沒有可恢復(fù)的語義直接交給 sanitizer 檢查更實(shí)際。2.3 把 malloc 和 free 收攏到兩個(gè)函數(shù)手冊里每次插入都是一句malloc從不檢查返回值。工程里更糟的做法是到處if (p NULL) return散落各處的判斷沒人維護(hù)。我習(xí)慣把分配和釋放收攏成兩個(gè)帶診斷的函數(shù)/* mem.c —— 所有節(jié)點(diǎn)分配都走這里泄漏和重復(fù)釋放能一眼看到 */ #include stdio.h #include stdlib.h #include list.h void *xmalloc(size_t n) { void *p malloc(n); if (p NULL) { fprintf(stderr, xmalloc: out of memory (%zu bytes)\n, n); abort(); /* 教學(xué)與實(shí)驗(yàn)階段直接終止便于定位 */ } return p; } void xfree(void *p) { if (p NULL) return; /* free(NULL) 合法但顯式返回更易讀 */ free(p); } ListStatus list_push_front(List *l, ElementType v) { if (l NULL || l-head NULL) return LIST_ERR_INVALID; ListNode *n xmalloc(sizeof *n); /* sizeof *n 比 sizeof(ListNode) 更抗改類型 */ n-value v; n-next l-head-next; /* 哨兵之后插入無需特判空表 */ l-head-next n; l-size; return LIST_OK; } void list_destroy(List *l) { if (l NULL || l-head NULL) return; ListNode *cur l-head-next; while (cur ! NULL) { ListNode *next cur-next; /* 先存后繼再釋放當(dāng)前 */ xfree(cur); cur next; } xfree(l-head); l-head NULL; l-size 0; }邏輯說明xmalloc把“分配失敗”這件事從每個(gè)調(diào)用點(diǎn)收攏到一個(gè)地方實(shí)驗(yàn)階段直接 abort 是最省時(shí)間的選擇因?yàn)槟悴恍枰獮閮?nèi)存耗盡設(shè)計(jì)恢復(fù)路徑。list_destroy里先保存next再釋放cur是鏈表釋放的標(biāo)準(zhǔn)寫法順序?qū)懛淳褪墙炭茣壍?use-after-free。參數(shù)說明sizeof *n是防御性寫法結(jié)構(gòu)體字段變化時(shí)不用同步修改分配語句list_push_front里的l-head NULL判斷是防御“未初始化就使用”因?yàn)閘ist_init之后head一定非空這條分支正常不會(huì)觸發(fā)一旦觸發(fā)說明調(diào)用方的生命周期管理有問題。2.4 用固定的編譯選項(xiàng)把問題提前暴露手冊從不提編譯選項(xiàng)但這一步?jīng)Q定了你后面調(diào)試要花多少時(shí)間。我固定用下面這組# Makefile —— 告警當(dāng)錯(cuò)誤sanitizer 常開 CC cc CFLAGS -stdc99 -g -O1 -Wall -Wextra -Werror \ -fsanitizeaddress,undefined -fno-omit-frame-pointer LDFLAGS -fsanitizeaddress,undefined test_list: test_list.o list.o mem.o $(CC) $(LDFLAGS) -o $ $^邏輯說明-O1配合-g是調(diào)試期的甜點(diǎn)-O2會(huì)把部分變量優(yōu)化掉導(dǎo)致斷點(diǎn)跳躍-O0又會(huì)掩蓋部分未定義行為。-fsanitizeaddress抓越界和 use-after-free-fsanitizeundefined抓有符號(hào)溢出、空指針解引用、錯(cuò)位對齊這兩類問題在數(shù)據(jù)結(jié)構(gòu)代碼里出現(xiàn)頻率極高。參數(shù)說明-Werror把告警升級為錯(cuò)誤能強(qiáng)制你處理“未使用變量”“隱式聲明”這類問題后者在 C99 里是真正的坑——函數(shù)沒聲明就調(diào)用編譯器會(huì)按 int 返回處理指針被截?cái)喑?32 位時(shí)只有在特定機(jī)器上才崩。-fno-omit-frame-pointer保證 sanitizer 的?;厮菘勺x。3. 復(fù)雜度分析落到實(shí)測把 O() 換成計(jì)數(shù)器和計(jì)時(shí)器教材里最容易被跳過的是復(fù)雜度分析這一章因?yàn)樗翱雌饋聿划a(chǎn)出代碼”。但手冊里幾乎所有解答都在用 O() 描述代價(jià)如果你不把抽象階數(shù)和實(shí)測數(shù)字對上后面選結(jié)構(gòu)就是憑感覺。這一章把 O() 變成可測的量怎么插樁、測什么、怎么判斷你測出來的是階數(shù)而不是噪聲。3.1 上界、常數(shù)因子與“實(shí)際更快”的錯(cuò)覺解答手冊給出的是漸進(jìn)上界它丟掉了常數(shù)因子和低階項(xiàng)。這在 n 很大時(shí)成立在你實(shí)際處理的規(guī)模上經(jīng)常不成立。典型的例子是插入排序和歸并排序前者是 O(n2)后者是 O(n log n)但在 n 小于幾十、且數(shù)據(jù)基本有序時(shí)插入排序往往跑得更快因?yàn)闅w并排序的分配和拷貝開銷擺在那里。手冊不會(huì)告訴你這個(gè)交叉點(diǎn)在哪因?yàn)樗蕾嚈C(jī)器。我的處理方式是把“階數(shù)結(jié)論”和“常數(shù)結(jié)論”分開驗(yàn)證階數(shù)用雙對數(shù)坐標(biāo)的斜率驗(yàn)證常數(shù)用同一規(guī)模下的絕對耗時(shí)或操作計(jì)數(shù)驗(yàn)證。前者回答“這個(gè)算法能不能擴(kuò)展”后者回答“在 n1000 時(shí)該選誰”。兩個(gè)問題答案不一致是常態(tài)不是手冊錯(cuò)了。3.2 用計(jì)數(shù)器替代 clock()統(tǒng)計(jì)比較與賦值次數(shù)clock()的抖動(dòng)在小規(guī)模下能到 30% 以上測出來的曲線沒法看。更可靠的辦法是插樁計(jì)數(shù)把“比較次數(shù)”和“賦值次數(shù)”當(dāng)成代價(jià)的代理指標(biāo)/* count.h —— 極輕量的插樁release 時(shí)改成空宏即可 */ #ifndef COUNT_H #define COUNT_H extern unsigned long g_cmp, g_assign; #define CMP_LT(a, b) (g_cmp, (a) (b)) #define ASG(dst, val) (g_assign, (dst) (val)) #endif/* sort_measure.c —— 插入排序的插樁版本只改比較和賦值兩處 */ #include count.h void insertion_sort(int *a, int n) { for (int i 1; i n; i) { int key a[i]; /* 取元素不計(jì)入交換代價(jià) */ int j i - 1; while (j 0 CMP_LT(key, a[j])) { /* 每次成功比較都計(jì)數(shù) */ ASG(a[j 1], a[j]); /* 每次后移都計(jì)數(shù) */ j--; } ASG(a[j 1], key); } }邏輯說明把比較和賦值包裝成宏而不是函數(shù)是為了讓計(jì)數(shù)器停留在寄存器層面的開銷可忽略同時(shí)保證-O1下不會(huì)被內(nèi)聯(lián)后優(yōu)化掉宏展開后是真實(shí)的全局變量自增編譯器不會(huì)刪。用計(jì)數(shù)器而不是計(jì)時(shí)器是為了讓“插入排序在 n50 時(shí)比歸并快”這個(gè)結(jié)論可以復(fù)現(xiàn)——同樣的輸入、同樣的代碼計(jì)數(shù)結(jié)果永遠(yuǎn)一致。參數(shù)說明g_cmp和g_assign定義為全局變量跑完一個(gè)用例前必須清零否則數(shù)據(jù)會(huì)串。CMP_LT只覆蓋“小于”這一種比較是因?yàn)槭謨岳锝^大多數(shù)排序的判定條件都能歸約成小于如果你要測三路快排需要再加一個(gè)相等比較的宏否則計(jì)數(shù)會(huì)偏小。3.3 三個(gè)必須釘死的測量參數(shù)同樣的代碼換三個(gè)參數(shù)就能測出三條完全不同的曲線。這三個(gè)參數(shù)不控制住后面所有結(jié)論都不可信。參數(shù)取值建議不控制會(huì)怎樣數(shù)據(jù)規(guī)模 n從 2^8 起每步乘 2至少 8 個(gè)點(diǎn)點(diǎn)太少無法判斷斜率擬合出來的階數(shù)隨機(jī)性極大初始分布隨機(jī)、升序、降序、全等值四組分別測只測隨機(jī)數(shù)據(jù)會(huì)掩蓋快排在有序輸入上的退化重復(fù)次數(shù)每個(gè)規(guī)模至少跑 5 次取中位數(shù)單次測量受緩存和調(diào)度影響小規(guī)模下偏差可達(dá)數(shù)倍第三項(xiàng)容易被忽略。n256 這種規(guī)模一次運(yùn)行只有微秒級進(jìn)程啟動(dòng)和頁錯(cuò)誤的開銷占比很高。我一般在外層套一個(gè)循環(huán)把同一組數(shù)據(jù)重復(fù)跑 1000 次再除以次數(shù)讓單次代價(jià)落到毫秒級抖動(dòng)就被攤薄了。3.4 用雙對數(shù)斜率判斷階數(shù)測完數(shù)據(jù)之后不要靠眼睛看曲線“像不像拋物線”直接算斜率。若 T(n) 近似為 c·n^k則 log T 與 log n 是直線斜率為 k# slope.py —— 用相鄰兩點(diǎn)的雙對數(shù)斜率判斷階數(shù) import math def slopes(points): points: [(n, cost), ...] 按 n 升序 out [] for (n1, t1), (n2, t2) in zip(points, points[1:]): if t1 0 or t2 0: continue out.append(math.log2(t2 / t1) / math.log2(n2 / n1)) return out data [(256, 32_100), (512, 128_400), (1024, 513_800), (2048, 2_055_000)] print([round(s, 2) for s in slopes(data)]) # 期望接近 [2.0, 2.0, 2.0]邏輯說明相鄰點(diǎn)斜率比整體擬合更能暴露“小規(guī)模常數(shù)項(xiàng)主導(dǎo)”的區(qū)間。如果前兩個(gè)斜率明顯小于后面的說明這一段還在常數(shù)項(xiàng)影響范圍內(nèi)不能用來判斷階數(shù)只有當(dāng)斜率穩(wěn)定在某個(gè)值附近才能說這段數(shù)據(jù)呈現(xiàn)該階數(shù)的行為。參數(shù)說明用 log2 而不是自然對數(shù)是因?yàn)?n 每次翻倍時(shí)斜率正好是 k 本身讀起來直觀斜率 2.0 就是平方階。數(shù)據(jù)里出現(xiàn) cost 為 0 的點(diǎn)要跳過通常是規(guī)模太小、編譯器把整個(gè)循環(huán)優(yōu)化掉了這類點(diǎn)留著會(huì)污染斜率。4. 樹與散列的復(fù)現(xiàn)AVL 旋轉(zhuǎn)、散列沖突與再散列手冊里平衡樹和散列這兩章篇幅最重也是抄錯(cuò)率最高的地方旋轉(zhuǎn)的四種情形代碼長得幾乎一樣散列的探測序列一旦寫錯(cuò)表現(xiàn)是“大部分情況對、偶爾查不到”。這一章把這兩塊的落地細(xì)節(jié)釘死。4.1 AVL先寫不變量再寫旋轉(zhuǎn)AVL 的代碼之所以容易寫崩是因?yàn)榇蠖鄶?shù)人是照著四種情形的圖去湊指針。更穩(wěn)的路徑是先聲明不變量再讓旋轉(zhuǎn)去滿足它。不變量只有兩條任意節(jié)點(diǎn)的左右子樹高度差絕對值不超過 1節(jié)點(diǎn)存儲(chǔ)的 height 字段等于左右子樹高度的較大值加 1空樹高度定義為 -1。有了這兩條四種情形可以歸約成兩個(gè)基本操作單旋轉(zhuǎn)和雙旋轉(zhuǎn)雙旋轉(zhuǎn)就是兩次單旋轉(zhuǎn)的組合。/* avl.c —— 高度定義為 -1 起步葉子節(jié)點(diǎn)高度為 0 */ #include stdlib.h #include count.h typedef struct AvlNode { int key; int height; struct AvlNode *left, *right; } AvlNode; static int h(const AvlNode *t) { return t ? t-height : -1; } static int imax(int a, int b) { return a b ? a : b; } /* 左-左情形對 k2 右旋返回新的子樹根 */ static AvlNode *rotate_right(AvlNode *k2) { AvlNode *k1 k2-left; k2-left k1-right; k1-right k2; k2-height imax(h(k2-left), h(k2-right)) 1; /* 先更新下層 */ k1-height imax(h(k1-left), h(k1-right)) 1; /* 再更新新根 */ return k1; } /* 右-右情形對 k1 左旋 */ static AvlNode *rotate_left(AvlNode *k1) { AvlNode *k2 k1-right; k1-right k2-left; k2-left k1; k1-height imax(h(k1-left), h(k1-right)) 1; k2-height imax(h(k2-left), h(k2-right)) 1; return k2; } /* 左右情形先對左兒子左旋再整體右旋 */ static AvlNode *double_left_right(AvlNode *k3) { k3-left rotate_left(k3-left); return rotate_right(k3); }邏輯說明旋轉(zhuǎn)里最容易錯(cuò)的是高度更新的順序。必須先把下沉的那個(gè)節(jié)點(diǎn)的高度算出來再算新根的高度因?yàn)樾赂母叨纫蕾囅鲁凉?jié)點(diǎn)更新后的值。順序反了不會(huì)立刻崩但高度會(huì)偏大 1幾輪插入之后平衡判斷就失效表現(xiàn)是“樹越長越歪”。h()對空指針返回 -1 而不是 0是為了讓葉子節(jié)點(diǎn)高度為 0 的約定自洽這也是教材里用的約定換成 0 起步會(huì)導(dǎo)致所有平衡因子差一位。參數(shù)說明key用 int 是為了和前面的計(jì)數(shù)器配合實(shí)際項(xiàng)目里換成ElementType即可。函數(shù)返回新的子樹根而不是原地修改是因?yàn)椴迦牒蛣h除需要把新根掛回父節(jié)點(diǎn)用返回值寫法能避免維護(hù)父指針。插入函數(shù)的關(guān)鍵在回溯路徑上更新高度并判斷平衡因子四個(gè)分支的判定條件要寫清楚/* 插入后回溯平衡因子 左高 - 右高 */ AvlNode *avl_insert(AvlNode *t, int key) { if (t NULL) { AvlNode *n calloc(1, sizeof *n); /* 新葉子高度為 0calloc 后需修正 */ if (!n) return NULL; n-key key; n-height 0; return n; } if (CMP_LT(key, t-key)) { t-left avl_insert(t-left, key); if (h(t-left) - h(t-right) 2) { if (CMP_LT(key, t-left-key)) t rotate_right(t); else t double_left_right(t); } } else if (key t-key) { t-right avl_insert(t-right, key); if (h(t-right) - h(t-left) 2) { if (key t-right-key) t rotate_left(t); else t double_left_right_sym(t); } } t-height imax(h(t-left), h(t-right)) 1; return t; }邏輯說明判等分支故意留空即重復(fù)鍵不插入這是手冊里常見的一種約定如果你的場景需要允許重復(fù)改成在相等時(shí)往右子樹走即可但要注意這樣會(huì)讓刪除邏輯復(fù)雜一檔。平衡因子的判定用 2而不是 2是因?yàn)橐淮尾迦胱疃嘧尭叨炔顝?1 變成 2用等號(hào)能在斷言層面盡早發(fā)現(xiàn)邏輯錯(cuò)誤。參數(shù)說明calloc之后仍顯式設(shè)height 0是因?yàn)檎{(diào)用方可能把節(jié)點(diǎn)高度約定改成 1 起步顯式賦值比依賴零初始化安全。遞歸實(shí)現(xiàn)的好處是回溯路徑天然存在壞處是深樹會(huì)爆棧生產(chǎn)代碼里一般改成帶父指針的迭代版本但學(xué)習(xí)階段先用遞歸把不變量吃透。4.2 散列裝填因子和再散列閾值必須成對出現(xiàn)手冊講開放定址散列時(shí)給的是平方探測并提到“表不能太滿”。這句話在落地時(shí)會(huì)被簡化成“裝填因子別超過 0.5”然后就沒了。真正的坑是裝填因子閾值和再散列邏輯必須寫在一起只設(shè)閾值不寫再散列插入在表滿時(shí)會(huì)死循環(huán)。平方探測的探測序列是 i2 而不是 i寫錯(cuò)這一處查找就會(huì)在“應(yīng)該有元素”的位置停下并返回未找到。判定條件要寫成i table_size / 2因?yàn)槠椒教綔y在表大小為質(zhì)數(shù)且裝填因子低于 0.5 時(shí)前一半探測序列就能覆蓋到空位。/* hash.c —— 開放定址平方探測裝填因子超過 0.5 觸發(fā)再散列 */ #define EMPTY_KEY (-2147483647) /* 用哨兵標(biāo)記空槽比額外數(shù)組省空間 */ typedef struct { int *keys; size_t capacity; /* 容量取質(zhì)數(shù)且盡量是 4k3 形 */ size_t size; /* 已用槽數(shù)不包含墓碑 */ } HashTable; static size_t next_prime(size_t n) { while (1) { int ok 1; for (size_t d 2; d * d n; d) if (n % d 0) { ok 0; break; } if (ok) return n; n; } } static void rehash(HashTable *h); void hash_insert(HashTable *h, int key) { if ((double)(h-size 1) / h-capacity 0.5) rehash(h); size_t i (size_t)key % h-capacity; for (size_t k 0; k h-capacity / 2; k) { size_t pos (i k * k) % h-capacity; /* 平方探測注意取模 */ if (h-keys[pos] EMPTY_KEY) { h-keys[pos] key; h-size; return; } if (h-keys[pos] key) return; /* 重復(fù)鍵直接忽略 */ } }邏輯說明rehash放在插入之前判斷而不是插入失敗之后補(bǔ)救這樣保證任何一次插入都有至少一半的空槽可用。k * k用size_t計(jì)算避免 n 很大時(shí)int溢出成負(fù)數(shù)導(dǎo)致取模結(jié)果為負(fù)這個(gè)坑在容量超過 46341 時(shí)會(huì)真實(shí)觸發(fā)。參數(shù)說明容量選 4k3 形的質(zhì)數(shù)是因?yàn)槠椒教綔y在質(zhì)數(shù)容量下探測序列覆蓋更均勻這是數(shù)論結(jié)論手冊里通常只在注釋里提一句。EMPTY_KEY用INT_MIN是因?yàn)轭}目數(shù)據(jù)都是正整數(shù)實(shí)際項(xiàng)目里應(yīng)該用單獨(dú)的occupied位圖或者允許存儲(chǔ)任意 int 時(shí)改用線性探測加墓碑標(biāo)記。4.3 同一組鍵分別跑 AVL 與散列該看什么跑對比實(shí)驗(yàn)時(shí)很多人只比較“插入耗時(shí)”這個(gè)維度信息量很低散列插入是均攤常數(shù)AVL 是對數(shù)結(jié)論在寫代碼之前就知道了。真正值得看的三個(gè)量是觀察量AVL開放定址散列說明最壞一次查找的比較次數(shù)約 1.44 log?n探測次數(shù)不定接近滿載時(shí)急劇上升最壞情況才是工程里要防的有序遍歷中序 O(n) 直接輸出需要額外排序散列犧牲了順序性內(nèi)存占用每節(jié)點(diǎn) 3 個(gè)字段加對齊槽數(shù)與裝填因子成反比裝填因子 0.5 意味著近 2 倍冗余第三行最容易被忽略。手冊里說散列查找是常數(shù)沒提這個(gè)常數(shù)是用空間換來的。裝填因子壓到 0.5意味著容量要是元素?cái)?shù)的兩倍壓到 0.25 會(huì)讓探測更快但內(nèi)存直接翻四倍。如果你的場景是百萬級元素、內(nèi)存受限把裝填因子調(diào)到 0.7 以上、同時(shí)改用線性探測提升緩存命中率實(shí)測往往比教科書參數(shù)更快代價(jià)是最壞情況的探測次數(shù)變長。這類結(jié)論靠讀手冊得不出來只能自己壓測。5. 照抄解答最容易翻車的五個(gè)現(xiàn)場現(xiàn)象、原因與解法這一章集中處理復(fù)現(xiàn)過程中真實(shí)會(huì)卡住人的幾類問題。寫代碼的時(shí)間可能只占三成剩下七成都在和這些東西耗。每條按現(xiàn)象、原因、解決三段說。5.1 段錯(cuò)誤與內(nèi)存類現(xiàn)場現(xiàn)象鏈表刪除操作單獨(dú)測都能過連續(xù)刪 1000 個(gè)節(jié)點(diǎn)后在list_destroy里隨機(jī)崩?;厮葜赶騠ree看不出哪一行。原因刪除節(jié)點(diǎn)時(shí)先free(cur)再取cur-next。單次刪除時(shí)free之后那塊內(nèi)存通常還沒被復(fù)寫next恰好還能讀到所以看不出來連續(xù)刪除時(shí)分配器把釋放的塊掛回空閑鏈表會(huì)在塊頭寫入指針cur-next讀到的就是空閑鏈表指針再去解釋成節(jié)點(diǎn)就是野指針。解決讀后繼和釋放嚴(yán)格分兩步用臨時(shí)變量保存next。這條規(guī)則在雙向鏈表、樹的刪除、散列表的桶鏈上同樣適用。另外把 sanitizer 常開這類問題會(huì)在第一次越界時(shí)就被 ASan 攔下來不用等到崩潰現(xiàn)場?,F(xiàn)象程序跑完不崩但valgrind或 ASan 報(bào)告 still reachable罪魁禍?zhǔn)资且粋€(gè)只在插入路徑上分配的臨時(shí)數(shù)組。原因手冊里的算法描述常常只講主體回收寫在別處或者干脆省略。只按主體實(shí)現(xiàn)臨時(shí)緩沖區(qū)就漏了。解決把“誰分配誰釋放”寫進(jìn)函數(shù)注釋并在每個(gè)返回路徑上核對。我一般的習(xí)慣是讓malloc和free在同一屏代碼內(nèi)出現(xiàn)跨越一屏的分配就要重新審視結(jié)構(gòu)劃分。5.2 結(jié)果對不上類現(xiàn)場現(xiàn)象快速排序在隨機(jī)數(shù)據(jù)上結(jié)果正確在“大量重復(fù)元素”的測試集上跑出非遞增序列或者直接崩。原因樸素的快排按“小于 pivot 放左、大于等于放右”劃分遇到全等值數(shù)據(jù)時(shí)每次劃分都退化成 1 和 n-1遞歸深度變成 n。崩是棧溢出結(jié)果錯(cuò)是劃分邊界寫錯(cuò)時(shí)把 pivot 覆蓋了。解決劃分改用雙指針相向掃描遇到相等元素就交換讓相等值均勻分布到兩側(cè)或者直接實(shí)現(xiàn)三路劃分把區(qū)間分成小于、等于、大于三段。同時(shí)給遞歸加深度上限超過 2 log n 時(shí)切換到堆排序這也是很多標(biāo)準(zhǔn)庫的兜底策略。手冊里通常只給基礎(chǔ)版本邊界處理要自己補(bǔ)?,F(xiàn)象圖的最短路徑算法在小圖上正確在帶負(fù)權(quán)邊的圖上給出錯(cuò)誤答案但沒有報(bào)錯(cuò)。原因Dijkstra 的貪心前提是非負(fù)權(quán)邊手冊在這一節(jié)通常會(huì)寫一句前提條件很容易被當(dāng)成廢話跳過。解決加斷言或者前置檢查發(fā)現(xiàn)負(fù)權(quán)邊就切換到能處理負(fù)權(quán)的算法如果只是用來驗(yàn)證理解至少在測試用例里顯式包含一條負(fù)權(quán)邊看它怎么錯(cuò)比只在正確輸入上跑通更有價(jià)值。5.3 復(fù)雜度與性能類現(xiàn)場現(xiàn)象歸并排序?qū)崿F(xiàn)完n 取到十萬時(shí)反而比插入排序慢懷疑自己寫錯(cuò)了。原因歸并的每次遞歸都在malloc一個(gè)臨時(shí)數(shù)組分配開銷蓋過了 O(n log n) 的優(yōu)勢。手冊里的偽代碼默認(rèn)“合并用的輔助空間已就緒”沒說明這個(gè)空間要在遞歸外一次性分配。解決在排序入口分配一塊與輸入等長的緩沖區(qū)遞歸過程中只做拷貝不在遞歸內(nèi)分配。這一處改動(dòng)在十萬級數(shù)據(jù)上通常能帶來數(shù)倍差距。順帶把邊界條件改成 n 小于閾值時(shí)直接插入排序交叉點(diǎn)實(shí)測在 16 到 32 之間?,F(xiàn)象同一份代碼在自己機(jī)器上跑 3 秒換臺(tái)機(jī)器跑 12 秒開始懷疑算法選錯(cuò)。原因大規(guī)模順序訪問的結(jié)構(gòu)數(shù)組、堆對緩存敏感同樣階數(shù)的算法在緩存命中率上能差一個(gè)數(shù)量級。編譯優(yōu)化等級和 CPU 頻率策略也會(huì)帶來數(shù)倍差異。解決跨機(jī)比較時(shí)只比操作計(jì)數(shù)不比墻上時(shí)間。要比時(shí)間就在同一臺(tái)機(jī)器上、同一編譯選項(xiàng)下、用中位數(shù)比較。這條在選結(jié)構(gòu)時(shí)尤其重要手冊里兩個(gè) O(n log n) 的排序?qū)嶋H差三倍是正?,F(xiàn)象別急著推翻階數(shù)結(jié)論。6. 用差分測試把解答手冊變成回歸用例庫手冊里每道題的答案本質(zhì)上都是一個(gè)“預(yù)期輸出”。把這層關(guān)系利用起來就能把整本手冊變成回歸測試集一邊寫自己的實(shí)現(xiàn)一邊寫一個(gè)慢但絕對正確的暴力版本用隨機(jī)數(shù)據(jù)喂給兩邊對拍。這個(gè)做法在樹、散列、圖算法上都能用尤其是最大子序列和、最短路、拓?fù)渑判蜻@類“結(jié)論唯一、實(shí)現(xiàn)容易錯(cuò)”的題目。最典型的是最大子序列和。手冊給了四種解法復(fù)雜度從立方到線性彼此可以互相驗(yàn)證/* difftest.c —— 暴力 O(n^3) 作為基準(zhǔn)與分治 O(n log n) 對拍 */ #include stdio.h #include stdlib.h #include time.h #include assert.h static int brute(const int *a, int n) { int best 0; /* 空子序列和為 0與教材約定一致 */ for (int i 0; i n; i) for (int j i; j n; j) { int sum 0; for (int k i; k j; k) sum a[k]; if (sum best) best sum; } return best; } static int max3(int x, int y, int z) { int m x y ? x : y; return m z ? m : z; } static int dc(const int *a, int lo, int hi) { /* 區(qū)間 [lo, hi) */ if (lo hi) return 0; if (hi - lo 1) return a[lo] 0 ? a[lo] : 0; int mid lo (hi - lo) / 2; int left dc(a, lo, mid), right dc(a, mid, hi); int ls 0, lb 0; /* 左半含邊界最大值 */ for (int i mid - 1; i lo; i--) { ls a[i]; if (ls lb) lb ls; } int rs 0, rb 0; for (int i mid; i hi; i) { rs a[i]; if (rs rb) rb rs; } return max3(left, right, lb rb); } int main(void) { srand(20240501); for (int round 0; round 20000; round) { int n 1 rand() % 40; /* 小規(guī)模多輪覆蓋更多形態(tài) */ int a[40]; for (int i 0; i n; i) a[i] rand() % 21 - 10; /* 含負(fù)數(shù)才有意義 */ assert(brute(a, n) dc(a, 0, n)); } puts(diff ok); return 0; }邏輯說明暴力版復(fù)雜度立方但邏輯直白幾乎不可能寫錯(cuò)適合當(dāng)基準(zhǔn)。分治版是全篇最容易在跨中點(diǎn)的循環(huán)邊界上翻車的地方左半從mid-1向前累加右半從mid向后累加兩邊的初始值都是 0這樣全負(fù)數(shù)組返回 0 與暴力版一致。斷言放在循環(huán)里而不是循環(huán)外是為了在第一次不一致時(shí)就能定位到具體的隨機(jī)種子和輸入。參數(shù)說明rand() % 21 - 10保證正負(fù)混合全正數(shù)會(huì)讓所有版本都返回總和測不出邊界錯(cuò)誤。規(guī)模限制在 40 以內(nèi)是因?yàn)榱⒎綇?fù)雜度在 40 上單輪只有 6 萬次運(yùn)算兩萬輪也才 12 億次幾秒內(nèi)跑完。如果被測算法是百萬級才暴露問題的類型就換方法固定種子、放大規(guī)模、減少輪數(shù)但始終保留至少一個(gè)“小規(guī)模多種子”的階段。測試維度建議取值能抓出的問題元素取值全正、全負(fù)、正負(fù)混合、全零初始值約定錯(cuò)誤、邊界返回錯(cuò)誤規(guī)模1、2、3、2 的冪、質(zhì)數(shù)附近單元素特判遺漏、遞歸拆分不均勻排列形態(tài)隨機(jī)構(gòu)造、已升序、已降序、全等值退化路徑、劃分不均、無限遞歸重復(fù)運(yùn)行固定隨機(jī)種子讓失敗可以精確復(fù)現(xiàn)我踩過最深的一個(gè)坑是把對拍腳本的隨機(jī)種子設(shè)成time(NULL)。某次跑了兩小時(shí)才發(fā)現(xiàn)一個(gè)不一致回頭重跑再也復(fù)現(xiàn)不出來因?yàn)榉N子已經(jīng)變了。從那以后所有隨機(jī)測試都固定種子把種子號(hào)寫進(jìn)日志失敗時(shí)直接改一行重放。另外就是別急著上大規(guī)?!∫?guī)模多輪次幾乎總能更快地暴露邏輯錯(cuò)誤而大規(guī)模只能告訴你性能問題。手冊里的答案只是起點(diǎn)真正吃透一個(gè)結(jié)構(gòu)靠的是你自己的對拍腳本跑綠的那一刻。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲免费在线探花| 九九九不卡| 亚洲高清自拍| 射丝袜高跟鞋99| 亚洲交性| 蜜臀久久一区二区| 涩综合导航| 国产成人资源| 强奸乱伦免费网站| 99re在线视频这里只有精品| 色婷婷影视| 肉丝中文无码高清| 欧美日韩国产色图在线| 欧美亚洲特P| 日韩去日本高清在| 欧美亚洲首页| 97干日韩| 日韩免费看在线黄色片| 丁香婷婷激情五月天无毒不卡 | 欧美韩日精品资源| 91在线视频免费播放| 久久久性爱视频| 亚洲图片日本AⅤ欧美在线| 中国黑人三级片网站上区| 五月丁香黄色网| 一二三啪啪专区| 2017亚洲天堂| 天操老女人| 国产亚洲禁久一区二区| 逼操网站| 天天影视综合网欧美精品| 快灬快灬 一下爽蜜桃在线观看| 久久秀这里有精品| 九九热久久99精品re| 久久精品72| 日韩欧美tv一区二区在线观看| 精品久久9| 五月婷在线| 国产一级内射无挡观看| 久草成人影片| av在线浏览| 日韩欧美中文| 亚洲97在线| 亚州综合AⅤ| 丝袜剧情| 人妻天堂网| 婷婷色网| 99在线免费视频| 超碰免费人妻人人| 亚洲天堂资源在线| 欧美天天综合站| 人人插人人搞人人操| 美女诱惑一区| 97情超碰色| 青青11操操操操操操操操| 丰满人妻被猛烈进入中| 毛片麻豆91糖心精品毛情片| 野狼激情网| 26UUU欧美激情一区二区| 久99久视频| 国产深夜福利| 四虎精品永久在线观看| 日韩情色AV| 91丨九色丨大屁股| 一类无码操逼视频| 热99这里有精品综合久久 | 国产AV久久久蜜爱影集| 精品在线观看视频在线| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 色色99| 女人 A一级| 亚洲av无码国产精品字幕| 蜜臀99久久精品| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 中文字幕啊啊啊在线观看视频| 97爱| 九九无码| 少妇无码999| 综合天天网| 熟女精品一区二区三区| 色99视频| 黄色av片三级三级三级免费看| 啊啊啊想要| 婷婷九月国产| 色九九久九九| 午夜舔阴达高潮视频免费看| 呦呦影院| 国产精品麻豆免费视频| 性爱网站一区二区| 无码人妻一区二区三区色欲aⅴ | 91网站18在线| 欧美91丝袜| 无码人妻丰满熟妇奶水区毛片| 婷婷中文字幕| 混色激情av| 成人婷婷丁香| 欧美大码在线视频| 成人日本精品九区| 99色婷婷中文字幕乱色| 色香91| 日韩欧美天天爽爽爽天天爽爽| 欧美色图私拍91| 夜夜爽妓女| 99re不伦| 插老姨肥穴| 自拍欧美| 夜夜嗨免费视频| 日韩色图 一区二区| 裸体1区| 美女主播色欲91抠b在线播放| 国产污视频麻豆传媒一区二区 | 中文字幕日本久久| 两性综合网| 亚洲aV无码成人在线观看| 欧亚乱色熟女一区二区| 99热这里只有精品99| 99热精品在线| 九九热免费国产视频婷婷伊人| 99视频只有精品| 99热精品在线| 好湿好紧好爽 视频| 欧美熟爽综合| 日韩9999| 激情文学亚洲| 日韩熟女三十乱伦| 亚洲一曲日韩精品| 91超碰人人操| 后入人妻一区| 国产热av| 91老熟妇| 色欲日韩欧美在线一区| 裸体美女国产免费久久久网站| 精品女人999| 久久久性爱视频| 亚洲青青草| 91丝袜视频在线观看| 久久久亚洲熟妇熟女| www.亚洲黄色| 97干在线视频| 91国产美女丝袜足交精品视频| 国产精品一区二区后入| WWW.操逼.COM| 日韩精品视频在线观看一卡二卡| 欧美 亚洲 制服 精品| 99re8超碰| 操淫穴亚洲五月丁香 | 超碰国产精品无码| 日本在线激情一区二区三区| 国产自产91区13区| 密臀成人视频久久久| 无码天堂| 日韩免费性爱视频在线观看| 大香蕉色欲AV| 精品人妻一区| 四虎AV无码| 97人人夜| 亚洲成人久久美女| 清清草影| 一起草三级AV电影在线观看| 日韩精品一区二区三区色欲| 日韩懂色网| 国产999精品久久久| 亚洲三区视频| 欧美另类色| WWW美腿丝袜香蕉中文| 精品九九九九| 久操热线| 国产丝袜高跟美女av免费观看| 韩国一级做a久久久久| 91成人精品在线播放| 96爱综合| 欧美精品精品一区二区| 992这里有精品| 精品无码久久| 国产伦乱91| 亚洲和欧美裸体美女双飞视频| 农村女一级毛卡片| 日本三级韩三级99久久| 欧美色性情| 亚洲AV成人无码久久精品播放| 成人精品一区二区三区| 亚欧性爱无码| 欧美日韩国产电影| 日本无码1| 屌妞视频久久久久久久久久久久| 狠狠婷婷亚洲中文综合久久| 校园春色欧美色图| 天天狠操| 综合久久99亚洲人妻中文在线| 欧美一区二区三区四区综合| 精品人妻一区二区三区视频| 在线无码视频| 人妻人妻天天碰| 秋霞免费无码视频日韩A片| 久久亚洲影院一区二区| J?P?NESEHD熟女熟妇伦| 日本九九久久99播| 亚洲中文字幕精品一区| 亚洲综合图片在线| 亚洲高清无码在线桃色| 国产AV线| 亚洲人妻av| 中文字幕一区二区三区人妻不卡| 色五月亚洲| 亚洲精品 欧美97色色| 91狠狠综合久久| 9久久久久久| 99婷婷| 九九九九九九视频免费| 日韩中文字幕熟妇人妻| 性色av网站| 日本熟妇人妻一区二区三区| 97色插| av爱爱爱| 五月天亚洲网| 91久精品| 东北丰满熟女国产一区| AV天黑人| 欧美日韩情色一区二区| 中文字幕一区二区三区字幕| 超碰人妻中文在线| 少妇高潮对白在线观看| 少妇综合| 日本好吊色视频| 人人操人人大香蕉| 国产精品人妻无码久久久互動交流 | 韩国黄色片精品久久久| 久久老女人| 天堂麻豆天美| 天天躁日日躁AAA片李宗瑞| 97在线视频免费看| 美骚妇av高清在线| 欧亚免费视频| 自拍偷拍国产欧美日韩韩| 午夜毛片高清免费不卡| www.夜夜操| 女人天堂av在线播放| 成人综合网 欧美| 日韩美女啪啪一区| 九九热精品| 色老汉色| 婷婷亚洲综合| 国产毛片在线| 亚洲色图欧美色图另类图片| 97在线欧| 亚洲精品骚逼| 婷婷丁香五月激情啪啪| 亚洲囯产精品女人久久久| 这里只有97精品| 91综合站| 99精品丰满人妻无码| 久久久精品国产亚洲伊人| 日韩黄片视频试看| 欧美激情综合网| 日韩无码久久熟女一级片| 天天干天天做| 亚洲精品三| 久久久久久久久成人av解说| 精品免费视频国产一区| 免费国产视频| dy888午夜老子影视达达兔| 亚洲文学偷乱拍啪啪啪啪| xxx亚洲午夜天堂| 亚洲啪啪性视频| 国产欧美精选自拍一区| 天天日天天操天天射河南省| 97资源站日韩| 久久久亚洲精品中文字幕人妻| 国产熟女精品区| 九九精品美女高溯喷水| 日本高清电影欧美色图| 精品视频久久久久九九九九9999| 插日本熟女视频| 久久久精品电影| 欧美亚洲情色| 九九九网站| 亚洲综合色图欧美| 五月丁香亭亭| 色婷婷久久| 国模精品娜娜一二三区| 久久久麻豆精品| 日韩精品一区二区日韩| 国产精品美女在线一区| 日韩国产不卡在线视频| 天天干干天天干干| 午夜.DJ高清在线观看免费7| 国产Av超碰| 成人五级久久| 人妻丰满熟妇一区二区三| 黄色av播放免不| av东京热男人的天堂| 中文字幕97色| 亚洲情色一区二区三区| 懂色av中文字幕一区二区三区天美| 超碰97最新人妻| 1二区9| 久神马| 国产欧美后入| 欧美瑟综合| 亚洲欧美国产精品久久久久久久| 一卡二卡三卡| 大香蕉一级黄色片久久| 国产在线综合网| 欧美精品精品一区二区| 人人艹亚洲| 精品久久久久久中文| 老司机射| 人妻精品综合中文字幕在线 | 日韩不卡网操逼中文字幕日韩| 亚洲第91页| 九一国产精品| 97色97干| 可以在线观看AV的网站| 五月天伊人| 天天影视色香色欲| ai欧美亚洲小说| 俺也射| 东北女人高潮视频| 2017av无码免费无线播| 在线国产福利网址导航| 免费观看的av| 亚洲欧美天堂在线| 男人天堂最新手机版在线青青草| 国产综合色精品在线观看| 精品国产无码中文| 免费看一级a性色生活片久久无| 九九九九九九九精品视频| 18一区二区三区| 亚洲91网站| 久久久999国产| 色综合一区二区三区| 狠狠操官网| 日本岛国黄色网址| 国产婷婷一区| 亚洲 欧美 日本 国内 首页| 国产无码精品成人| 凹凸视频特色日本特黄| 青苹果影院男人的天堂| 91制服丝袜| 久久香蕉超碰97国产精品 | 磁力99AV| 一本久道久久综合狠狠爱一密臀精 | 蜜桃臀一区二区aV| 欧美中文字幕日韩在线| 丁香五月激情综合国产| 97视频在线观看高清资源| 欧美另类丝袜熟女| 中文日本免费高清| 91丨国产丨白浆| 久久华人网| 亚洲无码偷拍| 95人妻爽爽人人做人人澡| 伊人991| 97超碰人人操人人操| 手机看片1024你懂的国产| 日本免费不卡二区| 南澳成人一级片在线播放| 日韩黄片视频试看| 中文字幕精品人妻丝袜| 久久嫩草| 99精品久久久久久久婷婷蜜桃| 91欧美美女日韩国产婷婷| 97资源亚洲| 亚洲精品一区二区三区在线播放| 美国久久一二三四| 人人人干干人人干| 国产乱码久久| 亚洲清纯综合| 图片区小说区| 久久久久久久久久久精| 美女午夜福利免费视频| 精品一区二区三区四区女 | 超碰9 7女人| 欧美精品一区二区少妇免费A片| 精品久久久av| 精品久久久av无码免费| 旡码电影特区| 亚洲综合91| 久久性视频| 久久风骚城市| 免费综合亚洲中文| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 婷婷丁香五月综合| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 久久久久久97| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 亚洲激情在线观看一区| 麻豆精品三区视频| 国产精品久久久久久 百度| 69久久久久久久久久久久久| 午夜福利免费精品视频| 日韩二区三四区五区六区在线看| 国产男人又猛又粗又爽| 大屁股熟女一区二区三区| 日韩黄色一区二区三区| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 精品一区二区三区丰满熟女-亚洲欧美一区| 激情接吻视频久久久久久| av草草在线电影| 深田咏美亚洲精品福利社| 激情文学小说一区二区| 色丁香久久| 美女91在线| 人妻天堂综合网| 狠狠操狠狠操操| 亚洲综合影视| 午夜爽爽爽在线观看永久入口姬片| 九九av| 影音先锋国产精品| 国产精品内射婷婷一级二| 97日视频| 婷婷丁香久久| 尹人免费观看视频在线| 五月天亚洲网| 久久久蜜桃一区二区三区| aaa亚无码专区| 美女AV一区二区| 综合久久欧美| 欧美性爱第一页久久| 偷拍综合亚洲| 麻豆精品久久久久久久| 盗摄女人妻在线| 97综合激情| 亚洲丝袜色图| 亚洲操人| 久综合国内精品自在自线| 少妇精品久久久八区九区| 水澄无码AV| 少妇人妻好深太紧了vr91| 天堂网亚洲区手机版| 麻豆区99999| 色久桃花影院在线观看| 久久区| 国产精品3| 欧美亚洲激情小说| 亚洲综合中文字幕有码| 亚洲春色一区二区三区| 久久97视频| 性色av一区二区| 视频二区美腿丝袜制服人妻欧美| 黄片色区软件| 乱伦熟女论坛| 久久久亚洲精品中文字幕人妻| 国产传媒美日韩av| 日韩免费人妻色情网站| 国产区性爱在线视频秋霞豆| 欧美一区二区福利在线| 人妻少妇精品| 超碰精品97| 老司机久久| 国产精品小视频一区二区三区| 人人考人人摸人人干| 一区二区免费电影久久| 精品国产乱码久久久久久网站入口| 五月开心久久AV官网| 人妻久热在线| 婷婷成人五月天| 国产亚洲禁久一区二区| 亚洲一区二区三区中文字幕| 亚洲**2021在线观看| 天天92av| 亚洲综合嫩| 在线情色电影 91大 | 人妻在线大香蕉| 偷窥自拍亚洲色图| 成人综合色网| 最新加勒比丝袜在线| 欧美日韩999| 在线观看日韩av不卡| 日本三级一区二区 在线| 新亚洲无码| 狠狠超| 久久粉色| 蜜臀99久久精品久久久懂爱| 99re在线| 韩国一级做a久久久久| 人妻天堂网| 日韩一卡二卡三卡| 亚洲丝袜少妇在线| 欧美亚洲宗合色性图| 性性欧美| 丝袜狂射91| 五月丁香综合| 精品视频一二三中文| 日韩激情啪啪| 激情终合网| 欧美性爱五月天| 另类天堂| www.久久| 中文字幕人妻丝袜| 91天天日| 日韩少妇丰满亚洲| 日韩欧美丝袜诱惑| 亚洲色91C| 日日干男人的天堂| 国产久久男人天堂| 久久中文字幕女同性恋一区| 9997se| 99re6在线视频精品免费完整版安卓版| 韩国国产欧美情侣视频在线| 色香91| 国产91美女视频| 国内一区二区免费| 亚洲日韩人妻中文字幕一区| 日韩中文字幕精品一区在线| 中文字幕亚韩| 亚洲 欧美 天天| 欧美综合97www| 日韩在线97| 中文无线日韩一区| 综合久久99| 9国产超碰| 伊人网综合在线视频| 欧美婷婷五月天| 精品久久視頻在线| 91路www| 精品人妻一区二区三区视频在线| 欧洲射精91| 2019午夜福利视频| 久久久91| xxxx网站亚洲精品| 五月天开心网| 激情视频一二三| 欧美激情精品久久久久久| a片自拍直播视频| 最新的亚洲无吗| 97久久精品亚洲| 狠色婷婷久久一区二区三区_| 久久久女人| 日韩精品在线放| 日本 欧美 国产一区| 一区,二区,三区网站| 后入福利视频| 国产精品无码成人精品| 91站街按摩店老熟女熟女| 超碰午夜在线| julia国产在线| 高潮的A片激情扒开一区| 久久女婷| 日日干夜夜欢| 翔田千里Av在线| 亚洲 日韩 欧美 国产综合体| 亚洲精品蜜桃久久久久久久| 国产色图乱伦| 99无码精品| 久久九操在线观看| 操逼日批| 男人的天堂.com| 精品天堂| 色色五月婷| 夜夜操一区二区| yaouchengrenav| 日本色婷婷| 婷婷五月天色网| 女人被男人桶爽视频网站| 超碰 97国产熟女| 四虎av在线| 日本五十路熟女一区二区| 青青草伊人久久| 精品久久久久久久| 色色国产| 麻豆AV一区二区天美传媒| 最新国产亚洲精品精品国产亚洲综合| 久操网在线| 性暴力欧美猛交在线直播| 东北女人无套内谢视频| 五月天社区| 91精品操美女| 亚洲精品乱码久久久久久蜜桃麻豆| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 9999九九九久久久| 亚洲国产一区二区入口| 欧美aⅴ99久久黑人专区| 五月丁香六月综合缴清无码 | 富二代亚洲精品99| 人人操,人人液| 欧美制服另类丝袜| 国产成人在线观看网址| 人妻夜夜爽天天爽麻豆三区网站| 校园春色 欧美| 校园春色制服丝袜中文字亚洲| 精品人妻一区二区免费看| 婷婷九月色| 91爱啪| 91天天日| 日韩福利综合一区| 国精综合一二三区影视| 草草网站影院白丝内射| 国内外毛片在线观看| 国产97色在线| 熟女人妻精品一区二区视频| 国产精品久久发布| 欧美一区二区日韩三区| 无码操逼天堂| 99人人干| 国产精品不卡av免费在线观看| 极品粉嫩一区二区| 国产日韩区| 男人的天堂无码| 丁香六月啪啪| 福利视频香蕉免费一区二区在线| 伊人国产视频| 国产 三级自拍| 大香蕉淫人| 蜜桃久久久久久久| 美国aaaaa一级黄片| 欧美性第1页| 极品五月天噜噜| 91日产欧美| 一起草精品人妻| av中亚| 99蜜桃臀久久久欧美精品网站| 国产 日韩 另类 视频一区爱| 美女91| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 亚洲aV性爱| 污色区网站| 91超碰在线播放| 农村妇女一级二级三级视频| 久综合国内精品自在自线| 日本精品一区二区三| 欧美日韩国产传媒在线精品| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 日韩国产品视频中文字| 岛国AB视频| 人妻少妇精品| 性九九九九九九| 日本有码影片下载| 久久性爱网站| 亚洲电影中字一区二区| 国产自偷| 青青国产在线拍揄自揄拍| 91丨九色丨国产打屁股| 尤物视频一区| 日本天天干天天操一区| 久欲AV| 国产传媒美日韩av| 狠狠综合网| 日韩成人精品视频自拍| 100啪啪视频大全| 久久香蕉国产线看观看亚洲女人 | 人人妻人人爽| 97在线资源| 熟妇视频一区二区三区在线观看| www.激情| 网页导航五月天免费一二三区 | 9久久久久久| 99re6国产精品99re| 中文字幕亚洲欧美在线不卡| 日本 欧美 亚中文字幕| 国产浮力影院第1页| 在线观看不卡一区二区三区| 女性91网站| 91欧| 精品免费成人久久| 啊啊啊不要嗯嗯在线观看| 亚洲情色图片区| 毛片视频白嫩| 91狠婷| 五月丁香婷婷色| 每日更新AV| 国产精品免费日韩| 在线观看成人性爱免费小视频| 97香蕉网| 午夜性刺激视频免费观看| 男女啊啊啊| 欧美日韩亚洲少妇寂寞影院正在播放| 日韩三级性| 91女优在线观看| 日本精品久久久久久久| 色娱乐色呦呦夜夜夜夜av| 人人综合| 欧美后入视频| 天天色怡春院| 国产精品久久久久久久久久久久久久久| 无码一区二区三区四区五区六区七区八区九区十区视频 | 在线观看十八禁| 日韩AV电影网站| 欧美第一页性| AV天天综合| 青青11操操操操操操操操| 极品色社| 嗯嗯啊啊啊好舒服| 欧美精品丝袜久久久中文字幕| 97青青操视频| 少妇500双飞99| 亚洲免费97免费| 欧美999999| 四虎在线免费视频| 亚州五月| 欧美天天射| 亚洲无992tv| PMv在线观看| 草草影院日本第一页| 一区二区三区黄片免费观看| 中文字幕精品资源在线| 婷婷五月色| 日本青青草在线| 密臀视频一区二区三区| 成片免费观看视频大全| 国产久久一区二区午夜| 欧美激情欧美精品| 久久精品成人一区二区三区蜜臀 | Julia Annxxxxx| 五月天久久人妻| 亚洲欧美日韩偷拍色图| 为用户提供免费看黄网址在线观看| 日日操丁香五月天| 婷婷99狠狠| 啊嗯好大视频在线观看| 欧美性天天影院| 免费在线视频97| 人妻二区| 3p国产欧美99热| 婷婷三区| 精久久久| 乱伦熟妇一区二区| 人人爱人人操人人性| 国产少妇肉丝在线观看| 久久 亚洲 日韩 人妻| 青青草一区二区三区四| 起碰97| 国产第25页在线观看| 亚洲另类综合欧美| 激情人妻另类| 蜜桃狠狠色伊人亚洲综合网站| 啪啪视频亚洲第一| 99亚洲精品| 精品成人女人久久| 亲子敌伦对白在线播放| 操我无码| 欧美亚洲第1页| 亚洲乱熟女一区二区| 国内毛片欧美香蕉精品| 美女被艹尤物视频| 久久99手机免费视频| 职场同事知名国产国产精品久久欧美日韩| 国产97色在线 | 亚洲| 91超碰在线| 91干熟女| 91无码人妻| 国产精品福利资源在线尤物| 激情小说五月天| 操淫穴亚洲五月丁香| a片自拍直播视频| 91久久99久久91熟女精品| 久操在97| 韩国三级一线观看久| 亚洲精品男人的天堂| 美女爽爽爽刺痛洞洞| 国产三级资源在线观看| 无码99| 亚洲三级。日韩三级| 五月天玖玖资源站| 日韩少妇在线视频| 囯戸精品高潮呻吟旡码| 偷窥自拍亚洲色图| 熟妇色99| 国产免费一区二区在线A片视频| 风月影院男女十八禁| 国产最火爆久久国产网站网站| 日本精品一区三区| 麻豆一区二区AV天美| 一级啊性爱在线视频| 久噜噜| 欧美精品一区二区少妇免费A片 | 亚洲av无码成人精品国产| 97就爱干| 日本女优在线视频福利| 亚洲一级特黄大片在线播放91| 久久综合久久综合人久久夜精品| 啊啊啊啊啊啊好多水| 丁香五月激情五月| 600国产精品视频| 国产99热| 屁股久久久久久久久久| 国产剧情一区在线观看| 伊人麻豆传媒| 亚洲天堂区| 96精品久久久久久久久| 97色五月天完| 亚洲伊人成综合成人网| 亚州成人a∨| 亚洲日韩人妻中文字幕一区| 歐美一級亂黃99在綫精品| 草草草视频在线免费看| 美女裸体麻豆天美蜜桃91| 午夜a成v人电影| 青娱乐亚洲热| 日躁天天爽爽| 亚洲黑丝在线| 国产精品成久久久久午夜午夜| 欧美欲色| 少妇人妻太紧太深av| 少妇内射视频| 99热精品在线播放| 亚洲日韩电影| 91撸色网 玖玖网 欧美| 先锋激情∨在线视频播放| 欧美亚洲涩涩| www.色婷婷色综合| 天天日夜干| 一区=区三区视频| 日本日逼高清| 欧日韩一二三f区| 大香蕉亚洲中文| 无码一区免费在线不卡| 日夜干射色啊| 强奸乱伦动态污图免费| 日韩欧视频| 用力操死我| 人人插人人摸人人| 夜夜欧美| 欧美A√综合网| 国产亚洲精品自在线亚洲情侣| 天天伊人| 传媒免费一区二区三区| 欧美在线播放aaaa| 黄色免费一级在线毛片| 啊嗯嗯啊好大好爽| 亚洲有码 欧美精品| 91精品久久久久五月天精品 | 亚州色图欧美| 丁香五月天堂网| 日韩操逼性鲍| 久久久亚洲精品中文字幕人妻| 色九九九| 91操碰| 国产亚洲女v在线观看| 极品五月天噜噜| 丁香六月激情| 日本久久超碰| 国桃视频产巨乳精品一区二区在线| 色综合五月天| 日韩激情小说一区二区| 超碰97亚洲| 校园春色欧美| 800zy一区二区| 久草视频分类在线| 色欲三区| 1240青青草一区二区三区视频天爱| 欧美色日本| 日韩乱码Av| 久久肏大逼| 国产精品人人爽人人做可爱福利| 欧美激情在线观看视频| 日本高清熟女久久一区| 亚洲男人的天堂V| 综合啪啪| 东亚亚洲无码高清| 亚洲AV成人无码一二三久久| 亚洲风情在线观看| 神马九九九| 人人澡综合涩| 在线观看十八禁| 五月丁香| 国产情侣自拍在线播放| 日韩在线性爱免费视频| 欧美精品久久96人妻无码| 久久国产精品一区二区| 中出人妻中文字幕91在线| 伊人一区二区三区| 超碰 另类 欧美 | 五月丁香综合激情| 一个人免费HD91视频| 操逼www.| 少妇人妻好深太紧了vr91| 日韩成人性日韩成人性爱视频在线免费观看 | 欧美老熟另类| 久久男人的天堂国产| 亚洲日韩精品在线播放| 欧美顶级黄色大片免费| 樱花蜜乳av| 成人小说视频在线精品欧美| 天天草天天日| 精品人妻中文字幕高清| 97超碰中文在线| 中文字幕精品码亚洲| 伊人宅男大香蕉| 久草色在线观看| 亚洲欧美变态| 免费视频观看60秒| 色亚洲欧美| 91白嫩| 精品人妻一区二区三区鲁大师| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 亚洲国产精品乱码在线观看| 中文字暮97| 久久久9视频| 欧美性爱一内片一区二区三区| 人妻精品综合中文字幕在线 | 日本女人久久久| 免费视频一二三区| 黄骗免费网站| A级片日韩欧美国产欧美视频精选观看| 搡老女人911熟妇老熟女| 人人操人人爽人人操人人| 美日韩男女操屄视频| 69少妇一区二区| 国产成人精品无码久久| 人人操人人摸人| 日韩有码专区| 大香蕉一级黄色片久久| 乱伦一二三区| 亚洲天堂人妻熟妇视频| 亚洲欧美日韩夜夜| 日韩精品一区二区三区四虎影视| 久操99| 久久这里| 国产后入式在线观看| 熟妇人妻丰满久久久久久久无码 | 后入日本1234| 97天天日| 中文字幕精品一区欧美| 黄片不用下载在线观看| 人妻天堂综合网| 熟女自慰久久久| 九热超碰| 久久六六| 久久美女国产| www.狠狠操| 日本999精品视频| 九九人妻| 亚洲综合另类| 美女极品一区二区三区| 亚洲人妻av| 一区二区三区日韩欧美 | 久久久999国产精品| 久久在线观看免费视频| 欧美日本国产日韩激情视频| 99爱视频| 麻豆精品天美| 亚洲美女精品九九视频| 懂色中文一区二区三区 | 无码最新| 日韩pv中文| 国产成人精品一区| 黄骗免费网站| 亚洲欧美在线观看2021| 99国产精品人妻人伦| 精品国产乱码久久久兰草影视| 熟人人妻少妇精品久久| 日韩成人性日韩成人性爱视频在线免费观看| 国产高清免费不卡av| renqi久久久久久久久久久久| 屌妞视频久久久久久久| 人人操人人摸超碰| 国产精品久久久无码AV网站| 女优视频第10页| 久久熟女久| 99999精品| 国产AV久久久蜜爱影集| 国产综合久久久鬼色| 欧美激情内射| 高跟丝袜AV专区国产| 欧洲Au麻豆| 亚洲人妻五月丁香婷婷| 日本视频一区二区三区| 国产乱婷婷精品二区三区| 性欧美第一页| 亚洲无码免费看| 九一屌逼| 久久精品一区二区| 色色色色综合网| 91高潮喷水美女| 三男一女不戴套的A片| 久久国产视频性吧| 骚熟女AV网| 殴美在线AⅤ| 久久久穴999| 欧美亚洲一区二区久久久婷精品大包诱| 91天美免费| 人人操人人操草草| 久久大陆| 国产精品探花色| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 久久婷婷一区| 家庭乱伦网站国产| 秋霞一区二区三区四区五区六区七区| a级免费在线观看| 一本一道人妻久久一区二区三区 | 97一区二区三区视频| 波多野结衣之双飞调教在线播放| 精品国产一区二区三区av在线资源| 欧美人妻一区二区| 无码聚合| 99最新日韩偷拍视频| xxx0国产在线播放| 久久久禁| 乱伦1色页| 欧美情色男人的天堂| 人人人摸人人| 老熟女熟妇| 日本人妻伦在线中文字幕| 亚洲 中文 女同| 97干在线| 91丝袜在线观看视频在线观看| 东京热一区二区中文字幕| 超碰公开久久网| www国产无码| 国产精品久久发布| 日韩成年人性爱视频| 国产精品一区二区在钱播放| 亚洲综合影院| 超碰97资源中文字幕| 国产亚洲日韩欧| 亚洲色资源| 青草青草久热| 精品熟妇视频一区二区| 色婷婷综合网站| 亚洲色图欧洲| 丝袜内射| 岛国免费黄色网址| 久久视频,这里只有精品 | 国产精品亚洲免费| 欧美综合色图网| 玖玖综合.com| 天天干天天舔| 熟女高潮合集-永久久久-成人AV| 波多野结衣先锋影音| 精久久久| 色欧美天天| a片偷拍视频| 97精品在线| 九色视频91| 欧洲在线性爱视频| 97天天弄| 久久久国产三级黄色片| 日日摸天天爽夜夜欢| 中文字幕88av在线| 无色无码| 视频不卡中文字幕| oumeizonghese,www| 国产激情片在线观看| 国产熟女精品一区二区| 少妇极品熟妇人妻无码| 曰韩av中文字幕专区| 日本精品999| 国产精品丝袜久久亚洲不卡| 丁香五月久久| 久久亚洲国产成人| 呻吟 欧美 日本 中出| 6080yy午夜理论三级一区二区三区无码| 日本精品中文字幕视频| 色综合 加勒比| 天天综合网国产| 国产亚洲精品农村妇女| 伊人超碰97| 另类 综合 日韩 欧美 亚洲| 美女啊啊啊啊啊| 蜜桃色院一区久久 | 啊v视频在线观看| 影音先锋日本乱伦| 欧美色老汉| 夜夜狠狠躁日日躁色视频| 午夜天堂啪啪| 中文日本免费高清| 国产精品熟女一区二区三区| 国产久久日| 69精品少妇一区二区三区蜜桃| 97人妻免费中文字幕| 亚洲国产精品无石码久久| 亚州欧美综合| 熟女一区二区| 色九月婷婷| 综合欧美激情网| 人人看黄色视频| 97亚洲精品超碰| wuyechaopeng| 人妻 欧美 中文| 国内精品999| 国产成人无码网站在线视频| 午夜超爽| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 久草免费在线视频| 很狠操| AV在线资源| 精品免费1| 婷婷久久五月天| 人人操人人大香蕉| 日韩人妻制服丝袜av| 曰韩中文人妻视频| 一本色道人妻久久| 老鸭窝日丰县女人| 丰满精品人妻少妇久久字幕| 国产精品91一样| 9 9精品一区二区三区| 婷婷AV一区二区三区| 午夜120视频在线观看| 人人摸.人人色| 日欧操屄| 久久在线观看免费视频| 午夜毛片亚洲精品片国产久久久| 天天综合网视频91| 国产麻豆一区二三区| 青青伊人久久| 91国产美女丝袜足交精品视频 | 婷婷五月天久久久| 国产小视频91| 一级特级aaaa毛片免费观看 | 亚州综合色| 超碰人妻久久| 国产成人五月天丁香花| 日本道人妻久久久在线不卡色视频| 无卡一区=区| 亚洲 欧美 综合 91| 久久久久久久9最新免费视频观看| 精品国产乱码久久久兰草影视| 97国产天堂岛| 天堂伊人久久| 韩国女主播青草在线| **一级毛片国产| 韩国一级婬片A片AAAAA| 国产美女高潮叫床视频| 欧美亚洲中文字幕| 国产亚州日韩欧美看片| 中文字幕在线免费观看视频| 激情综合五月丁香| 伊人色综合网| 超碰日本97美女人妻人人玩人人爱 | 欧美性天天| 成人日本精品九区| 日韩精品第3页| 天天操天天日天天干| 啊啊啊啊在线播放| 91成人精品| 国产精品久久| 十八禁视频一区二区| 久久美女国产| www…国产操逼| 开心激情婷婷| 白丝1区2区3区| 东京成人一区| 九九人妻| 精…码一二三区| 亚洲 中文字幕 精品| 日本日逼高清| av国产无码| 97青青操视频| 亚洲激情色片| 97视频免费在线| 日本色日夜干| 手机在线免费看的av| 秋霞蝌科网日本一区| 九色PORNY9l原创自拍| 欧美中文字幕男人天堂久久精品| 免费人人搞97| 欧美日韩国产色五月综合在线| 啊啊啊啊啊啊在线| 伦激情人妻另类人妻| 717影院理论午夜伦八戒| 女人的久久久| 涩涩久久精品| 麻豆AV一区二区天美传媒| 综合亚洲欧美精品日韩?v| 欧美日韩香蕉| 91丨国产丨白浆| 欧美精品,四区。五区| 久久色网| 国产欧美亚洲精品a第2页|