久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表

發(fā)布時間:2025/3/21 javascript 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

【從蛋殼到滿天飛】JS 數(shù)據(jù)結(jié)構(gòu)解析和算法實現(xiàn),全部文章大概的內(nèi)容如下: Arrays(數(shù)組)、Stacks(棧)、Queues(隊列)、LinkedList(鏈表)、Recursion(遞歸思想)、BinarySearchTree(二分搜索樹)、Set(集合)、Map(映射)、Heap(堆)、PriorityQueue(優(yōu)先隊列)、SegmentTree(線段樹)、Trie(字典樹)、UnionFind(并查集)、AVLTree(AVL 平衡樹)、RedBlackTree(紅黑平衡樹)、HashTable(哈希表)

源代碼有三個:ES6(單個單個的 class 類型的 js 文件) | JS + HTML(一個 js 配合一個 html)| JAVA (一個一個的工程)

全部源代碼已上傳 github,點擊我吧,光看文章能夠掌握兩成,動手敲代碼、動腦思考、畫圖才可以掌握八成。

本文章適合 對數(shù)據(jù)結(jié)構(gòu)想了解并且感興趣的人群,文章風格一如既往如此,就覺得手機上看起來比較方便,這樣顯得比較有條理,整理這些筆記加源碼,時間跨度也算將近半年時間了,希望對想學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人或者正在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人群有幫助。

哈希表

  • 哈希表相對于之前實現(xiàn)的那些數(shù)據(jù)結(jié)構(gòu)來說

  • 哈希表是一個相對比較簡單的數(shù)據(jù)結(jié)構(gòu),
  • 對于哈希表來說也有許多相對比較復(fù)雜的研究,
  • 不過對于這些研究大多數(shù)都是比較偏數(shù)學(xué)的,
  • 對于普通的軟件工程軟件開發(fā)來講,
  • 使用哈希表了解哈希表的底層實現(xiàn),并不需要知道那么多的復(fù)雜深奧的內(nèi)容,
  • 通過 leetcode 上的題目來看哈希表

  • leetcode 上第 387 號問題,在解決這個問題的時候,
  • 開辟的一個 26 個空間的數(shù)組就是哈希表,
  • 實際上真正想做是每一個字符和一個數(shù)字之間進行一個映射的關(guān)系,
  • 這個數(shù)字是這個字符在字符串中出現(xiàn)的頻率,
  • 使用一個數(shù)組就可以解決這個問題,
  • 那是因為將每一個字符都和一個索引進行了對應(yīng),
  • 之后直接用這個索引去數(shù)組中尋找相應(yīng)的對應(yīng)信息,也就是映射的內(nèi)容,
  • 二十六的字符對應(yīng)的索引就是數(shù)組中的索引下標,
  • 當每一個字符與索引對應(yīng)了,
  • 那么對這個字符所對應(yīng)的對應(yīng)的內(nèi)容增刪改查都是 O(1)級別的,
  • 那么這就是哈希表這種數(shù)據(jù)結(jié)構(gòu)的巨大優(yōu)勢,
  • 它的本質(zhì)其實就是將你真正關(guān)心的內(nèi)容轉(zhuǎn)換成一個索引,
  • 如字符對應(yīng)的內(nèi)容轉(zhuǎn)換成一個索引,然后直接使用數(shù)組來存儲相應(yīng)的內(nèi)容,
  • 由于數(shù)組本身是支持隨機訪問的,
  • 所以可以使用 O(1)的時間復(fù)雜度來完成各項操作,
  • 這就是哈希表。
  • // 答題 class Solution {// leetcode 387. 字符串中的第一個唯一字符firstUniqChar(s) {/*** @param {string} s* @return {number}*/var firstUniqChar = function(s) {const hashTable = new Array(26);for (var i = 0; i < hashTable.length; i++) hashTable[i] = 0;for (const c of s) hashTable[c.charCodeAt(0) - 97]++;for (var i = 0; i < hashTable.length; i++)if (hashTable[s[i].charCodeAt(0) - 97] === 1) return i;return -1;};/*** @param {string} s* @return {number}*/var firstUniqChar = function(s) {const hashTable = new Array(26);const letterTable = {};for (var i = 0; i < hashTable.length; i++) {letterTable[String.fromCharCode(i + 97)] = i;hashTable[i] = 0;}for (const c of s) hashTable[letterTable[c]]++;for (var i = 0; i < s.length; i++)if (hashTable[letterTable[s[i]]] === 1) return i;return -1;};return firstUniqChar(s);} } 復(fù)制代碼
  • 哈希表是對于你所關(guān)注的內(nèi)容將它轉(zhuǎn)化成索引

  • 如上面的題目中,
  • 你關(guān)注的是字符它所對應(yīng)的頻率,
  • 那么對于每一個字符來說必須先把它轉(zhuǎn)化成一個索引,
  • 更一般的在一個哈希表中是可以存儲各種數(shù)據(jù)類型的,
  • 對于每種數(shù)據(jù)類型都需要一個方法把它轉(zhuǎn)化成一個索引,
  • 那么相應(yīng)的關(guān)心的這個類型轉(zhuǎn)換成索引的這個函數(shù)就稱之為是哈希函數(shù),
  • 在上面的題目中,哈希函數(shù)可以寫成fn(char1) = char1 -'a',
  • 這 fn 就是函數(shù),char1 就是給定的字符,
  • 通過這個函數(shù) fn 就把 char1 轉(zhuǎn)化成一個索引,
  • 這個轉(zhuǎn)化的方法體就是char1 -'a',
  • 有了哈希函數(shù)將字符轉(zhuǎn)化為索引之后,之后就只需要在哈希表中操作即可,
  • 在上面的題目中只是簡單的將鍵轉(zhuǎn)化為索引,所以非常的容易,
  • 還有如一個班里有 30 名學(xué)生,從 1-30 給這個學(xué)生直接編號即可,
  • 然后在數(shù)組中去存取這個學(xué)生的信息時直接用編號-1
  • 作為數(shù)組的索引這么簡單,通過-1 就將鍵轉(zhuǎn)化為了索引,太容易了。
  • 在大多數(shù)情況下處理的數(shù)據(jù)是非常復(fù)雜的,
  • 如一個城市的居民的信息,那么就會使用居民的身份證號來與之對應(yīng),
  • 但是居民的身份證號有 18 位數(shù),那么就不能直接用它作為數(shù)組的索引,
  • 復(fù)雜的還有字符串,如何將一個字符串轉(zhuǎn)換為哈希表中的一個索引,
  • 還有浮點數(shù),或者是一個復(fù)合類型比如日期年月日時分秒,
  • 那么這些類型就需要先將它們轉(zhuǎn)化為一個索引才可以使用,
  • 相應(yīng)的就需要合理的設(shè)計一個哈希函數(shù),
  • 那么多的數(shù)據(jù)類型,所以很難做到每一個鍵通過哈希函數(shù)
  • 都能轉(zhuǎn)化成不同的索引從而實現(xiàn)一一對應(yīng),
  • 而且這個索引的值它要非常適合作為數(shù)組所對應(yīng)的索引。
  • 這種情況下很多時候就不得不處理一個在哈希表中非常關(guān)鍵的問題

  • 兩個不同的鍵通過哈希函數(shù)它能對應(yīng)同樣一個索引,
  • 這就是哈希沖突,
  • 所以在哈希表上的操作也就是在解決這種哈希沖突,
  • 如果設(shè)計的哈希函數(shù)非常好都是一一對應(yīng)的,
  • 那么對哈希表的操作也會非常的簡單,
  • 不過對于更一般的情況,在哈希表上的操作主要考慮怎么解決哈希沖突問題。
  • 哈希表充分的體現(xiàn)了算法設(shè)計領(lǐng)域的經(jīng)典思想

  • 使用空間來換取時間。
  • 很多算法問題很多經(jīng)典算法在本質(zhì)上就是使用空間來換取時間,
  • 很多時候多存儲一些東西或者預(yù)處理一些東西緩存一些東西,
  • 那么在實際執(zhí)行算法任務(wù)的時候完成這個任務(wù)得到這個結(jié)果就會快很多,
  • 對于哈希表就非常完美的體現(xiàn)了這一點,
  • 例如鍵對應(yīng)了身份證號,假如可以開辟無限大的空間,
  • 這個空間大小有 18 個 9 那么大,并且它還是一個數(shù)組,
  • 那么完全就可以使用O(1)的時間完成各項操作,
  • 但是很難開辟一個這么大的空間,就算空間中每一個位置只存儲 32 位的整型,
  • 一個字節(jié)八個位,就是 4 個字節(jié),4byte 乘以 18 個九,
  • 也就是接近 37 萬 TB 的空間,太大了。
  • 相反,如果空間的大小只有 1 這么大,
  • 那么就代表了存儲的所有內(nèi)容都會產(chǎn)生哈希沖突,
  • 把所有的內(nèi)容都堆在唯一的數(shù)組空間中,
  • 假設(shè)以鏈表的方式來組織整體的數(shù)據(jù),
  • 那么相應(yīng)的各項操作完成的時間復(fù)雜度就會是O(n)級別。
  • 以上就是設(shè)計哈希表的極端情況,
  • 如果有無限的空間,各項操作都能在O(1)的時間完成,
  • 如果只有 1 的空間,各項操作只能在O(n)的時間完成。
  • 哈希表整體就是在這二者之間產(chǎn)生一個平衡,
  • 哈希表是時間和空間之間的平衡。
  • 對哈希表整體來說這個數(shù)組能開多大空間是非常重要的

  • 雖然如此,哈希表整體,哈希函數(shù)的設(shè)計依然是非常重要的,
  • 很多數(shù)據(jù)類型本身并不能非常自然的和一個整型索引相對應(yīng),
  • 所以必須想辦法讓諸如字符串、浮點數(shù)、復(fù)合類型日期
  • 能夠跟一個整型把它當作索引來對應(yīng)。
  • 就算你能開無限的空間,但是把身份證號作為索引,
  • 但是 18 位以下及 18 位以上的空間全部都是浪費掉的,
  • 所以對于哈希表來說,還希望,
  • 對于每一個鍵通過哈希函數(shù)得到索引后,
  • 這個索引的分布越均勻越好。
  • 哈希函數(shù)的設(shè)計

  • 哈希表這種數(shù)據(jù)結(jié)構(gòu)

  • 其實就是把所關(guān)心的鍵通過哈希函數(shù)轉(zhuǎn)化成一個索引,
  • 然后直接把內(nèi)容存到一個數(shù)組中就好了。
  • 對于哈希表來說,關(guān)心的主要有兩部分內(nèi)容

  • 第一部分就是哈希函數(shù)的設(shè)計,
  • 第二部分就是解決哈希函數(shù)生成的索引相同的沖突,
  • 也就是解決哈希沖突如何處理的問題。
  • 哈希函數(shù)的設(shè)計

  • 鍵通過哈希函數(shù)得到的索引分布越均勻越好。
  • 雖然很好理解,但是想要達到這樣的條件是非常難的,
  • 對于數(shù)據(jù)的存儲的數(shù)據(jù)類型是五花八門,
  • 所以對于一些特殊領(lǐng)域,有特殊領(lǐng)域的哈希函數(shù)設(shè)計方式,
  • 甚至有專門的論文來討論如何設(shè)計哈希函數(shù),
  • 也就說明哈希函數(shù)的設(shè)計其實是非常復(fù)雜的。
  • 最一般的哈希函數(shù)設(shè)計原則

  • 將所有類型的數(shù)據(jù)相應(yīng)的哈希函數(shù)的設(shè)計都轉(zhuǎn)化成是
  • 對于整型進行一個哈希函數(shù)的過程。
  • 小范圍的正整數(shù)直接使用它來作為索引,
  • 如 26 個字母的 ascll 碼或者一個班級的學(xué)生編號。
  • 小范圍的負整數(shù)進行偏移,對于數(shù)組來說索引都是自然數(shù),
  • 也就是大于等于 0 的數(shù)字,做一個簡單的偏移即可,
  • 將它們都變完成自然數(shù),如-100~100,讓它們都加 100,
  • 變成0~200就可以了,非常容易。
  • 大整數(shù)如身份證號轉(zhuǎn)化為索引,通常做法是取模運算,
  • 比如取這個大整數(shù)的后四位,等同于mod 10000,
  • 但是這樣就存在陷阱,這個哈希表的數(shù)組最大只有一萬空間,
  • 對于哈希表來說空間越大,就越難發(fā)生哈希沖突,
  • 那么你可以取這個大整數(shù)的后六位,等同于mod 1000000,
  • 但是對于身份證后四位來說,
  • 這四位前面的八位其實是一個人的生日,
  • 如 110108198512166666,取模后六位就是 166666,
  • 這個 16 其實是日期,數(shù)值只在 1-31 之間,永遠不可能取 99,
  • 并且只取模后六位,并沒有利用身份證上所有的信息,
  • 所以就會造成分布不均勻的情況。
  • 取模的數(shù)字選擇很重要,

  • 所以才會對哈希函數(shù)的設(shè)計,不同的領(lǐng)域有不同的做法,
  • 就算對身份證號的哈希函數(shù)設(shè)計的時候都要具體問題具體分析,
  • 哈希函數(shù)設(shè)計在很多時候很難找到通用的一般設(shè)計原則,
  • 具體問題具體分析在特殊的領(lǐng)域是非常重要的,
  • 像身份證號,有一個簡單的解決方案可以解決分布不均勻的問題,
  • 模一個素數(shù),通常情況模一個素數(shù)都能更好的解決分布均勻的問題,
  • 所以就可以更有效的利用這個大整數(shù)中的信息,
  • 之所以模一個素數(shù)可以更有效的解決這個問題,
  • 這是由于它背后有一定的數(shù)學(xué)理論做支撐,它本身屬于數(shù)論領(lǐng)域,
  • 如下圖所示,模 4 就導(dǎo)致了分布不均勻、哈希沖突,
  • 但是模 7 就不一樣了,分布更加均勻減少了哈希沖突,
  • 所以需要看你存儲的數(shù)據(jù)是否有規(guī)律,
  • 通常情況下模一個素數(shù)得到的結(jié)果會更好,
  • http://planetmath.org/goodhashtableprimes,
  • 可以從這個網(wǎng)站中看到,根據(jù)你的數(shù)據(jù)規(guī)模,你取模多大一個素數(shù)是合適的,
  • 例如你存儲的數(shù)據(jù)在 2^5 至 2^6 時,你可以取模 53,哈希沖突的概率是 10.41667,
  • 例如你存儲的數(shù)據(jù)在 2^23 至 2^24 你可以取模 12582917,沖突概率是 0.000040,
  • 這些都有人研究的,所以你可以從這個網(wǎng)站中去看。
  • 不用去深究,只要了解這個大的基本原則即可。
  • // 10 % 4 ---> 2 10 % 7 --->3 // 20 % 4 ---> 0 20 % 7 --->6 // 30 % 4 ---> 2 30 % 7 --->2 // 40 % 4 ---> 0 40 % 7 --->4 // 50 % 4 ---> 2 50 % 7 --->1 復(fù)制代碼
  • 浮點型的哈希函數(shù)設(shè)計

  • 將浮點型的數(shù)據(jù)轉(zhuǎn)化為一個整數(shù)的索引,

  • 在計算機中都 32 位或者 64 位的二進制表示,只不過計算機解析成了浮點數(shù),

  • 如果鍵是浮點型的話,那么就可以使用浮點型所存儲的這個空間,

  • 把它當作是整型來進行處理,

  • 也就是把這個浮點型所占用的 32 位空間或 64 位空間使用整數(shù)的方式來解析,

  • 那么這篇空間同樣可以可以表示一個整數(shù),

  • 之后就可以將一個大的整數(shù)轉(zhuǎn)成整數(shù)相應(yīng)的方式,也就是取模的方式,

  • 這樣就解決了浮點型的哈希函數(shù)的設(shè)計的問題

    // // 單精度 // 8-bit 23-bit // 0 | 0 1 1 1 1 1 0 0 | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 // 31 23 0// //雙進度 // 11-bit 52-bit // 0|011111111100|0100000000000000000000000000000000000000000000000000 // 63 52 0 復(fù)制代碼
  • 字符串的哈希函數(shù)設(shè)計

  • 字符串相對浮點型來說更加特殊一些,
  • 浮點型依然是占 32 位或 64 位這樣的空間,
  • 而字符串可以有若干個字符來組合,它所占的空間數(shù)量是不固定的,
  • 盡管如此,對于字符串的哈希函數(shù)設(shè)計,依然可以將它轉(zhuǎn)成大整型處理,
  • 例如一個整數(shù)可以轉(zhuǎn)換成每一位數(shù)字的十進制表示法,
  • 如166 = 1 * 10^2 + 6 * 10^1 + 6 * 10^0,
  • 這樣就相當于把一個整數(shù)看作是一個字符串,每一個字符就是一個數(shù)字,
  • 按照這種方式,就可以把字符串中每一個字符拆分出來,
  • 如果是英文就可以把它作為 26 進制的整數(shù)表示法,
  • 如code = c * 26^3 + o * 26^2 + d * 26^1 + e * 26^0,
  • c 在 26 進制中對應(yīng)的是 3,其它的類似,
  • 這樣一來就可以把一個字符串看作是 26 進制的整型,
  • 之所以用 26,這是因為一共有 26 個小寫字母,這個進制是可以選的,
  • 例如字符串中大小寫字母都有,那么就是 52 進制,如果還有各種標點符號,
  • 那么就可以使 256 進制等等,由于這個進制可以選,那么就可以使用一個標記來代替,
  • 如大 B,也就是 basics(基本)的意思,
  • 那么表達式是code = c * B^3 + o * B^2 + d * B^1 + e * B^0,
  • 最后的哈希函數(shù)就是
  • hash(code) = (c * B^3 + o * B^2 + d * B^1 + e * B^0) % M,
  • 這個 M 對應(yīng)的取模的方式中那個素數(shù),
  • 這個 M 也表示了哈希表的那個數(shù)組中一共有多少個空間,
  • 對于這種表示的樣子,這個 code 一共有四個字符,所以最高位的 c 字符乘以 B 的三次方,
  • 如果這個字符串有一百個字符,那么最高位的 c 字符就要乘以 B 的 99 次方,
  • 很多時候計算 B 的 k 次方,這個 k 比較大的話,這個計算過程也是比較慢的,
  • 所以對于這個式子一個常見的轉(zhuǎn)化形式就是
  • hash(code) = ((((c * B) + o) * B + d) * B + e) % M,
  • 將字符串轉(zhuǎn)換成大整型的一個括號轉(zhuǎn)換成了四個,
  • 在每一個括號里面做的事情都是拿到一個字符乘以 B 得到的結(jié)果再加上下一個字符,
  • 再乘以 B 得到的結(jié)果在加上下一個字符,
  • 再乘以 B 得到的結(jié)果直到加到最后一個字符為止,
  • 這樣套四個括號之后,這個式子和那個套一個括號的式子其實是等價的,
  • 就是一種簡單的變形,這樣就不需要先算 B^99 然后再算 B^98 等等這么復(fù)雜了,
  • 每一次都需要乘以一個 B 再加上下一個字符再乘以 B 依此類推就好,
  • 那么使用程序?qū)崿F(xiàn)的時候計算這個哈希函數(shù)相應(yīng)的速度就會快一些,
  • 這是一個很通用的數(shù)學(xué)技巧,是數(shù)學(xué)中的多項式就是這樣的,
  • 但是這么加可能會導(dǎo)致整型的溢出,
  • 那么就可以將這個取模的過程分別放入每個括號里面,
  • 這樣就可以轉(zhuǎn)化成這種形式
  • hash(code) = ((((c % M) * B + o) % M * B + d) % M * B + e) % M,
  • 這樣一來,每一次都計算出了比 M 更小的數(shù),所以根本就不用擔心整型溢出的問題,
  • 這就是數(shù)論中的模運算的一個很重要的性質(zhì)。
  • //hash(code) = ((((c % M) * B + o) % M * B + d) % M * B + e) % M// 上面的公式中 ((((c % M) * B + o) % M * B + d) % M * B + e) % M // 對應(yīng)下面的代碼,只需要一重for循環(huán)即可,最終的到的就是整個字符串的哈希值 let s = 'code'; let hash = 0; for (let i = 0; i < s.length; i++) hash = (hash * B + s.charAt(i)) % M; 復(fù)制代碼
  • 復(fù)合類型的哈希函數(shù)設(shè)計

  • 比如一個學(xué)生類,里面包括了他的年級、班級、姓名等等信息,
  • 或者一個日期類,里面包含了年、月、日、時、分、秒、毫秒等等信息,
  • 依然是轉(zhuǎn)換成整型來處理,處理方式和字符串是一樣的,
  • 也是hash(code) = ((((c % M) * B + o) % M * B + d) % M * B + e) % M,
  • 完全套用這個公式,只不過是這樣套用的,
  • 日期格式是這樣的,Date:year,month,day,
  • hash(date) = ((((date.year%M) * B + date.month) % M * B + date.day) % M * B + e) % M,
  • 根據(jù)你復(fù)合類的不同,
  • 可能需要對 B 的值也就是進制進行一下設(shè)計從而選取一個更合理的數(shù)值,
  • 整個思路是一致的。
  • 哈希函數(shù)設(shè)計一般來說對任何數(shù)據(jù)類型都是將它轉(zhuǎn)換成整型來處理。

  • 轉(zhuǎn)換成整型并不是哈希函數(shù)設(shè)計的唯一方法,
  • 只不過這是一個比較普通比較常用比較通用的一種方法,
  • 在很多特殊的領(lǐng)域有很多相關(guān)的論文去講更多的哈希函數(shù)設(shè)計的方法。
  • 哈希函數(shù)的設(shè)計,通常要遵循三個原則

  • 一致性:如果 a==b,則 hash(a)==hash(b)。
  • 如果兩個鍵相等,那么扔進哈希函數(shù)之后得到的值也一定要相等,
  • 但是對于哈希函數(shù)來說反過來是不一定成立的,
  • 同樣的一個哈希值很有可能對應(yīng)了兩個不同的數(shù)據(jù)或者不同的鍵,
  • 這就是所謂的哈希沖突的情況。
  • 高效性:計算高效簡便。
  • 使用哈希表就是為了能夠高效的存儲,
  • 那么在使用哈希函數(shù)計算的時候耗費太多的性能那么就太得不償失了。
  • 均勻性:哈希值均勻分布。
  • 使用哈希函數(shù)之后得到的索引值就應(yīng)該盡量的均勻,
  • 對于一般的整型可以通過模一個素數(shù)來讓它盡量的均勻,
  • 這個條件雖然看起來很簡單,但是真正要滿足這個條件,
  • 探究這個條件背后的數(shù)學(xué)性質(zhì)還是很復(fù)雜的一個問題。
  • js 中 自定義 hashCode 方法

  • 在 js 中自定義數(shù)據(jù)類型

  • 對于自己定義的復(fù)合類型,如學(xué)生類、日期類型,
  • 你可以通過寫 hashCode 方法,
  • 然后自己實現(xiàn)一下這個方法重新生成 hash 值。
  • Student

    // Student class Student {constructor(grade, classId, studentName, studentScore) {this.name = studentName;this.score = studentScore;this.grade = grade;this.classId = classId;}//@Override hashCode 2018-11-25-jwlhashCode() {// 選擇進制const B = 31;// 計算hash值let hash = 0;hash = hash * B + this.getCode(this.name.toLowerCase());hash = hash * B + this.getCode(this.score);hash = hash * B + this.getCode(this.grade);hash = hash * B + this.getCode(this.classId);// 返回hash值return hash;}//@Override equals 2018-11-25-jwlequals(obj) {// 三重判斷if (!obj) return false;if (this === obj) return true;if (this.valueOf() !== obj.valueOf()) return false;// 對屬性進行判斷return (this.name === obj.name &&this.score === obj.score &&this.grade === obj.grade &&this.classId === obj.classId);}// 拆分字符生成數(shù)字 -getCode(s) {s = s + '';let result = 0;// 遍歷字符 計算結(jié)果for (const c of s) result += c.charCodeAt(0);// 返回結(jié)果return result;}//@Override toString 2018-10-19-jwltoString() {let studentInfo = `Student(name: ${this.name}, score: ${this.score})`;return studentInfo;} } 復(fù)制代碼
  • Main

    // main 函數(shù) class Main {constructor() {// var s = "leetcode";// this.show(new Solution().firstUniqChar(s) + " =====> 返回 0.");// var s = "loveleetcode";// this.show(new Solution().firstUniqChar(s) + " =====> 返回 2.");const jwl = new Student(10, 4, 'jwl', 99);this.show(jwl.hashCode());console.log(jwl.hashCode());const jwl2 = new Student(10, 4, 'jwl', 99);this.show(jwl2.hashCode());console.log(jwl2.hashCode());}// 將內(nèi)容顯示在頁面上show(content) {document.body.innerHTML += `${content}<br /><br />`;}// 展示分割線alterLine(title) {let line = `--------------------${title}----------------------`;console.log(line);document.body.innerHTML += `${line}<br /><br />`;} }// 頁面加載完畢 window.onload = function() {// 執(zhí)行主函數(shù)new Main(); }; 復(fù)制代碼
  • 哈希沖突的處理-鏈地址法(Seperate Chaining)

  • 哈希表的本質(zhì)就是一個數(shù)組
  • 對于一個哈希表來說,對于一個整數(shù)求它的 hash 值的時候會對一個素數(shù)取模,
  • 這個素數(shù)就是這個數(shù)組的空間大小,也可以把它稱之為 M,
  • 在 強類型語言 中獲取到的 hash 值可能是一個負數(shù),所以就需要進行處理一下
  • 最簡單的,直接獲取這個 hash 值的絕對值就可以了,
  • 但是很多源碼中,是這樣的一個表示 (hashCode(k1) & 0x7fffffff) % M,
  • 也就是讓 hash 值和一個十六進制的數(shù)字進行一個按位與,
  • 按位與之后再對 M 進行一個取模操作,這和直接獲取這個 hash 值的正負號去掉是一樣的,
  • 在十六進制中,每一位表示的是四個 bit,那么 f 表示的就是二進制中的1111,
  • 七個 f 表示的是二進制中的 28 個 1,7 表示的是二進制中的111,
  • 那么0x7fffffff表示的二進制就是 31 個 1,hash 值對 31 個 1 進行一下按位與,
  • 在計算機中整型的表示是用的 32 位,其中最高位就是符號位,如果和 31 個 1 做按位與,
  • 那么相應(yīng)的最高為其實是 0,這樣操作的結(jié)果其實就是最高位的結(jié)果,肯定是 0,
  • 而這個 hash 值對應(yīng)的二進制表示的那 31 位
  • 再和 31 個 1 進行按位與之后任然保持原來的樣子,
  • 也就是這個操作做的事情實際上就是把 hash 值整型對應(yīng)的二進制表示的最高位的 1 給抹去,
  • 給抹成了 0,如果它原來是 0 的,那么任然是 0,
  • 這是因為在計算機中對整型的表示最高位是符號位,如果最高位是 1 表示它是一個負數(shù),
  • 如果最高位是 0 表示它是一個正數(shù),那么抹去 1 就相當于把負號去掉了。
  • 在 js 中這樣做效果不好,所以需要自己根據(jù)實際情況來寫一起算法,如通過時間戳來進行這種操作。
  • 鏈地址法
  • 根據(jù)元素的哈希值計算出索引后,根據(jù)索引來哈希表中的數(shù)組里存儲數(shù)據(jù),
  • 如果索引相同的話,那么就以鏈表的方式將新元素掛到數(shù)組對應(yīng)的位置中,
  • 這樣就很好的解決了哈希沖突的問題了,因為每一個位置都對應(yīng)了一個鏈,
  • 它的本質(zhì)就是一個查找表,查找表的本質(zhì)不一定是使用鏈表,
  • 它的底層其實還可以使用樹結(jié)構(gòu)如平衡樹結(jié)構(gòu),
  • 對于哈希表的數(shù)組中每一個位置存的不是一個鏈表而是一個 Map,
  • 通過哈希值計算出索引后,根據(jù)索引找到數(shù)組中對應(yīng)的位置之后,
  • 就可以把你要存儲的元素插入該位置的 紅黑樹 里即可,
  • 那么這個 Map 本質(zhì)就是一個 紅黑樹 Map 數(shù)組,這是映射的形式,
  • 如果你真正要實現(xiàn)的是一個集合,那么也可以使用 紅黑樹 Set 數(shù)組,
  • 哈希表的數(shù)組中每一個位置存的都是一個查找表,
  • 只要這個數(shù)據(jù)結(jié)構(gòu)適合作為查找表就可以了,它是可以有不同的底層實現(xiàn),
  • 哈希表的數(shù)組中每一個位置也可以對應(yīng)的是一個鏈表,
  • 當數(shù)據(jù)規(guī)模比較小的時候,其實鏈表要比紅黑樹要快的,
  • 數(shù)據(jù)規(guī)模比較小的時候使用紅黑樹可能更加耗費性能,如各種旋轉(zhuǎn)操作,
  • 因為它要滿足紅黑樹的性能,所以反而會慢一些。
  • 實現(xiàn)自己的哈希表

  • 之前實現(xiàn)的樹結(jié)構(gòu)中都需要進行比較
  • 其中的鍵都需要實現(xiàn) compare 這個用來比較兩個元素的方法,
  • 因為需要通過鍵來進行比較,
  • 對于哈希表來說沒有這個要求,
  • 這個 key 不需要實現(xiàn)這個方法。
  • 在哈希表中存儲的元素都需要實現(xiàn)可以用來獲取 hashCode 的方法。
  • 對于哈希表來說相應(yīng)的開多少空間是非常重要的
  • 開的空間越合適,那么相應(yīng)的哈希沖突就越少,
  • 空間大小可以參考http://planetmath.org/goodhashtableprimes,
  • 根據(jù)存儲數(shù)據(jù)的多少來開辟合適的空間,但是很多時候并不知道要開多少的空間,
  • 此時使用哈希表并不能合理的估計一個 M 值,所以需要進行優(yōu)化。
  • 代碼示例

  • MyHashTable

    // 自定義的hash生成類。 class MyHash {constructor() {this.store = new Map();}// 生成hashhashCode(key) {let hash = this.store.get(key);if (hash !== undefined) return hash;else {// 如果 這個hash沒有進行保存 就生成,并且記錄let hash = this.calcHashTwo(key);// 記錄this.store.set(key, hash);// 返回hashreturn hash;}}// 得到的數(shù)字比較小 六七位數(shù) 以下 輔助函數(shù):生成hash -calcHashOne(key) {// 生成hash 隨機小數(shù) * 當前日期毫秒 * 隨機小數(shù)let hash = Math.random() * Date.now() * Math.random();// hash 取小數(shù)部分的字符串hash = hash.toString().replace(/^\d*\.\d*?([1-9]+)$/, '$1');hash = parseInt(hash); // 取整return hash;}// 得到的數(shù)字很大 十幾位數(shù) 左右 輔助函數(shù):生成hash -calcHashTwo(key) {// 生成hash 隨機小數(shù) * 當前日期毫秒 * 隨機小數(shù)let hash = Math.random() * Date.now() * Math.random();// hash 向下取整hash = Math.floor(hash);return hash;} }class MyHashTableBySystem {constructor(M = 97) {this.M = M; // 空間大小this.size = 0; // 實際元素個數(shù)this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值計算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new Map();}}// 根據(jù)key生成 哈希表索引hash(key) {// 獲取哈希值let hash = this.hashCalc.hashCode(key);// 對哈希值轉(zhuǎn)換為32位的整數(shù) 再進行取模運算return (hash & 0x7fffffff) % this.M;}// 獲取實際存儲的元素個數(shù)getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆蓋if (map.has(key)) map.set(key, value);else {// 不存在就添加map.set(key, value);this.size++;}}// 刪除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就刪除if (map.has(key)) {value = map.delete(key);this.size--;}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.has(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].has(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);} }// 自定義的哈希表 HashTable 基于使系統(tǒng)的Map 底層是哈希表+紅黑樹 // 自定義的哈希表 HashTable 基于自己的AVL樹 class MyHashTableByAVLTree {constructor(M = 97) {this.M = M; // 空間大小this.size = 0; // 實際元素個數(shù)this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值計算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new MyAVLTreeMap();}}// 根據(jù)key生成 哈希表索引hash(key) {// 獲取哈希值let hash = this.hashCalc.hashCode(key);// 對哈希值轉(zhuǎn)換為32位的整數(shù) 再進行取模運算return (hash & 0x7fffffff) % this.M;}// 獲取實際存儲的元素個數(shù)getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆蓋if (map.contains(key)) map.set(key, value);else {// 不存在就添加map.add(key, value);this.size++;}}// 刪除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就刪除if (map.contains(key)) {value = map.remove(key);this.size--;}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.contains(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].contains(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);} } 復(fù)制代碼
  • Main

    // main 函數(shù) class Main {constructor() {this.alterLine('HashTable Comparison Area');const n = 2000000;const random = Math.random;let arrNumber = new Array(n);// 循環(huán)添加隨機數(shù)的值for (let i = 0; i < n; i++) arrNumber[i] = Math.floor(n * random());const hashTable = new MyHashTableByAVLTree(1572869);const hashTable1 = new MyHashTableBySystem(1572869);const performanceTest1 = new PerformanceTest();const that = this;const hashTableInfo = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable.add(word, String.fromCharCode(word));that.show('size : ' + hashTable.getSize());console.log('size : ' + hashTable.getSize());// 刪除for (const word of arrNumber) hashTable.remove(word);// 查找for (const word of arrNumber)if (hashTable.contains(word))throw new Error("doesn't remove ok.");});// 總毫秒數(shù):console.log(hashTableInfo);console.log(hashTable);this.show(hashTableInfo);const hashTableInfo1 = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable1.add(word, String.fromCharCode(word));that.show('size : ' + hashTable1.getSize());console.log('size : ' + hashTable1.getSize());// 刪除for (const word of arrNumber) hashTable1.remove(word);// 查找for (const word of arrNumber)if (hashTable1.contains(word))throw new Error("doesn't remove ok.");});// 總毫秒數(shù):console.log(hashTableInfo1);console.log(hashTable1);this.show(hashTableInfo1);}// 將內(nèi)容顯示在頁面上show(content) {document.body.innerHTML += `${content}<br /><br />`;}// 展示分割線alterLine(title) {let line = `--------------------${title}----------------------`;console.log(line);document.body.innerHTML += `${line}<br /><br />`;} }// 頁面加載完畢 window.onload = function() {// 執(zhí)行主函數(shù)new Main(); }; 復(fù)制代碼
  • 哈希表的動態(tài)空間處理與復(fù)雜度分析

    哈希表的時間復(fù)雜度

  • 對于鏈地址法來說
  • 總共有 M 個地址,如果放入 N 個元素,那么每一個地址就有 N/M 個元素,
  • 也就是說有 N/M 個元素的哈希值是沖突的,
  • 如果每個地址里面是一個鏈表,那么平均的時間復(fù)雜度就是O(N/M)級別,
  • 如果每一個地址里面是一個平衡樹,那么平均的時間復(fù)雜度是O(log(N/M))級別,
  • 這兩個時間復(fù)雜度都是平均來看的,并不是最壞的情況,
  • 哈希表的優(yōu)勢在于,能夠讓時間復(fù)雜度變成O(1)級別的,
  • 只要讓這個 M 不是固定的,是動態(tài)的,那么就能夠讓時間復(fù)雜度變成O(1)級別。
  • 正常情況下不會出現(xiàn)最壞的情況,
  • 但是在信息安全領(lǐng)域有一種攻擊方法叫做哈希碰撞攻擊,
  • 也就是當你知道這個哈希計算方式之后,你就會精心設(shè)計一套數(shù)據(jù),
  • 當這套數(shù)據(jù)插入到哈希表中之后,這套數(shù)據(jù)全部產(chǎn)生哈希沖突,
  • 這就使得系統(tǒng)的哈希表的時間復(fù)雜度變成了最壞的情況,
  • 這樣就大大的拖慢整個系統(tǒng)的運行速度,
  • 也會在哈希表查找的過程中大大的消耗系統(tǒng)的資源。
  • 哈希表的動態(tài)空間處理

  • 哈希表的本質(zhì)就是一個數(shù)組
  • 如果這個數(shù)組是靜態(tài)的話,那么哈希沖突的機會會很多,
  • 如果這個數(shù)組是動態(tài)的話,那么哈希沖突的機會會很少,
  • 因為你存儲的元素接近無窮大的話,
  • 靜態(tài)的數(shù)組肯定是無法讓相應(yīng)的時間復(fù)雜度接近O(1)級別。
  • 哈希表的中數(shù)組的空間要隨著元素個數(shù)的改變進行一定的自適應(yīng)
  • 由于靜態(tài)數(shù)組固定的地址空間是不合理的,
  • 所以和自己實現(xiàn)的動態(tài)數(shù)組一樣,需要進行 resize,
  • 和自己實現(xiàn)的動態(tài)數(shù)組不一樣的是,哈希表中的數(shù)組不存在所有位置都填滿,
  • 因為它的存儲方式和動態(tài)數(shù)組的按照順序一個一個的塞進數(shù)組的方式不一樣。
  • 相應(yīng)的解決方案是,
  • 當平均每個地址的承載的元素多過一定程度,就去擴容,
  • 也就是N / M >= upperTolerance的時候,也就是設(shè)置一個上界,
  • 如果 也就是說平均每個地址存儲的元素超過了多少個,如 upperTolerance 為 10,
  • 那么N / M大于等于 10,那么就進行擴容操作。
  • 反之也有縮容,
  • 當平均每個地址承載的元素少過一定程度,就去縮容,
  • 也就是N / M < lowerTolerance的時候,也就是設(shè)置一個下限,
  • 也就是哈希沖突并不嚴重,那么就不需要開那么大的空間了,
  • 如 lowerTolerance 為 2,那么N / M小于 2,那么就進行縮容操作。
  • 大概的原理和動態(tài)數(shù)組擴容和縮容的原理是一致的,但是有些細節(jié)方面會不一樣,
  • 如新的哈希表的根據(jù) key 獲取哈希值后對 M 取模,這個 M 你需要設(shè)置為新的 newM,
  • 并且你遍歷的空間也是原來那個舊的 M 個空間地址,并不是新的 newM 個空間地址,
  • 所以你需要先將舊的 M 值存一下,然后再將 newM 賦值給 M,這樣邏輯才完全正確。
  • 代碼示例

  • MyHashTable

    // 自定義的hash生成類。 class MyHash {constructor() {this.store = new Map();}// 生成hashhashCode(key) {let hash = this.store.get(key);if (hash !== undefined) return hash;else {// 如果 這個hash沒有進行保存 就生成,并且記錄let hash = this.calcHashTwo(key);// 記錄this.store.set(key, hash);// 返回hashreturn hash;}}// 得到的數(shù)字比較小 六七位數(shù) 以下 輔助函數(shù):生成hash -calcHashOne(key) {// 生成hash 隨機小數(shù) * 當前日期毫秒 * 隨機小數(shù)let hash = Math.random() * Date.now() * Math.random();// hash 取小數(shù)部分的字符串hash = hash.toString().replace(/^\d*\.\d*?([1-9]+)$/, '$1');hash = parseInt(hash); // 取整return hash;}// 得到的數(shù)字很大 十幾位數(shù) 左右 輔助函數(shù):生成hash -calcHashTwo(key) {// 生成hash 隨機小數(shù) * 當前日期毫秒 * 隨機小數(shù)let hash = Math.random() * Date.now() * Math.random();// hash 向下取整hash = Math.floor(hash);return hash;} }class MyHashTableBySystem {constructor(M = 97) {this.M = M; // 空間大小this.size = 0; // 實際元素個數(shù)this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值計算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new Map();}}// 根據(jù)key生成 哈希表索引hash(key) {// 獲取哈希值let hash = this.hashCalc.hashCode(key);// 對哈希值轉(zhuǎn)換為32位的整數(shù) 再進行取模運算return (hash & 0x7fffffff) % this.M;}// 獲取實際存儲的元素個數(shù)getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆蓋if (map.has(key)) map.set(key, value);else {// 不存在就添加map.set(key, value);this.size++;}}// 刪除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就刪除if (map.has(key)) {value = map.delete(key);this.size--;}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.has(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].has(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);} }// 自定義的哈希表 HashTable // 自定義的哈希表 HashTable class MyHashTableByAVLTree {constructor(M = 97) {this.M = M; // 空間大小this.size = 0; // 實際元素個數(shù)this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值計算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new MyAVLTreeMap();}// 設(shè)定擴容的上邊界this.upperTolerance = 10;// 設(shè)定縮容的下邊界this.lowerTolerance = 2;// 初始容量大小為 97this.initCapcity = 97;}// 根據(jù)key生成 哈希表索引hash(key) {// 獲取哈希值let hash = this.hashCalc.hashCode(key);// 對哈希值轉(zhuǎn)換為32位的整數(shù) 再進行取模運算return (hash & 0x7fffffff) % this.M;}// 獲取實際存儲的元素個數(shù)getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆蓋if (map.contains(key)) map.set(key, value);else {// 不存在就添加map.add(key, value);this.size++;// 平均元素個數(shù) 大于等于 當前容量的10倍// 擴容就翻倍if (this.size >= this.upperTolerance * this.M)this.resize(2 * this.M);}}// 刪除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就刪除if (map.contains(key)) {value = map.remove(key);this.size--;// 平均元素個數(shù) 小于容量的2倍 當然無論怎么縮容,縮容之后都要大于初始容量if (this.size < this.lowerTolerance * this.M &&this.M / 2 > this.initCapcity)this.resize(Math.floor(this.M / 2));}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.contains(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].contains(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);}// 重置空間大小resize(newM) {// 初始化新空間const newHashTable = new Array(newM);for (var i = 0; i < newM; i++) newHashTable[i] = new MyAVLTree();const oldM = this.M;this.M = newM;// 方式一// let map;// let keys;// for (var i = 0; i < oldM; i++) {// // 獲取所有實例// map = this.hashTable[i];// keys = map.getKeys();// // 遍歷每一對鍵值對 實例// for(const key of keys)// newHashTable[this.hash(key)].add(key, map.get(key));// }// 方式二let etities;for (var i = 0; i < oldM; i++) {etities = this.hashTable[i].getEntitys();for (const entity of etities)newHashTable[this.hash(entity.key)].add(entity.key,entity.value);}// 重新設(shè)置當前hashTablethis.hashTable = newHashTable;} } 復(fù)制代碼
  • Main

    // main 函數(shù) class Main {constructor() {this.alterLine('HashTable Comparison Area');const n = 2000000;const random = Math.random;let arrNumber = new Array(n);// 循環(huán)添加隨機數(shù)的值for (let i = 0; i < n; i++) arrNumber[i] = Math.floor(n * random());this.alterLine('HashTable Comparison Area');const hashTable = new MyHashTableByAVLTree();const hashTable1 = new MyHashTableBySystem();const performanceTest1 = new PerformanceTest();const that = this;const hashTableInfo = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable.add(word, String.fromCharCode(word));that.show('size : ' + hashTable.getSize());console.log('size : ' + hashTable.getSize());// 刪除for (const word of arrNumber) hashTable.remove(word);// 查找for (const word of arrNumber)if (hashTable.contains(word))throw new Error("doesn't remove ok.");});// 總毫秒數(shù):console.log('HashTableByAVLTree' + ':' + hashTableInfo);console.log(hashTable);this.show('HashTableByAVLTree' + ':' + hashTableInfo);const hashTableInfo1 = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable1.add(word, String.fromCharCode(word));that.show('size : ' + hashTable1.getSize());console.log('size : ' + hashTable1.getSize());// 刪除for (const word of arrNumber) hashTable1.remove(word);// 查找for (const word of arrNumber)if (hashTable1.contains(word))throw new Error("doesn't remove ok.");});// 總毫秒數(shù):console.log('HashTableBySystem' + ':' + hashTableInfo1);console.log(hashTable1);this.show('HashTableBySystem' + ':' + hashTableInfo1);}// 將內(nèi)容顯示在頁面上show(content) {document.body.innerHTML += `${content}<br /><br />`;}// 展示分割線alterLine(title) {let line = `--------------------${title}----------------------`;console.log(line);document.body.innerHTML += `${line}<br /><br />`;} }// 頁面加載完畢 window.onload = function() {// 執(zhí)行主函數(shù)new Main(); }; 復(fù)制代碼
  • 哈希表更復(fù)雜的動態(tài)空間處理方法

    哈希表的復(fù)雜度分析

  • 已經(jīng)為哈希表添加了動態(tài)處理空間大小的機制了
  • 所以就需要對這個新的哈希表進行一下時間復(fù)雜度的分析。
  • 自己實現(xiàn)的動態(tài)數(shù)組的均攤復(fù)雜度分析
  • 當數(shù)組中的元素個數(shù)等于數(shù)組的當前的容量的時候,
  • 就需要進行擴容,擴容的大小是當前容量的兩倍,
  • 整個擴容的過程要消耗O(n)的復(fù)雜度,
  • 但是這是經(jīng)過 n 次O(1)級別的操作之后才有這一次O(n)級別的操作,
  • 所以就把這個O(n)級別的操作平攤到 n 次O(1)級別的操作中,
  • 那么就可以簡單的理解之前每一次操作都是O(2)級別的操作,
  • 這個 2 是一個常數(shù),對于復(fù)雜度分析來說會忽略一下常數(shù),
  • 那么平均時間復(fù)雜度就是O(1)級別的。
  • 自己實現(xiàn)的動態(tài)哈希表的復(fù)雜度分析
  • 其實分析的方式和動態(tài)數(shù)組的分析方式是一樣的道理,
  • 也就是說,哈希表中元素個數(shù)從 N 增加到了 upperTolerance*N 的時候,
  • 整個哈希表的地址空間才會進行一個翻倍這樣的擴容,
  • 也就是說增加 9 倍原來的空間大小之后才會進行空間地址的翻倍,
  • 那么相對與動態(tài)數(shù)組來說,是添加了更多的元素才進行的翻倍,
  • 這個操作也是O(n)級別的操作,
  • 這一次操作也需要平攤到 9*n次操作中去,
  • 那么每一次操作平攤到的時間復(fù)雜度就會更少,
  • 正因為如此就算進行了 resize 操作之后,
  • 哈希表的平均時間復(fù)雜度還是O(1)級別的,
  • 其實每個操作是在O(lowerTolerance)~O(upperTolerance)之間,
  • 這兩個數(shù)都是自定義的常數(shù),所以這樣的一個復(fù)雜度還是O(1)級別的,
  • 無論縮容還是擴容都是如此,所以這就是哈希表這種數(shù)據(jù)結(jié)構(gòu)的一個巨大優(yōu)勢,
  • 這個O(1)級別的時間復(fù)雜度是均攤得到的,是平均的時間復(fù)雜度。
  • 更復(fù)雜的動態(tài)空間處理方法

  • 對于自己實現(xiàn)的哈希表來說
  • 擴容操作是從 M -> 2*M,就算初始的 M 是一個素數(shù),
  • 那么乘以 2 之后一定是一個偶數(shù),再繼續(xù)擴容的過程中,
  • 就會是 2^k 乘以 M,所以它顯然不再是一個素數(shù),
  • 這樣的一個容量,會隨著擴容而導(dǎo)致哈希表索引分布不再均勻,
  • 所以希望這個空間是一個素數(shù),解決的方法非常的簡單。
  • 在哈希表中不同的空間范圍里合理的素數(shù)已經(jīng)有人總結(jié)出來了,
  • 也就是說對于哈希表的大小已經(jīng)有很多與數(shù)學(xué)相關(guān)的研究人員給出了一些建議,
  • 可以通過這個網(wǎng)址看到一張表格,表格中就是對應(yīng)的大小區(qū)間、對應(yīng)的素數(shù)以及沖突概率,
  • http://planetmath.org/goodhashtableprimes,
  • 哈希表的擴容的方案就可以不是原先的簡單乘以 2 或者除以 2
  • 可以根據(jù)一張區(qū)內(nèi)對應(yīng)的素數(shù)表來進行擴容和縮容,
  • 比如初始的大小是 53,擴容的時候就到 97,再擴容就到 193,
  • 如果要縮容了,就到 97,如果要再縮容的就到 53,就這樣。
  • 對于哈希表來說,這些素數(shù)有在盡量的維持一個二倍的關(guān)系,
  • 使用這些素數(shù)值進行擴容更加的合理。// lwr upr % err prime // 2^5 2^6 10.416667 53 // 2^6 2^7 1.041667 97 // 2^7 2^8 0.520833 193 // 2^8 2^9 1.302083 389 // 2^9 2^10 0.130208 769 // 2^10 2^11 0.455729 1543 // 2^11 2^12 0.227865 3079 // 2^12 2^13 0.113932 6151 // 2^13 2^14 0.008138 12289 // 2^14 2^15 0.069173 24593 // 2^15 2^16 0.010173 49157 // 2^16 2^17 0.013224 98317 // 2^17 2^18 0.002543 196613 // 2^18 2^19 0.006358 393241 // 2^19 2^20 0.000127 786433 // 2^20 2^21 0.000318 1572869 // 2^21 2^22 0.000350 3145739 // 2^22 2^23 0.000207 6291469 // 2^23 2^24 0.000040 12582917 // 2^24 2^25 0.000075 25165843 // 2^25 2^26 0.000010 50331653 // 2^26 2^27 0.000023 100663319 // 2^27 2^28 0.000009 201326611 // 2^28 2^29 0.000001 402653189 // 2^29 2^30 0.000011 805306457 // 2^30 2^31 0.000000 1610612741 復(fù)制代碼
  • 對于計算機組成原理
  • 32 位的整型最大可以承載的 int 是2.0 * 10^9左右,
  • 1610612741 是 1.6\*10^9,
  • 它是比較接近 int 型可以承載的極限的一個素數(shù)了。
  • 擴容和縮容的注意點
  • 擴容和縮容不要越界,
  • 擴容和縮容使用那張表格中區(qū)間對應(yīng)的素數(shù)。
  • 代碼示例

  • MyHashTable

    // 自定義的hash生成類。 class MyHash {constructor() {this.store = new Map();}// 生成hashhashCode(key) {let hash = this.store.get(key);if (hash !== undefined) return hash;else {// 如果 這個hash沒有進行保存 就生成,并且記錄let hash = this.calcHashTwo(key);// 記錄this.store.set(key, hash);// 返回hashreturn hash;}}// 得到的數(shù)字比較小 六七位數(shù) 以下 輔助函數(shù):生成hash -calcHashOne(key) {// 生成hash 隨機小數(shù) * 當前日期毫秒 * 隨機小數(shù)let hash = Math.random() * Date.now() * Math.random();// hash 取小數(shù)部分的字符串hash = hash.toString().replace(/^\d*\.\d*?([1-9]+)$/, '$1');hash = parseInt(hash); // 取整return hash;}// 得到的數(shù)字很大 十幾位數(shù) 左右 輔助函數(shù):生成hash -calcHashTwo(key) {// 生成hash 隨機小數(shù) * 當前日期毫秒 * 隨機小數(shù)let hash = Math.random() * Date.now() * Math.random();// hash 向下取整hash = Math.floor(hash);return hash;} }class MyHashTableBySystem {constructor(M = 97) {this.M = M; // 空間大小this.size = 0; // 實際元素個數(shù)this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值計算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new Map();}}// 根據(jù)key生成 哈希表索引hash(key) {// 獲取哈希值let hash = this.hashCalc.hashCode(key);// 對哈希值轉(zhuǎn)換為32位的整數(shù) 再進行取模運算return (hash & 0x7fffffff) % this.M;}// 獲取實際存儲的元素個數(shù)getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆蓋if (map.has(key)) map.set(key, value);else {// 不存在就添加map.set(key, value);this.size++;}}// 刪除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就刪除if (map.has(key)) {value = map.delete(key);this.size--;}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.has(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].has(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);} }// 自定義的哈希表 HashTable // 基于系統(tǒng)的哈希表,用來測試 // 自定義的哈希表 HashTable // 基于自己實現(xiàn)的AVL樹 class MyHashTableByAVLTree {constructor() {// 設(shè)定擴容的上邊界this.upperTolerance = 10;// 設(shè)定縮容的下邊界this.lowerTolerance = 2;// 哈希表合理的素數(shù)表this.capacity = [53,97,193,389,769,1543,3079,6151,12289,24593,49157,98317,196613,393241,786433,1572869,3145739,6291469,12582917,25165843,50331653,100663319,201326611,402653189,805306457,1610612741];// 初始容量的索引this.capacityIndex = 0;this.M = this.capacity[this.capacityIndex]; // 空間大小this.size = 0; // 實際元素個數(shù)this.hashTable = new Array(this.M); // 哈希表this.hashCalc = new MyHash(); // 哈希值計算// 初始化哈希表for (var i = 0; i < this.M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new MyAVLTreeMap();}}// 根據(jù)key生成 哈希表索引hash(key) {// 獲取哈希值let hash = this.hashCalc.hashCode(key);// 對哈希值轉(zhuǎn)換為32位的整數(shù) 再進行取模運算return (hash & 0x7fffffff) % this.M;}// 獲取實際存儲的元素個數(shù)getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆蓋if (map.contains(key)) map.set(key, value);else {// 不存在就添加map.add(key, value);this.size++;// 平均元素個數(shù) 大于等于 當前容量的10倍,同時防止索引越界// 就以哈希表合理的素數(shù)表 為標準進行 索引的推移if (this.size >= this.upperTolerance * this.M &&this.capacityIndex + 1 < this.capacity.length)this.resize(this.capacity[++this.capacityIndex]);}}// 刪除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就刪除if (map.contains(key)) {value = map.remove(key);this.size--;// 平均元素個數(shù) 小于容量的2倍 當然無論怎么縮容,索引都不能越界if (this.size < this.lowerTolerance * this.M &&this.capacityIndex > 0)this.resize(this.capacity[--this.capacityIndex]);}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.contains(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].contains(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);}// 重置空間大小resize(newM) {// 初始化新空間const newHashTable = new Array(newM);for (var i = 0; i < newM; i++) newHashTable[i] = new MyAVLTree();const oldM = this.M;this.M = newM;// 方式一// let map;// let keys;// for (var i = 0; i < oldM; i++) {// // 獲取所有實例// map = this.hashTable[i];// keys = map.getKeys();// // 遍歷每一對鍵值對 實例// for(const key of keys)// newHashTable[this.hash(key)].add(key, map.get(key));// }// 方式二let etities;for (var i = 0; i < oldM; i++) {etities = this.hashTable[i].getEntitys();for (const entity of etities)newHashTable[this.hash(entity.key)].add(entity.key,entity.value);}// 重新設(shè)置當前hashTablethis.hashTable = newHashTable;} } 復(fù)制代碼
  • Main

    // main 函數(shù) class Main {constructor() {this.alterLine('HashTable Comparison Area');const n = 2000000;const random = Math.random;let arrNumber = new Array(n);// 循環(huán)添加隨機數(shù)的值for (let i = 0; i < n; i++) arrNumber[i] = Math.floor(n * random());this.alterLine('HashTable Comparison Area');const hashTable = new MyHashTableByAVLTree();const hashTable1 = new MyHashTableBySystem();const performanceTest1 = new PerformanceTest();const that = this;const hashTableInfo = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable.add(word, String.fromCharCode(word));that.show('size : ' + hashTable.getSize());console.log('size : ' + hashTable.getSize());// 刪除for (const word of arrNumber) hashTable.remove(word);// 查找for (const word of arrNumber)if (hashTable.contains(word))throw new Error("doesn't remove ok.");});// 總毫秒數(shù):13249console.log('HashTableByAVLTree' + ':' + hashTableInfo);console.log(hashTable);this.show('HashTableByAVLTree' + ':' + hashTableInfo);const hashTableInfo1 = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable1.add(word, String.fromCharCode(word));that.show('size : ' + hashTable1.getSize());console.log('size : ' + hashTable1.getSize());// 刪除for (const word of arrNumber) hashTable1.remove(word);// 查找for (const word of arrNumber)if (hashTable1.contains(word))throw new Error("doesn't remove ok.");});// 總毫秒數(shù):5032console.log('HashTableBySystem' + ':' + hashTableInfo1);console.log(hashTable1);this.show('HashTableBySystem' + ':' + hashTableInfo1);}// 將內(nèi)容顯示在頁面上show(content) {document.body.innerHTML += `${content}<br /><br />`;}// 展示分割線alterLine(title) {let line = `--------------------${title}----------------------`;console.log(line);document.body.innerHTML += `${line}<br /><br />`;} }// 頁面加載完畢 window.onload = function() {// 執(zhí)行主函數(shù)new Main(); }; 復(fù)制代碼
  • 哈希表的更多話題

  • 哈希表:均攤復(fù)雜度為O(1)
  • 哈希表也可以作為集合和映射的底層實現(xiàn)
  • 平衡樹結(jié)構(gòu)可以作為集合和映射的底層實現(xiàn),
  • 它的時間復(fù)雜度是O(logn),而哈希表的時間復(fù)雜度是O(1),
  • 既然如此平衡樹趕不上哈希表,那么平衡樹為什么存在。
  • 平衡樹存在的意義是什么?
  • 答:順序性,平衡樹具有順序性,
  • 因為樹結(jié)構(gòu)本身是基于二分搜索樹,所以他維護了存儲的數(shù)據(jù)相應(yīng)的順序性。
  • 哈希表犧牲了什么才達到了如此的性能?
  • 答:順序性,哈希表不具有順序性,由于不再維護這些順序信息,
  • 所以它的性能才比樹結(jié)構(gòu)的性能更加優(yōu)越。
  • 對于大多數(shù)的算法或者數(shù)據(jù)結(jié)構(gòu)來說
  • 通常都是有得必有失的,如果一個算法要比另外一個算法要好的話,
  • 通常都是少維護了一些性質(zhì)多消耗了一些空間等等,
  • 很多時候依照這樣的思路來分析之前的那些算法與同樣解決類似問題的算法,
  • 進行比較之后想明白兩種算法它們的區(qū)別在哪兒,
  • 一個算法比一個算法好,那么它相應(yīng)的犧牲了什么失去了什么,
  • 這樣去思考就能夠?qū)Ω鞣N算法對各種數(shù)據(jù)結(jié)構(gòu)有更加深刻的認識。
  • 集合和映射
  • 集合和映射的底層實現(xiàn)可以是鏈表、樹、哈希表。
  • 這兩種數(shù)據(jù)結(jié)構(gòu)可以再抽象的細分成兩種數(shù)據(jù)結(jié)構(gòu),
  • 一種是有序集合、有序映射,在存儲數(shù)據(jù)的時候還維持的數(shù)據(jù)的有序性,
  • 通常這種數(shù)據(jù)結(jié)構(gòu)底層的實現(xiàn)都是平衡樹,如 AVL 樹、紅黑樹等等,
  • 在 系統(tǒng)內(nèi)置的 Map、Set 這兩個類,底層實現(xiàn)是紅黑樹。
  • 一種是無序集合、無序映射,
  • 所以也可以基于哈希表封裝自己的無序集合類和無序映射類。
  • 同樣的只要你實現(xiàn)了二分搜索樹的與有序相關(guān)的方法,
  • 那么這些接口就可以在有序集合類和有序映射類中進行使用,
  • 從而使你的集合類和映射類都是有序的。
  • 更多哈希沖突的處理方法

  • 開放地址法
  • 這是和鏈地址法其名的一種方法,
  • 但是也是和鏈地址法正好相反的一種方法。
  • 鏈地址法是封閉的,但是開放地址法是數(shù)組中的空間,
  • 每一個元素都有機會進來,公式:hash(x) = x % 10,
  • 如 進來一個元素 25,那么25 % 10值為 5,那它就放到數(shù)組中索引為 5 的位置,
  • 如 再進來一個元素 11,那么取模 10 后值為 1,那么就放到索引為 1 的位置,
  • 如 再進來一個元素 31,那么取模 10 后值為 1,那么就放到索引為 1 的位置,但是,
  • 這時候索引為 1 的位置已經(jīng)滿了,因為每一個數(shù)組中存放的不再是一個查找表了,
  • 所以就看看索引為 1 的位置的后一位是否為空,為空的話就放到索引+1 的位置,也就是 2,
  • 如 再進來一個元素 51,那么取模 10 后值為 1,也是一樣,看看這個位置是否滿了,
  • 如果滿就裝,滿了就向后挪一位,直到找到空位置就存進去,
  • 這就是開放地址法的線性探測法,遇到哈希沖突的時候就去找下一個位置,
  • 以+1 的方式尋找,但是哈希沖突發(fā)生的比較多的時候,
  • 那么查找位置的時候就可能就是 O(n)的復(fù)雜度,所以需要改進。
  • 改進的方法有 平方探測法,當遇到哈希沖突的時候,
  • 先嘗試+1,如果+1 的位置被占了,那么就嘗試+4,如果+4 的位置被占了,
  • 就嘗試+9,加 9 的位置被占了,那么就嘗試+16,這個步長的序列叫做平方序列,
  • 所以就叫做平方探測法,1 4 9 16分別是1^2 2^2 3^2 4^2,
  • 每相鄰兩個數(shù)之間的差也就是步長是 x^2 - (x-1)^2 = 2x - 1,x 是1 2 3 4,
  • 所以平方探測法還是有一定的規(guī)律性,還需要改進,那么就是二次哈希法。
  • 二次哈希法就是遇到哈希沖突之后,
  • 就使用另外一個哈希函數(shù)來計算下一個位置距離當前位置的步長,
  • 這些方法都叫做開放地址法,只不過計算步長的方式不一樣。
  • 開放地址法也有有個擴容或者縮容的操作,
  • 也就是當哈希表的空間中存儲量達到一定的程度的時候就會進行擴容和縮容,
  • 對于發(fā)放地址法有一個詞叫做負載率,也就是存儲的元素占存儲空間的百分比,
  • 通常當負載率達到百分之 50 的時候就會進行擴容,從而保證哈希表各個操作的高效性,
  • 對于開放地址法來說,其背后的數(shù)學(xué)分析也非常復(fù)雜,
  • 結(jié)論都是 只要去擴容的這個負載率的值選擇的合適,那么它的時間復(fù)雜度也是O(1)。
  • 開放地址法中哈希表的數(shù)組空間中每一個位置都有一個元素,
  • 它對每一個元素都是開放的,它的每一個位置沒有查找表,
  • 而不像鏈地址法那樣只對根據(jù) hash 值計算出相同索引的這些元素開放,
  • 它的每一個位置都有一個查找表。
  • 更多的哈希沖突的處理方法
  • 除了鏈地址法、開放地址法之外還有其它的哈希沖突處理法,
  • 如 再哈希法(Rehashing):
  • 當你使用的一個哈希函數(shù)獲取到的索引產(chǎn)生的哈希沖突了,
  • 那么就使用另外一個 hash 函數(shù)來獲取索引。
  • 還有更難理解更抽象的方法,
  • 叫做 Coalesced Hashing(合并地址法),這種解決哈希沖突的方法綜合了
  • Seperate Chaining 和 Open Addressing,
  • 也就是將鏈地址法(封閉地址法)和開放地址法進行了一個巧妙地融合。
  • 總結(jié)

    以上是生活随笔為你收集整理的【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    av香港经典三级级 在线 | 永久免费观看美女裸体的网站 | 国产偷国产偷精品高清尤物 | 欧美精品无码一区二区三区 | 少妇被粗大的猛进出69影院 | av香港经典三级级 在线 | 波多野结衣一区二区三区av免费 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久亚洲中文字幕无码 | 伊人久久大香线蕉午夜 | 日本大香伊一区二区三区 | 欧洲熟妇色 欧美 | 国产精品久久久av久久久 | 欧美人与善在线com | 黑人巨大精品欧美黑寡妇 | 国产性生交xxxxx无码 | 两性色午夜视频免费播放 | 久久久久久久人妻无码中文字幕爆 | 伊在人天堂亚洲香蕉精品区 | 国产成人无码午夜视频在线观看 | 国产亚洲精品久久久闺蜜 | 无码成人精品区在线观看 | 天堂а√在线地址中文在线 | 欧美激情综合亚洲一二区 | 日本高清一区免费中文视频 | 欧美真人作爱免费视频 | 无码成人精品区在线观看 | 亚洲国产精品久久久久久 | 色综合久久久久综合一本到桃花网 | www成人国产高清内射 | 无码乱肉视频免费大全合集 | 日韩精品无码一区二区中文字幕 | 国产成人精品视频ⅴa片软件竹菊 | 久久99精品久久久久婷婷 | 亚洲七七久久桃花影院 | 亚洲色大成网站www国产 | 少妇人妻av毛片在线看 | 亚洲国产综合无码一区 | 无码国产激情在线观看 | 又色又爽又黄的美女裸体网站 | 精品一二三区久久aaa片 | 激情内射日本一区二区三区 | 曰本女人与公拘交酡免费视频 | 国产人成高清在线视频99最全资源 | 西西人体www44rt大胆高清 | 国产va免费精品观看 | 又粗又大又硬毛片免费看 | 熟女体下毛毛黑森林 | 亚洲欧美综合区丁香五月小说 | 日韩人妻无码一区二区三区久久99 | 中文字幕人成乱码熟女app | 亚洲熟熟妇xxxx | 欧美人与牲动交xxxx | 免费人成网站视频在线观看 | 成人女人看片免费视频放人 | 男女爱爱好爽视频免费看 | 99精品视频在线观看免费 | 伊在人天堂亚洲香蕉精品区 | 中文无码精品a∨在线观看不卡 | 成人免费视频在线观看 | 国产特级毛片aaaaaaa高清 | 国产精品无码一区二区三区不卡 | 狠狠色丁香久久婷婷综合五月 | 亚洲乱亚洲乱妇50p | 国产sm调教视频在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 夫妻免费无码v看片 | 乱码av麻豆丝袜熟女系列 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲熟女一区二区三区 | 无码一区二区三区在线观看 | 久久精品人人做人人综合试看 | 久久精品中文字幕一区 | 蜜桃视频插满18在线观看 | 国产精品怡红院永久免费 | 久久久久久久女国产乱让韩 | 精品国产成人一区二区三区 | 亚洲一区二区三区国产精华液 | 熟女体下毛毛黑森林 | 国产亚洲日韩欧美另类第八页 | 男女作爱免费网站 | 少妇太爽了在线观看 | 亚洲中文字幕无码中字 | 男人的天堂2018无码 | 国产激情无码一区二区 | 大乳丰满人妻中文字幕日本 | 高清国产亚洲精品自在久久 | 99久久亚洲精品无码毛片 | 久久久精品成人免费观看 | 99久久久无码国产精品免费 | 亚洲国产欧美日韩精品一区二区三区 | 一本色道久久综合狠狠躁 | 欧美喷潮久久久xxxxx | 久久国产36精品色熟妇 | 亚洲精品无码人妻无码 | 中文字幕无码视频专区 | 国产精品美女久久久久av爽李琼 | 精品无码成人片一区二区98 | 精品成在人线av无码免费看 | 18禁止看的免费污网站 | 国产内射老熟女aaaa | 国产精品久久久久久亚洲影视内衣 | 日韩成人一区二区三区在线观看 | 亚洲国产精品美女久久久久 | 老司机亚洲精品影院 | 国产色精品久久人妻 | 国产精品久久久久久久9999 | 亚洲经典千人经典日产 | 精品国偷自产在线视频 | 亚洲熟女一区二区三区 | 色综合天天综合狠狠爱 | 中文无码伦av中文字幕 | 欧美人与禽猛交狂配 | 国产午夜视频在线观看 | 色综合久久久久综合一本到桃花网 | 亚洲成av人影院在线观看 | 99久久人妻精品免费一区 | 欧美变态另类xxxx | 久久久久亚洲精品中文字幕 | 国语精品一区二区三区 | 精品久久久久久亚洲精品 | 国产成人午夜福利在线播放 | 亚洲熟悉妇女xxx妇女av | 中文字幕无码人妻少妇免费 | 暴力强奷在线播放无码 | 色婷婷久久一区二区三区麻豆 | 无码免费一区二区三区 | 青青青爽视频在线观看 | 久久精品视频在线看15 | 精品午夜福利在线观看 | 国产亚洲人成a在线v网站 | 亚洲毛片av日韩av无码 | 欧美日韩综合一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品无码一区二区三区不卡 | 午夜丰满少妇性开放视频 | 国产女主播喷水视频在线观看 | 日韩精品成人一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 人妻有码中文字幕在线 | 亚洲中文无码av永久不收费 | 国产sm调教视频在线观看 | 成在人线av无码免费 | 亚洲经典千人经典日产 | 色偷偷人人澡人人爽人人模 | 青草视频在线播放 | 国产午夜亚洲精品不卡 | 国产精品无码成人午夜电影 | 老子影院午夜精品无码 | 精品久久久久久人妻无码中文字幕 | 亚洲日韩av一区二区三区四区 | 丝袜美腿亚洲一区二区 | 永久免费精品精品永久-夜色 | 久久人妻内射无码一区三区 | 国产无遮挡吃胸膜奶免费看 | 精品久久久无码人妻字幂 | 国产口爆吞精在线视频 | 欧美精品国产综合久久 | 成人试看120秒体验区 | 精品国产青草久久久久福利 | 国产亚洲精品久久久久久大师 | 久久综合香蕉国产蜜臀av | 亚洲乱亚洲乱妇50p | 亚洲国产精品无码一区二区三区 | 亚洲欧洲中文日韩av乱码 | 国产激情精品一区二区三区 | 国产在线一区二区三区四区五区 | 久久久久久九九精品久 | 成人免费视频一区二区 | 国产av人人夜夜澡人人爽麻豆 | 欧美野外疯狂做受xxxx高潮 | 国产人妻久久精品二区三区老狼 | 亚洲精品一区二区三区婷婷月 | 久久99精品久久久久久动态图 | 人妻天天爽夜夜爽一区二区 | 动漫av网站免费观看 | 乱人伦人妻中文字幕无码 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲国产日韩a在线播放 | 欧美熟妇另类久久久久久多毛 | 国产欧美熟妇另类久久久 | 国产精品va在线播放 | 欧美丰满老熟妇xxxxx性 | 香蕉久久久久久av成人 | 国产三级精品三级男人的天堂 | 精品人妻人人做人人爽夜夜爽 | 日本一本二本三区免费 | 天堂无码人妻精品一区二区三区 | 爱做久久久久久 | 久久久无码中文字幕久... | 久久精品国产99精品亚洲 | 亚洲色在线无码国产精品不卡 | 美女毛片一区二区三区四区 | 午夜时刻免费入口 | 国产亚洲欧美在线专区 | v一区无码内射国产 | 女人被男人躁得好爽免费视频 | 日本熟妇人妻xxxxx人hd | 精品无码国产自产拍在线观看蜜 | 亚洲a无码综合a国产av中文 | 日本乱人伦片中文三区 | 久久精品无码一区二区三区 | 一个人看的视频www在线 | 波多野结衣一区二区三区av免费 | 精品水蜜桃久久久久久久 | 免费男性肉肉影院 | 国产在线无码精品电影网 | 国产精品久久国产三级国 | 正在播放老肥熟妇露脸 | av人摸人人人澡人人超碰下载 | 无码人妻精品一区二区三区下载 | 国产又爽又猛又粗的视频a片 | 久久精品人人做人人综合 | 久久精品国产精品国产精品污 | 在线观看国产午夜福利片 | 天天综合网天天综合色 | 国产精品99爱免费视频 | 爽爽影院免费观看 | 亚洲一区二区三区国产精华液 | 少妇被黑人到高潮喷出白浆 | 精品欧洲av无码一区二区三区 | 人人妻人人澡人人爽人人精品浪潮 | 欧美激情一区二区三区成人 | 国内精品人妻无码久久久影院 | 无码免费一区二区三区 | 国产亚洲tv在线观看 | 欧美黑人巨大xxxxx | 国产精品无码一区二区桃花视频 | 久久精品99久久香蕉国产色戒 | 国产精品无码永久免费888 | 久久久久久久久888 | 强辱丰满人妻hd中文字幕 | 荫蒂添的好舒服视频囗交 | 国产亚洲精品精品国产亚洲综合 | 日韩av激情在线观看 | 黑人大群体交免费视频 | 亚洲中文字幕无码一久久区 | 精品少妇爆乳无码av无码专区 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品国产品国语在线观看 | 欧美乱妇无乱码大黄a片 | 四十如虎的丰满熟妇啪啪 | 久在线观看福利视频 | 无码国产色欲xxxxx视频 | 在线观看国产午夜福利片 | 亚洲精品美女久久久久久久 | 精品国产青草久久久久福利 | 人妻少妇被猛烈进入中文字幕 | 日日天日日夜日日摸 | 人妻有码中文字幕在线 | 荫蒂被男人添的好舒服爽免费视频 | 男女下面进入的视频免费午夜 | 乱人伦中文视频在线观看 | 日韩av无码一区二区三区 | 成人综合网亚洲伊人 | 国产香蕉尹人综合在线观看 | 国产特级毛片aaaaaaa高清 | 九九在线中文字幕无码 | 2019nv天堂香蕉在线观看 | 午夜男女很黄的视频 | 日韩欧美群交p片內射中文 | 无码国内精品人妻少妇 | 少妇一晚三次一区二区三区 | 久久无码中文字幕免费影院蜜桃 | 97夜夜澡人人双人人人喊 | 成人综合网亚洲伊人 | 成人一在线视频日韩国产 | 久久精品国产大片免费观看 | 亚洲日本一区二区三区在线 | 99国产精品白浆在线观看免费 | 成人免费无码大片a毛片 | 77777熟女视频在线观看 а天堂中文在线官网 | 中文字幕色婷婷在线视频 | 十八禁视频网站在线观看 | 亚洲人成网站免费播放 | 丰满岳乱妇在线观看中字无码 | 一本色道久久综合狠狠躁 | 在线观看国产午夜福利片 | 无码乱肉视频免费大全合集 | 亚洲 a v无 码免 费 成 人 a v | 三上悠亚人妻中文字幕在线 | 久久国产精品偷任你爽任你 | 欧美人与善在线com | 久久久亚洲欧洲日产国码αv | 青春草在线视频免费观看 | 亚洲熟悉妇女xxx妇女av | 久久人妻内射无码一区三区 | 男人的天堂av网站 | 亚洲精品一区三区三区在线观看 | 无码乱肉视频免费大全合集 | 九九久久精品国产免费看小说 | 中文字幕亚洲情99在线 | 99riav国产精品视频 | 少妇厨房愉情理9仑片视频 | 国内少妇偷人精品视频免费 | 国产亚洲tv在线观看 | 亚洲人成人无码网www国产 | 久久精品人人做人人综合试看 | 麻豆国产人妻欲求不满 | 亚洲欧洲中文日韩av乱码 | 国产熟妇高潮叫床视频播放 | 亚洲码国产精品高潮在线 | 亚洲中文字幕乱码av波多ji | 国产精品无码一区二区三区不卡 | 亚洲精品午夜无码电影网 | 亚洲日韩av一区二区三区四区 | 牲欲强的熟妇农村老妇女 | 亚洲熟妇色xxxxx欧美老妇y | 色妞www精品免费视频 | 久久99热只有频精品8 | 精品国产国产综合精品 | 无码精品国产va在线观看dvd | 一本一道久久综合久久 | 亚洲欧美色中文字幕在线 | 丁香花在线影院观看在线播放 | 亚洲精品久久久久中文第一幕 | 欧洲熟妇精品视频 | 丰满人妻被黑人猛烈进入 | 国产精品办公室沙发 | 久久精品国产99久久6动漫 | 国产精品二区一区二区aⅴ污介绍 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲成熟女人毛毛耸耸多 | 精品亚洲韩国一区二区三区 | 自拍偷自拍亚洲精品10p | 初尝人妻少妇中文字幕 | 无码国产激情在线观看 | 午夜男女很黄的视频 | 亚洲呦女专区 | 亚洲一区二区三区含羞草 | 日韩无码专区 | 亚洲熟悉妇女xxx妇女av | 国产精品无码久久av | 国产精品人人爽人人做我的可爱 | 中文久久乱码一区二区 | 国产成人精品一区二区在线小狼 | 荫蒂被男人添的好舒服爽免费视频 | 久久精品国产一区二区三区肥胖 | 99久久无码一区人妻 | 色婷婷久久一区二区三区麻豆 | 久久久久久国产精品无码下载 | 人妻少妇精品无码专区二区 | 色一情一乱一伦一区二区三欧美 | 天天躁日日躁狠狠躁免费麻豆 | 精品人人妻人人澡人人爽人人 | 亚洲自偷精品视频自拍 | 日韩人妻无码中文字幕视频 | 性色欲网站人妻丰满中文久久不卡 | a在线观看免费网站大全 | 精品乱子伦一区二区三区 | 爽爽影院免费观看 | 真人与拘做受免费视频一 | 四虎国产精品一区二区 | 欧美性生交活xxxxxdddd | 日韩精品无码一区二区中文字幕 | 精品人妻人人做人人爽 | 水蜜桃亚洲一二三四在线 | 色婷婷久久一区二区三区麻豆 | 特级做a爰片毛片免费69 | 捆绑白丝粉色jk震动捧喷白浆 | 大地资源中文第3页 | 日本护士毛茸茸高潮 | 色婷婷综合激情综在线播放 | 麻豆国产人妻欲求不满 | 乌克兰少妇xxxx做受 | 99精品视频在线观看免费 | 九月婷婷人人澡人人添人人爽 | 亚洲第一网站男人都懂 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲日本一区二区三区在线 | 精品久久久中文字幕人妻 | 亚洲一区二区三区含羞草 | 丰满少妇弄高潮了www | 性欧美牲交在线视频 | 欧美日本免费一区二区三区 | 日韩精品乱码av一区二区 | 国产精品人妻一区二区三区四 | 精品亚洲韩国一区二区三区 | 久久国产自偷自偷免费一区调 | 国产av剧情md精品麻豆 | 亚洲成av人影院在线观看 | 国产激情无码一区二区app | 18禁黄网站男男禁片免费观看 | 欧美变态另类xxxx | 国产超级va在线观看视频 | 国产偷抇久久精品a片69 | 日韩亚洲欧美精品综合 | 久久www免费人成人片 | 亚洲午夜久久久影院 | 伊人久久大香线蕉亚洲 | 国产亚洲精品久久久闺蜜 | 色窝窝无码一区二区三区色欲 | 人人妻在人人 | 国产性生大片免费观看性 | 国产精品久久久午夜夜伦鲁鲁 | 久久久精品成人免费观看 | 在线精品亚洲一区二区 | av无码不卡在线观看免费 | 国产精品久久福利网站 | 久久亚洲日韩精品一区二区三区 | 亚洲自偷自偷在线制服 | 国产偷抇久久精品a片69 | 青春草在线视频免费观看 | 亚洲伊人久久精品影院 | 国产亚洲精品久久久久久大师 | 国产精品99久久精品爆乳 | 牲欲强的熟妇农村老妇女 | 又大又黄又粗又爽的免费视频 | 自拍偷自拍亚洲精品10p | 精品无码av一区二区三区 | 在线播放无码字幕亚洲 | 领导边摸边吃奶边做爽在线观看 | 黑人粗大猛烈进出高潮视频 | 欧美兽交xxxx×视频 | 精品国产麻豆免费人成网站 | 国产午夜亚洲精品不卡下载 | 精品国偷自产在线 | 大色综合色综合网站 | 亚洲一区二区三区四区 | 国产内射爽爽大片视频社区在线 | 精品成在人线av无码免费看 | 亚洲精品无码人妻无码 | 欧美 亚洲 国产 另类 | 国精产品一品二品国精品69xx | 天天摸天天碰天天添 | 精品国产精品久久一区免费式 | 日韩欧美中文字幕在线三区 | 女人高潮内射99精品 | 亚洲日韩av一区二区三区中文 | 女人和拘做爰正片视频 | 国产精品久免费的黄网站 | 亚洲精品中文字幕乱码 | 亚洲男人av天堂午夜在 | 欧美freesex黑人又粗又大 | 亚洲а∨天堂久久精品2021 | 在线欧美精品一区二区三区 | 国产精品国产三级国产专播 | 麻豆国产97在线 | 欧洲 | 亚洲无人区午夜福利码高清完整版 | 精品国产青草久久久久福利 | 波多野结衣乳巨码无在线观看 | 国产在线aaa片一区二区99 | 国产精品18久久久久久麻辣 | 日本熟妇乱子伦xxxx | 国产人妻久久精品二区三区老狼 | 少妇无码av无码专区在线观看 | 亚洲国产一区二区三区在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 国产麻豆精品精东影业av网站 | 欧美老妇交乱视频在线观看 | 久久www免费人成人片 | 天天燥日日燥 | 亚洲a无码综合a国产av中文 | 欧美日韩一区二区三区自拍 | 欧美丰满老熟妇xxxxx性 | 大屁股大乳丰满人妻 | 国产一区二区三区影院 | 天天摸天天透天天添 | 性欧美牲交xxxxx视频 | 女人高潮内射99精品 | 丝袜人妻一区二区三区 | 国产精品美女久久久网av | 国产色xx群视频射精 | 久久综合九色综合欧美狠狠 | 内射白嫩少妇超碰 | 精品国产一区二区三区四区在线看 | 中文字幕久久久久人妻 | 天天av天天av天天透 | 亚洲精品国偷拍自产在线麻豆 | 精品国产精品久久一区免费式 | 97无码免费人妻超级碰碰夜夜 | 强辱丰满人妻hd中文字幕 | 中文字幕无码人妻少妇免费 | 好屌草这里只有精品 | 国产9 9在线 | 中文 | 亚欧洲精品在线视频免费观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 97色伦图片97综合影院 | 国产成人无码一二三区视频 | 麻豆蜜桃av蜜臀av色欲av | 一二三四社区在线中文视频 | 精品久久久久久人妻无码中文字幕 | 国产激情综合五月久久 | 丰满护士巨好爽好大乳 | 日本大乳高潮视频在线观看 | 漂亮人妻洗澡被公强 日日躁 | 人妻插b视频一区二区三区 | 撕开奶罩揉吮奶头视频 | 亚洲精品久久久久中文第一幕 | 丰满妇女强制高潮18xxxx | 免费观看黄网站 | 国产明星裸体无码xxxx视频 | 牲交欧美兽交欧美 | 无码免费一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 中文字幕无码av波多野吉衣 | 国产乱人伦av在线无码 | 国产成人无码a区在线观看视频app | 在线播放无码字幕亚洲 | 中文亚洲成a人片在线观看 | 久久久中文字幕日本无吗 | 午夜精品久久久久久久久 | 成人试看120秒体验区 | 精品无码国产一区二区三区av | 国产亚洲精品久久久久久久久动漫 | 久久久久久a亚洲欧洲av冫 | 老熟女乱子伦 | 日韩av无码一区二区三区不卡 | 欧美一区二区三区视频在线观看 | 国产精品久久久久久久影院 | 亚洲欧美色中文字幕在线 | 人妻无码久久精品人妻 | 无码国产激情在线观看 | 成熟人妻av无码专区 | 欧美丰满熟妇xxxx性ppx人交 | 国产精品美女久久久久av爽李琼 | 久久久久久亚洲精品a片成人 | 欧美日韩久久久精品a片 | 日韩精品久久久肉伦网站 | 国产手机在线αⅴ片无码观看 | 亚洲一区二区三区偷拍女厕 | 美女黄网站人色视频免费国产 | 俺去俺来也在线www色官网 | 永久黄网站色视频免费直播 | 精品久久8x国产免费观看 | 中文字幕+乱码+中文字幕一区 | 少妇的肉体aa片免费 | 亚洲区欧美区综合区自拍区 | 色诱久久久久综合网ywww | 麻豆国产丝袜白领秘书在线观看 | 国产在线aaa片一区二区99 | 久久久久免费看成人影片 | 亚洲小说图区综合在线 | 精品偷拍一区二区三区在线看 | 国产无遮挡又黄又爽又色 | 人人澡人人妻人人爽人人蜜桃 | 国产香蕉尹人综合在线观看 | 日日摸夜夜摸狠狠摸婷婷 | 丰满人妻翻云覆雨呻吟视频 | 国产免费久久精品国产传媒 | 18禁止看的免费污网站 | 日韩人妻无码中文字幕视频 | 好屌草这里只有精品 | 亚洲人成人无码网www国产 | 午夜精品久久久久久久 | 精品 日韩 国产 欧美 视频 | 色诱久久久久综合网ywww | 国产一区二区三区四区五区加勒比 | 乱人伦人妻中文字幕无码久久网 | 精品国产一区二区三区四区在线看 | 亚洲中文字幕成人无码 | 亚洲精品国产a久久久久久 | 国产精品人人爽人人做我的可爱 | 最近中文2019字幕第二页 | 国产成人无码av一区二区 | 天堂а√在线中文在线 | 亚洲成a人一区二区三区 | 久久99精品久久久久久动态图 | 国内精品九九久久久精品 | 特级做a爰片毛片免费69 | 人妻与老人中文字幕 | 中文久久乱码一区二区 | 亚洲国产av精品一区二区蜜芽 | 久久午夜无码鲁丝片 | 欧美人与善在线com | 午夜福利一区二区三区在线观看 | 高潮毛片无遮挡高清免费视频 | 亚洲色成人中文字幕网站 | 人妻有码中文字幕在线 | 天堂а√在线地址中文在线 | 久久无码人妻影院 | www国产亚洲精品久久网站 | 帮老师解开蕾丝奶罩吸乳网站 | 熟女体下毛毛黑森林 | √天堂资源地址中文在线 | 日本丰满护士爆乳xxxx | 亚洲精品欧美二区三区中文字幕 | 天天燥日日燥 | 欧美国产亚洲日韩在线二区 | 欧美午夜特黄aaaaaa片 | 扒开双腿疯狂进出爽爽爽视频 | 欧美激情综合亚洲一二区 | 国产真人无遮挡作爱免费视频 | 国产av无码专区亚洲awww | 在线精品国产一区二区三区 | 露脸叫床粗话东北少妇 | 国产精品久久久午夜夜伦鲁鲁 | 国产suv精品一区二区五 | 一区二区三区乱码在线 | 欧洲 | 人人妻人人澡人人爽精品欧美 | 国产精品多人p群无码 | 蜜臀av无码人妻精品 | 搡女人真爽免费视频大全 | 亚洲一区二区三区香蕉 | 亚洲综合无码久久精品综合 | 欧美日韩久久久精品a片 | 野外少妇愉情中文字幕 | 牲交欧美兽交欧美 | 日本精品人妻无码77777 天堂一区人妻无码 | 暴力强奷在线播放无码 | 国产熟妇另类久久久久 | 在线а√天堂中文官网 | 国产内射老熟女aaaa | 人人妻人人澡人人爽人人精品 | 99re在线播放 | 精品偷自拍另类在线观看 | 久久综合久久自在自线精品自 | 国产午夜手机精彩视频 | 色综合久久中文娱乐网 | 亚洲中文字幕无码一久久区 | 国产性生交xxxxx无码 | 夫妻免费无码v看片 | 日本xxxx色视频在线观看免费 | 激情五月综合色婷婷一区二区 | 国产精品国产自线拍免费软件 | 日本乱人伦片中文三区 | 性欧美牲交在线视频 | 亚洲狠狠婷婷综合久久 | 久久精品成人欧美大片 | 中文字幕无码av波多野吉衣 | 欧美日本精品一区二区三区 | 亚洲色偷偷偷综合网 | 午夜时刻免费入口 | 亚拍精品一区二区三区探花 | 乱人伦中文视频在线观看 | 亚洲大尺度无码无码专区 | 国产av人人夜夜澡人人爽麻豆 | 久久久精品人妻久久影视 | 无码人妻黑人中文字幕 | 在线 国产 欧美 亚洲 天堂 | 国产人妻久久精品二区三区老狼 | 亚洲精品国产a久久久久久 | 亚洲精品久久久久久一区二区 | 亚洲国产精品成人久久蜜臀 | 日韩人妻无码中文字幕视频 | av无码不卡在线观看免费 | 国产黑色丝袜在线播放 | 一本大道伊人av久久综合 | 欧洲vodafone精品性 | 亚洲欧美日韩成人高清在线一区 | 夜先锋av资源网站 | 樱花草在线社区www | 高清无码午夜福利视频 | 国产在线精品一区二区三区直播 | 十八禁真人啪啪免费网站 | 小sao货水好多真紧h无码视频 | 国产精品久久久久久亚洲毛片 | 乌克兰少妇xxxx做受 | 国产成人一区二区三区在线观看 | 男女性色大片免费网站 | 日本高清一区免费中文视频 | 日韩在线不卡免费视频一区 | 纯爱无遮挡h肉动漫在线播放 | 久久久久国色av免费观看性色 | 人人爽人人澡人人人妻 | 在线精品国产一区二区三区 | 久久久精品人妻久久影视 | 国产精品久久久av久久久 | a国产一区二区免费入口 | 欧美日韩色另类综合 | 麻豆国产人妻欲求不满谁演的 | 国产亚洲精品久久久久久久久动漫 | 亚洲日韩av一区二区三区四区 | av香港经典三级级 在线 | 少女韩国电视剧在线观看完整 | 亚洲日韩av一区二区三区中文 | www国产亚洲精品久久久日本 | 精品人妻中文字幕有码在线 | 欧美激情内射喷水高潮 | 奇米影视7777久久精品 | 色婷婷综合激情综在线播放 | 亚洲伊人久久精品影院 | 国产亚洲精品久久久ai换 | 久久天天躁狠狠躁夜夜免费观看 | 精品成人av一区二区三区 | 天堂а√在线地址中文在线 | 亚洲日韩av片在线观看 | 日本成熟视频免费视频 | 精品少妇爆乳无码av无码专区 | 日韩亚洲欧美精品综合 | av在线亚洲欧洲日产一区二区 | 亚洲小说春色综合另类 | 性生交大片免费看女人按摩摩 | 免费看男女做好爽好硬视频 | 久久久久久a亚洲欧洲av冫 | 一个人看的视频www在线 | 亚洲理论电影在线观看 | 国产亚洲精品久久久ai换 | 成人欧美一区二区三区 | 性欧美videos高清精品 | 日产精品高潮呻吟av久久 | yw尤物av无码国产在线观看 | 国产成人无码区免费内射一片色欲 | a在线亚洲男人的天堂 | 亚洲娇小与黑人巨大交 | 99久久人妻精品免费二区 | 99久久久国产精品无码免费 | 国产精品无码mv在线观看 | 无码成人精品区在线观看 | 国产 精品 自在自线 | 国产无套内射久久久国产 | 日韩成人一区二区三区在线观看 | 亚洲国产精品一区二区第一页 | 成人综合网亚洲伊人 | 亚洲综合久久一区二区 | 日韩欧美中文字幕在线三区 | 蜜臀aⅴ国产精品久久久国产老师 | 老头边吃奶边弄进去呻吟 | 精品国产福利一区二区 | 免费国产黄网站在线观看 | 亚洲 a v无 码免 费 成 人 a v | 成人免费无码大片a毛片 | 99久久人妻精品免费一区 | 国产两女互慰高潮视频在线观看 | 亚洲码国产精品高潮在线 | 亚洲成熟女人毛毛耸耸多 | 国产热a欧美热a在线视频 | 久久久久免费看成人影片 | 99riav国产精品视频 | 国产超碰人人爽人人做人人添 | 九月婷婷人人澡人人添人人爽 | 欧美日韩综合一区二区三区 | 亚洲狠狠婷婷综合久久 | 精品久久8x国产免费观看 | 麻豆国产人妻欲求不满谁演的 | 亚洲人成无码网www | 国产精品办公室沙发 | 少妇性荡欲午夜性开放视频剧场 | 狠狠噜狠狠狠狠丁香五月 | 亚洲a无码综合a国产av中文 | 国产成人精品久久亚洲高清不卡 | 国产精品亚洲五月天高清 | 国产亚洲精品精品国产亚洲综合 | 亚洲gv猛男gv无码男同 | 欧美国产日韩久久mv | 久久国产劲爆∧v内射 | 青草视频在线播放 | 西西人体www44rt大胆高清 | 一个人看的视频www在线 | 天海翼激烈高潮到腰振不止 | 麻豆蜜桃av蜜臀av色欲av | 玩弄人妻少妇500系列视频 | 西西人体www44rt大胆高清 | 中文字幕乱码中文乱码51精品 | 亚洲男女内射在线播放 | 日韩精品无码一区二区中文字幕 | 婷婷五月综合激情中文字幕 | 国产成人精品三级麻豆 | 精品久久久久久人妻无码中文字幕 | 自拍偷自拍亚洲精品10p | 少女韩国电视剧在线观看完整 | 综合激情五月综合激情五月激情1 | aⅴ在线视频男人的天堂 | 欧美大屁股xxxxhd黑色 | 国产激情精品一区二区三区 | 国产艳妇av在线观看果冻传媒 | 国产激情无码一区二区app | 精品无人区无码乱码毛片国产 | 成人免费无码大片a毛片 | 国内精品久久久久久中文字幕 | 国产精品欧美成人 | 极品嫩模高潮叫床 | 亚洲中文字幕乱码av波多ji | 99re在线播放 | 国产舌乚八伦偷品w中 | 国产三级久久久精品麻豆三级 | 成人欧美一区二区三区黑人 | 亚洲精品一区国产 | 精品无人区无码乱码毛片国产 | 久久精品女人的天堂av | 久久精品国产大片免费观看 | 俺去俺来也www色官网 | 亚洲人成影院在线观看 | 大地资源中文第3页 | 色婷婷av一区二区三区之红樱桃 | 麻豆国产人妻欲求不满 | 亚洲综合精品香蕉久久网 | 欧美老熟妇乱xxxxx | 无码人妻少妇伦在线电影 | 国产精品久久久久久无码 | 久久久久成人片免费观看蜜芽 | 久久久久成人精品免费播放动漫 | 97久久超碰中文字幕 | 精品无码一区二区三区爱欲 | 亚洲精品久久久久中文第一幕 | 久久精品国产亚洲精品 | 色综合视频一区二区三区 | 精品欧洲av无码一区二区三区 | 久久亚洲a片com人成 | 无套内谢的新婚少妇国语播放 | 亚洲综合无码一区二区三区 | 兔费看少妇性l交大片免费 | 国产农村妇女高潮大叫 | 精品午夜福利在线观看 | 久久久久亚洲精品男人的天堂 | 国产熟妇另类久久久久 | 成人一区二区免费视频 | 国产高清不卡无码视频 | 九九久久精品国产免费看小说 | 国产亚洲视频中文字幕97精品 | 午夜理论片yy44880影院 | 午夜免费福利小电影 | 精品偷拍一区二区三区在线看 | 精品成人av一区二区三区 | 久久综合九色综合欧美狠狠 | 国产人妻人伦精品1国产丝袜 | 亚洲精品成人福利网站 | 日本一区二区三区免费播放 | 久久精品国产99精品亚洲 | 成熟人妻av无码专区 | 久久精品中文闷骚内射 | 中文字幕人妻无码一夲道 | 亚洲国产精品久久久久久 | 中文字幕久久久久人妻 | 成人亚洲精品久久久久 | 欧美成人家庭影院 | 国产精品高潮呻吟av久久 | 国产一区二区三区精品视频 | 岛国片人妻三上悠亚 | 亚洲欧洲日本综合aⅴ在线 | 无码人妻少妇伦在线电影 | 色窝窝无码一区二区三区色欲 | 学生妹亚洲一区二区 | 欧美性生交活xxxxxdddd | 中文字幕日产无线码一区 | 国产福利视频一区二区 | 精品国偷自产在线视频 | 伊人久久婷婷五月综合97色 | 无套内谢老熟女 | 久久精品丝袜高跟鞋 | 男女下面进入的视频免费午夜 | 少妇被粗大的猛进出69影院 | 美女张开腿让人桶 | 国产精品久久久久7777 | 97夜夜澡人人爽人人喊中国片 | 欧洲熟妇色 欧美 | 又大又紧又粉嫩18p少妇 | 无码中文字幕色专区 | 暴力强奷在线播放无码 | 麻花豆传媒剧国产免费mv在线 | 中文字幕av日韩精品一区二区 | 精品亚洲韩国一区二区三区 | 国产在线无码精品电影网 | 国产婷婷色一区二区三区在线 | 久久精品中文字幕一区 | 亚洲高清偷拍一区二区三区 | 麻豆果冻传媒2021精品传媒一区下载 | 在线а√天堂中文官网 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 丰满人妻精品国产99aⅴ | 日日摸天天摸爽爽狠狠97 | 99视频精品全部免费免费观看 | 欧美三级不卡在线观看 | 日本肉体xxxx裸交 | 精品偷拍一区二区三区在线看 | 中文字幕无码日韩欧毛 | 久久国产36精品色熟妇 | 国产人妻精品午夜福利免费 | 日韩人妻系列无码专区 | 极品嫩模高潮叫床 | 久久国内精品自在自线 | 精品无人国产偷自产在线 | 99er热精品视频 | 波多野结衣aⅴ在线 | 精品久久久中文字幕人妻 | 久久天天躁狠狠躁夜夜免费观看 | 欧美丰满熟妇xxxx性ppx人交 | 久久精品人人做人人综合 | 动漫av一区二区在线观看 | 兔费看少妇性l交大片免费 | 亚洲狠狠色丁香婷婷综合 | 久久99精品久久久久婷婷 | 99久久精品午夜一区二区 | 日日摸天天摸爽爽狠狠97 | 国产精华av午夜在线观看 | 国产亚洲日韩欧美另类第八页 | 国内精品九九久久久精品 | 亚洲精品一区二区三区在线观看 | 亚洲一区二区三区在线观看网站 | 人人妻人人澡人人爽人人精品浪潮 | 最近的中文字幕在线看视频 | 亚洲精品中文字幕久久久久 | 强奷人妻日本中文字幕 | 成熟妇人a片免费看网站 | 无码福利日韩神码福利片 | 午夜精品久久久内射近拍高清 | 樱花草在线播放免费中文 | 精品欧洲av无码一区二区三区 | 亚洲色欲色欲天天天www | 亚洲欧美精品伊人久久 | 人妻无码αv中文字幕久久琪琪布 | 全球成人中文在线 | 亚洲色www成人永久网址 | 国产极品美女高潮无套在线观看 | 无码一区二区三区在线观看 | 国产亚洲精品久久久久久 | 狠狠综合久久久久综合网 | 狠狠噜狠狠狠狠丁香五月 | www国产亚洲精品久久网站 | 国产超碰人人爽人人做人人添 | 天天av天天av天天透 | 性色欲网站人妻丰满中文久久不卡 | 亚洲色www成人永久网址 | 久久无码人妻影院 | 国产精品美女久久久 | 一个人免费观看的www视频 | 成人无码精品1区2区3区免费看 | 无码人妻丰满熟妇区毛片18 | 青青草原综合久久大伊人精品 | 日日碰狠狠丁香久燥 | 性生交大片免费看l | 亚洲国产精华液网站w | 人妻少妇被猛烈进入中文字幕 | 动漫av一区二区在线观看 | 中文字幕无码热在线视频 | 亚洲成av人综合在线观看 | 久久视频在线观看精品 | 日本xxxx色视频在线观看免费 | 美女极度色诱视频国产 | 亚洲精品午夜国产va久久成人 | 国产精品亚洲一区二区三区喷水 | 无码一区二区三区在线观看 | 国产激情综合五月久久 | 99久久精品无码一区二区毛片 | 啦啦啦www在线观看免费视频 | 亚洲色大成网站www国产 | 中文字幕久久久久人妻 | 久久亚洲中文字幕精品一区 | 亚洲精品国产精品乱码视色 | 亚洲精品无码国产 | 亚洲精品一区二区三区大桥未久 | 久久久av男人的天堂 | 欧美精品免费观看二区 | 国产精品无码成人午夜电影 | 国产成人精品一区二区在线小狼 | 亚洲一区二区三区四区 | 国产农村妇女高潮大叫 | 天天爽夜夜爽夜夜爽 | 99麻豆久久久国产精品免费 | 国产69精品久久久久app下载 | 色一情一乱一伦 | 激情五月综合色婷婷一区二区 | 国产成人无码av片在线观看不卡 | 色综合视频一区二区三区 | 国产精品久久国产三级国 | 色噜噜亚洲男人的天堂 | 在线播放免费人成毛片乱码 | 久久久久久久久888 | 亚洲中文无码av永久不收费 | 自拍偷自拍亚洲精品被多人伦好爽 | 无套内射视频囯产 | 免费观看又污又黄的网站 | 精品无码一区二区三区的天堂 | 大屁股大乳丰满人妻 | 欧美黑人乱大交 | 色诱久久久久综合网ywww | 国产无套粉嫩白浆在线 | 日本免费一区二区三区最新 | 亚洲国产欧美在线成人 | 丰满人妻翻云覆雨呻吟视频 | 免费人成网站视频在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 一本久道久久综合狠狠爱 | 偷窥日本少妇撒尿chinese | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产乱人伦偷精品视频 | 亚洲の无码国产の无码影院 | 色综合久久中文娱乐网 | 国产女主播喷水视频在线观看 | 成人免费视频在线观看 | 日本护士毛茸茸高潮 | 免费网站看v片在线18禁无码 | 亚洲国产精品成人久久蜜臀 | 日产精品99久久久久久 | 久久久久成人精品免费播放动漫 | 日本饥渴人妻欲求不满 | av无码电影一区二区三区 | 男女猛烈xx00免费视频试看 | 亚洲一区二区三区在线观看网站 | 老子影院午夜精品无码 | 领导边摸边吃奶边做爽在线观看 | 九九久久精品国产免费看小说 | 欧美国产日韩久久mv | 久久精品视频在线看15 | 亚洲精品无码人妻无码 | 激情内射日本一区二区三区 | 黑人巨大精品欧美黑寡妇 | 欧美自拍另类欧美综合图片区 | 伊人久久大香线蕉午夜 | 成年美女黄网站色大免费全看 | 强辱丰满人妻hd中文字幕 | 亚洲熟妇色xxxxx欧美老妇 | av香港经典三级级 在线 | 激情五月综合色婷婷一区二区 | 国产精品久久久久无码av色戒 | 国产亚洲精品久久久久久国模美 | 欧美 日韩 人妻 高清 中文 | 天堂亚洲免费视频 | 人人妻人人藻人人爽欧美一区 | 成人无码精品一区二区三区 | 精品国精品国产自在久国产87 | 欧美亚洲国产一区二区三区 | 欧美精品免费观看二区 | 人妻天天爽夜夜爽一区二区 | 亚洲成色在线综合网站 | 成熟人妻av无码专区 | 国产成人综合在线女婷五月99播放 | 波多野结衣av一区二区全免费观看 | 成人免费视频视频在线观看 免费 | 国产亚洲精品久久久久久 | 爆乳一区二区三区无码 | 精品一区二区不卡无码av | 人妻无码αv中文字幕久久琪琪布 | 扒开双腿吃奶呻吟做受视频 | 亚洲中文字幕在线无码一区二区 | 蜜桃av抽搐高潮一区二区 | 中文字幕人妻无码一区二区三区 | 狂野欧美性猛交免费视频 | 欧美 日韩 亚洲 在线 | 国产在线精品一区二区高清不卡 | 国产偷抇久久精品a片69 | 娇妻被黑人粗大高潮白浆 | 久久久久久九九精品久 | 欧美兽交xxxx×视频 | 欧美丰满少妇xxxx性 | 亚洲中文字幕无码一久久区 | 99久久人妻精品免费一区 | 亚洲色欲色欲欲www在线 | 国内揄拍国内精品少妇国语 | 九九在线中文字幕无码 | 黑人粗大猛烈进出高潮视频 | 激情综合激情五月俺也去 | 亚洲爆乳无码专区 | 国产sm调教视频在线观看 | 日本丰满熟妇videos | 久久人妻内射无码一区三区 | 欧美人与禽猛交狂配 | 国产精品久久久久久亚洲影视内衣 | 丰满人妻一区二区三区免费视频 | 亚洲区小说区激情区图片区 | 久久久久免费看成人影片 | 亚洲va中文字幕无码久久不卡 | 午夜丰满少妇性开放视频 | 无遮无挡爽爽免费视频 | 日本护士毛茸茸高潮 | 亚洲精品成人av在线 | 日韩亚洲欧美精品综合 | 97久久精品无码一区二区 | 性欧美牲交xxxxx视频 | 国产成人精品必看 | 精品人人妻人人澡人人爽人人 | 最近中文2019字幕第二页 | 少妇性l交大片欧洲热妇乱xxx | 国精产品一区二区三区 | 亚洲精品午夜国产va久久成人 | 丝袜足控一区二区三区 | 国产黄在线观看免费观看不卡 | 成人片黄网站色大片免费观看 | 亚洲精品一区二区三区在线 | 欧美喷潮久久久xxxxx | 国产精品毛片一区二区 | 领导边摸边吃奶边做爽在线观看 | 无码国产乱人伦偷精品视频 | 国产精品爱久久久久久久 | 成人综合网亚洲伊人 | 黑人玩弄人妻中文在线 | 亚洲中文字幕无码中字 | 人人妻人人藻人人爽欧美一区 | 无码人妻出轨黑人中文字幕 | 六月丁香婷婷色狠狠久久 | 欧美人与牲动交xxxx | 亚洲欧美日韩成人高清在线一区 | 国产精品二区一区二区aⅴ污介绍 | 蜜臀av在线播放 久久综合激激的五月天 | 中文字幕亚洲情99在线 | 国产精品久久久久无码av色戒 | 午夜福利一区二区三区在线观看 | 国产免费观看黄av片 | 老头边吃奶边弄进去呻吟 | 99久久久无码国产aaa精品 | 无码av最新清无码专区吞精 | 亚洲日韩精品欧美一区二区 | 在线观看国产一区二区三区 | 国产精品人人妻人人爽 | 亚洲热妇无码av在线播放 | 成熟人妻av无码专区 | 成人免费视频在线观看 | 成人性做爰aaa片免费看不忠 | 日产精品高潮呻吟av久久 | 中文字幕中文有码在线 | 狂野欧美性猛xxxx乱大交 | 天天综合网天天综合色 | 无码纯肉视频在线观看 | 久久国产自偷自偷免费一区调 | 精品一区二区三区无码免费视频 | 人妻尝试又大又粗久久 | 无码人妻少妇伦在线电影 | 亚洲精品国产品国语在线观看 | 国产精品高潮呻吟av久久4虎 | 成人三级无码视频在线观看 | 久久伊人色av天堂九九小黄鸭 | 99精品国产综合久久久久五月天 | 少妇无码一区二区二三区 | 2020最新国产自产精品 | 欧美成人高清在线播放 | 欧美日韩色另类综合 | 亚欧洲精品在线视频免费观看 | 久久综合给合久久狠狠狠97色 | 亚洲乱码国产乱码精品精 | 久久综合九色综合欧美狠狠 | 国产超碰人人爽人人做人人添 | 欧美熟妇另类久久久久久不卡 | 俺去俺来也在线www色官网 | 久青草影院在线观看国产 | 亚洲乱亚洲乱妇50p | 在线成人www免费观看视频 | 国产亚洲精品久久久久久久 | 国产无av码在线观看 | 99久久人妻精品免费二区 | 亚洲国产高清在线观看视频 | 色偷偷人人澡人人爽人人模 | 亚洲国产av美女网站 | 中文字幕乱码人妻无码久久 | 欧美 亚洲 国产 另类 | 内射爽无广熟女亚洲 | 久久久久人妻一区精品色欧美 | 久久久久久av无码免费看大片 | 国产三级精品三级男人的天堂 | 国产婷婷色一区二区三区在线 | 精品一区二区不卡无码av | 国产麻豆精品精东影业av网站 | 国语自产偷拍精品视频偷 | 久久精品人妻少妇一区二区三区 | 亚洲一区二区三区在线观看网站 | 成人试看120秒体验区 | 日本丰满护士爆乳xxxx | 无码任你躁久久久久久久 | 欧美精品一区二区精品久久 | 窝窝午夜理论片影院 | 亚洲 高清 成人 动漫 | 久久99国产综合精品 | 东京一本一道一二三区 | 欧美性生交活xxxxxdddd | 国产精品99久久精品爆乳 | 成人三级无码视频在线观看 | 夜夜躁日日躁狠狠久久av | 色婷婷欧美在线播放内射 | 亚洲精品成a人在线观看 | 成人综合网亚洲伊人 | 人妻熟女一区 | 国产精品久久国产三级国 | 波多野结衣av在线观看 | 国产精品无码mv在线观看 | 成人欧美一区二区三区黑人 | 色婷婷综合中文久久一本 | 色情久久久av熟女人妻网站 | 日韩在线不卡免费视频一区 | 国产av无码专区亚洲a∨毛片 | 人人澡人人妻人人爽人人蜜桃 | 国产电影无码午夜在线播放 | 欧美国产亚洲日韩在线二区 | 亚洲中文无码av永久不收费 | 又黄又爽又色的视频 | 国产黄在线观看免费观看不卡 | www一区二区www免费 | 国产美女极度色诱视频www | 久久精品国产一区二区三区肥胖 | 亚洲中文字幕乱码av波多ji | 人妻互换免费中文字幕 | 中文字幕中文有码在线 | 久久久国产精品无码免费专区 | 欧美人与禽猛交狂配 | 麻花豆传媒剧国产免费mv在线 | 一本色道久久综合亚洲精品不卡 | 久久精品99久久香蕉国产色戒 | 精品久久久无码人妻字幂 | 久久精品丝袜高跟鞋 | 精品无码国产一区二区三区av | 东京一本一道一二三区 | 性史性农村dvd毛片 | 欧美丰满老熟妇xxxxx性 | 亚洲成av人在线观看网址 | 99久久久国产精品无码免费 | 欧美人与动性行为视频 | 久久人人爽人人爽人人片av高清 | 亚洲日本在线电影 | 成人一区二区免费视频 | 国产精品手机免费 | 性色欲网站人妻丰满中文久久不卡 | yw尤物av无码国产在线观看 | 日本免费一区二区三区最新 | 欧美激情综合亚洲一二区 | 久热国产vs视频在线观看 | 在线精品国产一区二区三区 | 欧美人与牲动交xxxx | 国产亚洲人成在线播放 | 黑人巨大精品欧美黑寡妇 | 欧美丰满熟妇xxxx性ppx人交 | 一个人看的视频www在线 | 在线观看欧美一区二区三区 | 天堂а√在线中文在线 | 国产一区二区三区四区五区加勒比 | 水蜜桃亚洲一二三四在线 | av香港经典三级级 在线 | 亚洲成av人片天堂网无码】 | 婷婷五月综合缴情在线视频 | 免费观看的无遮挡av | 少妇无套内谢久久久久 | 日本熟妇乱子伦xxxx | 亚洲毛片av日韩av无码 | 图片小说视频一区二区 | 少妇久久久久久人妻无码 | 少妇性l交大片 | 国产精品人人妻人人爽 | 丝袜人妻一区二区三区 | 国产欧美亚洲精品a | 精品久久久久久亚洲精品 | 天干天干啦夜天干天2017 | 久久精品丝袜高跟鞋 | 国产香蕉97碰碰久久人人 | 国产另类ts人妖一区二区 | 99久久久无码国产精品免费 | 色一情一乱一伦一区二区三欧美 | 国产av一区二区精品久久凹凸 | 亚洲国精产品一二二线 | 国产日产欧产精品精品app | 成年女人永久免费看片 | 精品少妇爆乳无码av无码专区 | 性做久久久久久久免费看 | 精品成人av一区二区三区 | 国产精品a成v人在线播放 | 色综合久久88色综合天天 | 精品久久综合1区2区3区激情 | 久久亚洲中文字幕精品一区 | 精品一区二区三区无码免费视频 | 女人被男人爽到呻吟的视频 | 久久久久久久久蜜桃 | 内射后入在线观看一区 | 国产成人无码av在线影院 | 国产热a欧美热a在线视频 | 伊人久久大香线蕉av一区二区 | 精品日本一区二区三区在线观看 | 国产偷抇久久精品a片69 | 欧美变态另类xxxx | 无码毛片视频一区二区本码 | 久久99国产综合精品 | 精品无人国产偷自产在线 | 四虎影视成人永久免费观看视频 | 久久午夜无码鲁丝片秋霞 | 中文字幕无码视频专区 | 国产精品免费大片 | 蜜桃av抽搐高潮一区二区 | 青草青草久热国产精品 | 亚洲欧美精品aaaaaa片 | 少妇一晚三次一区二区三区 | ass日本丰满熟妇pics | 黑人粗大猛烈进出高潮视频 | 日本一本二本三区免费 | 人人妻人人澡人人爽欧美一区 | 久久精品中文字幕一区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产人妻精品一区二区三区不卡 | 欧美性生交活xxxxxdddd | 欧美xxxx黑人又粗又长 | 国产卡一卡二卡三 | 一二三四社区在线中文视频 | 欧美成人午夜精品久久久 | 日本精品人妻无码77777 天堂一区人妻无码 | 免费观看激色视频网站 | 亚洲色欲久久久综合网东京热 | 伊在人天堂亚洲香蕉精品区 | 国产精品亚洲五月天高清 | 亚洲人亚洲人成电影网站色 | 亚洲综合精品香蕉久久网 | 日韩精品成人一区二区三区 | 日本大乳高潮视频在线观看 | 日韩精品乱码av一区二区 | 熟妇人妻无乱码中文字幕 | 欧美熟妇另类久久久久久不卡 | 美女黄网站人色视频免费国产 | 日日摸日日碰夜夜爽av | 一本久久a久久精品vr综合 | 中文字幕人妻无码一区二区三区 | 桃花色综合影院 | 成人精品一区二区三区中文字幕 | 国产激情精品一区二区三区 | 久久精品丝袜高跟鞋 | 天干天干啦夜天干天2017 | 中文字幕乱码人妻二区三区 | 国产明星裸体无码xxxx视频 | 亚洲中文字幕乱码av波多ji | 丰满人妻精品国产99aⅴ | 1000部啪啪未满十八勿入下载 | 亚洲国产欧美在线成人 | 色五月丁香五月综合五月 | 国内精品人妻无码久久久影院 | 亚洲日本在线电影 | 国产精品久久久久久亚洲毛片 | 美女极度色诱视频国产 | 亚洲成熟女人毛毛耸耸多 | 国内综合精品午夜久久资源 | 人妻体内射精一区二区三四 | 亚洲精品久久久久久久久久久 | 一本大道久久东京热无码av | 色一情一乱一伦一视频免费看 | 久久99精品国产.久久久久 | 99久久婷婷国产综合精品青草免费 | 伊人久久大香线蕉亚洲 | 国产两女互慰高潮视频在线观看 | 欧美 日韩 人妻 高清 中文 | 婷婷五月综合缴情在线视频 | 色狠狠av一区二区三区 | 国产情侣作爱视频免费观看 | 奇米影视7777久久精品人人爽 | 久久精品人人做人人综合试看 | 熟女俱乐部五十路六十路av | 日产国产精品亚洲系列 | 色婷婷久久一区二区三区麻豆 | 性色av无码免费一区二区三区 | 亚洲一区二区三区偷拍女厕 | 中国女人内谢69xxxxxa片 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲欧洲日本综合aⅴ在线 | 天堂а√在线地址中文在线 | 亚洲中文字幕va福利 | 少妇愉情理伦片bd | 一本久道久久综合狠狠爱 | 牛和人交xxxx欧美 | 日韩少妇白浆无码系列 | 又湿又紧又大又爽a视频国产 | aa片在线观看视频在线播放 | 国产香蕉97碰碰久久人人 | 亚洲自偷自偷在线制服 | 日本丰满熟妇videos | 国产黑色丝袜在线播放 | 久久久久久久女国产乱让韩 | 夜先锋av资源网站 | 免费看男女做好爽好硬视频 | 亚洲色www成人永久网址 | 久久综合网欧美色妞网 | 久久99精品久久久久久动态图 | 久久精品无码一区二区三区 | 国内揄拍国内精品人妻 | 亚洲中文字幕在线观看 | 300部国产真实乱 | 97se亚洲精品一区 | 亚洲小说春色综合另类 | 精品午夜福利在线观看 | 国产成人亚洲综合无码 | 老头边吃奶边弄进去呻吟 | 乱人伦人妻中文字幕无码久久网 | 国产综合色产在线精品 | 大地资源中文第3页 | 免费观看的无遮挡av | 亚洲成熟女人毛毛耸耸多 | 亚洲小说图区综合在线 | 久久无码中文字幕免费影院蜜桃 | 少妇的肉体aa片免费 | 麻豆果冻传媒2021精品传媒一区下载 | 狂野欧美性猛xxxx乱大交 | 国产乱子伦视频在线播放 | 久久久久久a亚洲欧洲av冫 | 黑人大群体交免费视频 | 亚洲乱码日产精品bd | 成熟妇人a片免费看网站 | 久久久久99精品国产片 | 无套内谢的新婚少妇国语播放 | 国产亚洲视频中文字幕97精品 | 无遮挡国产高潮视频免费观看 | 九一九色国产 | 亚洲中文无码av永久不收费 | 99久久人妻精品免费一区 | 亚洲大尺度无码无码专区 | 日本大香伊一区二区三区 | 久久国产精品_国产精品 | 精品日本一区二区三区在线观看 | 中文字幕日韩精品一区二区三区 | 性欧美牲交xxxxx视频 | 东京无码熟妇人妻av在线网址 | 人妻中文无码久热丝袜 | 日本丰满护士爆乳xxxx | 蜜桃视频插满18在线观看 | 99久久人妻精品免费二区 | 国产在线无码精品电影网 | 国产精品无码永久免费888 | aⅴ在线视频男人的天堂 | 久久精品国产99精品亚洲 | 中文无码伦av中文字幕 | 国产又爽又黄又刺激的视频 | 中文字幕av伊人av无码av | 亚洲国产日韩a在线播放 | 欧洲vodafone精品性 | 黄网在线观看免费网站 | 强辱丰满人妻hd中文字幕 | 无码福利日韩神码福利片 | 国产suv精品一区二区五 | 老熟妇仑乱视频一区二区 | 免费看男女做好爽好硬视频 | 亚洲一区二区三区无码久久 | 在线观看欧美一区二区三区 | 日韩无套无码精品 | 女人被男人躁得好爽免费视频 | 爱做久久久久久 | 亚洲乱亚洲乱妇50p | 国产乱人偷精品人妻a片 | 亚洲の无码国产の无码影院 | 18无码粉嫩小泬无套在线观看 | 小泽玛莉亚一区二区视频在线 | 国内少妇偷人精品视频 | 成人无码精品1区2区3区免费看 | 国产福利视频一区二区 | 欧美国产日韩久久mv | 粉嫩少妇内射浓精videos | 国产无遮挡吃胸膜奶免费看 | 自拍偷自拍亚洲精品10p | 日本欧美一区二区三区乱码 | av无码久久久久不卡免费网站 | 国产无遮挡又黄又爽免费视频 | 国产人妖乱国产精品人妖 | 欧美国产日韩久久mv | 欧美真人作爱免费视频 | 国产av久久久久精东av | 久久久久久国产精品无码下载 | 人妻体内射精一区二区三四 | 日韩欧美成人免费观看 | 色欲人妻aaaaaaa无码 | 麻豆国产人妻欲求不满谁演的 | 中文字幕av日韩精品一区二区 | 亚洲精品综合一区二区三区在线 | 精品偷自拍另类在线观看 | 水蜜桃色314在线观看 | 国产办公室秘书无码精品99 | 国产另类ts人妖一区二区 | 丰满少妇弄高潮了www | 麻豆国产97在线 | 欧洲 | 亚洲精品国产第一综合99久久 | 久久国产精品萌白酱免费 | 亚洲区欧美区综合区自拍区 | 性啪啪chinese东北女人 | 久久综合给合久久狠狠狠97色 | 欧美老妇交乱视频在线观看 | 色妞www精品免费视频 | 人人超人人超碰超国产 | 亚洲日韩中文字幕在线播放 | 久久午夜无码鲁丝片秋霞 | 窝窝午夜理论片影院 | 2019nv天堂香蕉在线观看 | а天堂中文在线官网 | 18禁黄网站男男禁片免费观看 | 国产一区二区三区四区五区加勒比 | 国产免费久久久久久无码 | 天干天干啦夜天干天2017 | 性欧美大战久久久久久久 | 永久免费观看美女裸体的网站 | 欧美一区二区三区 | 高清无码午夜福利视频 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲精品无码人妻无码 | 性欧美videos高清精品 | 丰满肥臀大屁股熟妇激情视频 | 精品无码一区二区三区的天堂 | 女人和拘做爰正片视频 | 国产色xx群视频射精 | 亚洲码国产精品高潮在线 | 少妇的肉体aa片免费 | 麻豆国产丝袜白领秘书在线观看 | 亚洲色欲久久久综合网东京热 | 精品人妻中文字幕有码在线 | 全黄性性激高免费视频 | 国产熟妇高潮叫床视频播放 | 高潮毛片无遮挡高清免费视频 | 国产欧美精品一区二区三区 | 国产精品无码一区二区桃花视频 | 国产人妻久久精品二区三区老狼 | 无套内射视频囯产 | 丰满人妻精品国产99aⅴ | 亚洲精品国产精品乱码视色 | 国产精品久久久久久亚洲毛片 | 久久人人爽人人爽人人片ⅴ | 精品国产一区二区三区av 性色 | 亚洲色欲色欲欲www在线 | 国产午夜福利亚洲第一 | 久久精品国产日本波多野结衣 | 天堂久久天堂av色综合 | 无码人妻精品一区二区三区不卡 | 欧美国产日韩久久mv | 成人性做爰aaa片免费看不忠 | 国产午夜无码精品免费看 | 国产莉萝无码av在线播放 | 国产精品多人p群无码 | 在线欧美精品一区二区三区 | 国产情侣作爱视频免费观看 | 风流少妇按摩来高潮 | 免费乱码人妻系列无码专区 | 国产无套内射久久久国产 | 久久精品女人的天堂av | 久久精品国产一区二区三区 | 色一情一乱一伦一区二区三欧美 | 欧美成人午夜精品久久久 | 国模大胆一区二区三区 | 国产免费久久精品国产传媒 | 久久zyz资源站无码中文动漫 | 香蕉久久久久久av成人 | 一本无码人妻在中文字幕免费 | 亚洲综合色区中文字幕 | 天堂一区人妻无码 | 欧美激情综合亚洲一二区 | 亚洲精品国产第一综合99久久 | 久久精品国产99精品亚洲 | 国产av一区二区三区最新精品 | 日本熟妇人妻xxxxx人hd | 国产av剧情md精品麻豆 | 美女极度色诱视频国产 | 亚洲精品欧美二区三区中文字幕 | 装睡被陌生人摸出水好爽 | 久久久久成人片免费观看蜜芽 | 日产精品高潮呻吟av久久 | 欧洲欧美人成视频在线 | 国产在线精品一区二区高清不卡 | 正在播放东北夫妻内射 | 色爱情人网站 | 中文字幕无码视频专区 | 久久综合给久久狠狠97色 | 国产免费久久精品国产传媒 | 精品久久综合1区2区3区激情 | 97久久国产亚洲精品超碰热 | 欧美国产日韩亚洲中文 | √8天堂资源地址中文在线 | 波多野结衣 黑人 | 内射爽无广熟女亚洲 | 中文字幕人妻无码一区二区三区 | 无套内谢的新婚少妇国语播放 | 天天摸天天碰天天添 | 久久精品女人的天堂av | 国产精品第一区揄拍无码 | 一区二区三区高清视频一 | av无码电影一区二区三区 | 性欧美牲交在线视频 | 内射老妇bbwx0c0ck | 日韩精品a片一区二区三区妖精 | 国产精品va在线观看无码 | 国产精品人妻一区二区三区四 | 亚洲男人av天堂午夜在 | 免费人成在线视频无码 | 欧美日韩视频无码一区二区三 | 亚洲中文字幕在线无码一区二区 | 精品无码一区二区三区爱欲 | 香港三级日本三级妇三级 | 国产人妖乱国产精品人妖 | 国产人妻精品一区二区三区不卡 | аⅴ资源天堂资源库在线 | 天天做天天爱天天爽综合网 | 亚洲综合色区中文字幕 | 人妻人人添人妻人人爱 | 亚洲精品国产品国语在线观看 | 久久综合给合久久狠狠狠97色 | 亚洲色欲色欲欲www在线 | 九九在线中文字幕无码 | 国産精品久久久久久久 | 国产精品igao视频网 | 国产猛烈高潮尖叫视频免费 | 亚洲va中文字幕无码久久不卡 | 日韩 欧美 动漫 国产 制服 | 亚洲色成人中文字幕网站 | 亚洲精品欧美二区三区中文字幕 | 亚洲午夜福利在线观看 | 亚洲一区二区三区播放 | 国产一区二区三区四区五区加勒比 | 亚洲欧美综合区丁香五月小说 | 亚洲色欲色欲欲www在线 | 波多野结衣乳巨码无在线观看 | 中国女人内谢69xxxx | 午夜熟女插插xx免费视频 | 又大又硬又黄的免费视频 | 99精品国产综合久久久久五月天 | 乱人伦中文视频在线观看 | 精品午夜福利在线观看 | 日本精品久久久久中文字幕 | 无码人妻丰满熟妇区毛片18 | 小泽玛莉亚一区二区视频在线 | 亚洲自偷自偷在线制服 | 中文字幕无线码 | 精品久久久无码人妻字幂 | 久久aⅴ免费观看 | 欧洲欧美人成视频在线 | 国产精品资源一区二区 | 7777奇米四色成人眼影 | 久久午夜夜伦鲁鲁片无码免费 | 午夜精品久久久久久久 | 国产猛烈高潮尖叫视频免费 | 永久黄网站色视频免费直播 | 亚洲国产精品久久久久久 | 欧美性猛交xxxx富婆 | 亚洲精品成人av在线 | 人妻熟女一区 | 波多野42部无码喷潮在线 | 亚洲a无码综合a国产av中文 | 亚洲 另类 在线 欧美 制服 | 丰满诱人的人妻3 | 成人亚洲精品久久久久 | 国产农村乱对白刺激视频 | 无套内射视频囯产 | 中文精品无码中文字幕无码专区 | 国产热a欧美热a在线视频 | 亚洲中文字幕无码中文字在线 | 久久久久亚洲精品中文字幕 | 国产亚洲欧美在线专区 | 国产亚洲精品久久久久久国模美 | 激情亚洲一区国产精品 | 97se亚洲精品一区 | 亚洲日韩av片在线观看 | 久久久久人妻一区精品色欧美 | 亚洲天堂2017无码 | 国产激情艳情在线看视频 | 国产成人人人97超碰超爽8 | 国产亚洲精品久久久ai换 | 久久国产精品精品国产色婷婷 | 丰满人妻被黑人猛烈进入 | 97资源共享在线视频 | 波多野42部无码喷潮在线 | 熟妇人妻无乱码中文字幕 | 亚洲一区二区三区无码久久 | 欧美zoozzooz性欧美 | 国产av一区二区精品久久凹凸 | 亚洲色大成网站www国产 | 人妻天天爽夜夜爽一区二区 | 久久国产自偷自偷免费一区调 | 国产精品嫩草久久久久 | 亚洲 a v无 码免 费 成 人 a v | 亚洲熟妇色xxxxx欧美老妇y | 亚洲色欲久久久综合网东京热 | 国产无遮挡又黄又爽免费视频 | 国产精品永久免费视频 | 亚洲精品国产精品乱码视色 | 国产成人无码一二三区视频 | 欧美精品一区二区精品久久 | 国产av无码专区亚洲a∨毛片 | 中文字幕乱码人妻无码久久 | 午夜不卡av免费 一本久久a久久精品vr综合 | 蜜桃视频插满18在线观看 | 亚洲精品国产品国语在线观看 | 丁香花在线影院观看在线播放 | 成人欧美一区二区三区黑人 | 精品无码成人片一区二区98 | 午夜精品一区二区三区在线观看 | ass日本丰满熟妇pics | 日韩少妇内射免费播放 | 亚洲 另类 在线 欧美 制服 | 18无码粉嫩小泬无套在线观看 | 国产精品igao视频网 | 国产精品久久久午夜夜伦鲁鲁 | 久久久中文字幕日本无吗 | 亚洲日韩一区二区 | 性开放的女人aaa片 | 亚洲aⅴ无码成人网站国产app | 亚洲国产精华液网站w | 国产在线aaa片一区二区99 | 天堂久久天堂av色综合 | 国产精品办公室沙发 | 国产成人av免费观看 | 蜜桃臀无码内射一区二区三区 | 中文字幕无码av激情不卡 | 老子影院午夜伦不卡 | 女人和拘做爰正片视频 | а√天堂www在线天堂小说 | 中文字幕无码日韩欧毛 | 东京无码熟妇人妻av在线网址 | 无遮无挡爽爽免费视频 | 国产精品美女久久久网av | 九九久久精品国产免费看小说 | 麻豆国产丝袜白领秘书在线观看 | 国产一区二区三区日韩精品 | 久久精品99久久香蕉国产色戒 | 国产精品视频免费播放 | 国产午夜亚洲精品不卡 | 午夜男女很黄的视频 |