精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java實現(xiàn)雙數(shù)組Trie樹(DoubleArrayTrie,DAT)

開發(fā) 后端
傳統(tǒng)的Trie實現(xiàn)簡單,但是占用的空間實在是難以接受,特別是當字符集不僅限于英文26個字符的時候,爆炸起來的空間根本無法接受。雙數(shù)組Trie就是優(yōu)化了空間的Trie樹,原理本文就不講了,請參考An Efficient Implementation of Trie Structures,本程序的編寫也是參考這篇論文的。

傳統(tǒng)的Trie實現(xiàn)簡單,但是占用的空間實在是難以接受,特別是當字符集不僅限于英文26個字符的時候,爆炸起來的空間根本無法接受。

雙數(shù)組Trie就是優(yōu)化了空間的Trie樹,原理本文就不講了,請參考An Efficient Implementation of Trie Structures,本程序的編寫也是參考這篇論文的。

關(guān)于幾點論文沒有提及的細節(jié)和與論文不一一致的實現(xiàn):

1.對于插入字符串,如果有一個字符串是另一個字符串的子串的話,我是將結(jié)束符也作為一條邊,產(chǎn)生一個新的結(jié)點,這個結(jié)點新節(jié)點的Base我置為0

所以一個字符串結(jié)束也有2中情況:一個是Base值為負,存儲剩余字符(可能只有一個結(jié)束符)到Tail數(shù)組;另一個是Base為0。

所以在查詢的時候要考慮一下這兩種情況

2.對于***種沖突(論文中的Case 3),可能要將Tail中的字符串取出一部分,作為邊放到索引中。論文是使用將尾串左移的方式,我的方式直接修改Base值,而不是移動尾串。

下面是java實現(xiàn)的代碼,可以處理相同字符串插入,子串的插入等情況

  1. /*  
  2.  * Name:   Double Array Trie  
  3.  * Author: Yaguang Ding  
  4.  * Mail: dingyaguang117@gmail.com  
  5.  * Blog: blog.csdn.net/dingyaguang117  
  6.  * Date:   2012/5/21  
  7.  * Note: a word ends may be either of these two case:  
  8.  * 1. Base[cur_p] == pos  ( pos<0 and Tail[-pos] == 'END_CHAR' )  
  9.  * 2. Check[Base[cur_p] + Code('END_CHAR')] ==  cur_p  
  10.  */ 
  11.  
  12.  
  13. import java.util.ArrayList;  
  14. import java.util.HashMap;  
  15. import java.util.Map;  
  16. import java.util.Arrays;  
  17.  
  18.  
  19. public class DoubleArrayTrie {  
  20.     final char END_CHAR = '\0';  
  21.     final int DEFAULT_LEN = 1024;  
  22.     int Base[]  = new int [DEFAULT_LEN];  
  23.     int Check[] = new int [DEFAULT_LEN];  
  24.     char Tail[] = new char [DEFAULT_LEN];  
  25.     int Pos = 1;  
  26.     Map<Character ,Integer> CharMap = new HashMap<Character,Integer>();  
  27.     ArrayList<Character> CharList = new ArrayList<Character>();  
  28.       
  29.     public DoubleArrayTrie()  
  30.     {  
  31.         Base[1] = 1;  
  32.           
  33.         CharMap.put(END_CHAR,1);  
  34.         CharList.add(END_CHAR);  
  35.         CharList.add(END_CHAR);  
  36.         for(int i=0;i<26;++i)  
  37.         {  
  38.             CharMap.put((char)('a'+i),CharMap.size()+1);  
  39.             CharList.add((char)('a'+i));  
  40.         }  
  41.           
  42.     }  
  43.     private void Extend_Array()  
  44.     {  
  45.         Base = Arrays.copyOf(Base, Base.length*2);  
  46.         Check = Arrays.copyOf(Check, Check.length*2);  
  47.     }  
  48.       
  49.     private void Extend_Tail()  
  50.     {  
  51.         Tail = Arrays.copyOf(Tail, Tail.length*2);  
  52.     }  
  53.       
  54.     private int GetCharCode(char c)  
  55.     {  
  56.         if (!CharMap.containsKey(c))  
  57.         {  
  58.             CharMap.put(c,CharMap.size()+1);  
  59.             CharList.add(c);  
  60.         }  
  61.         return CharMap.get(c);  
  62.     }  
  63.     private int CopyToTailArray(String s,int p)  
  64.     {  
  65.         int _Pos = Pos;  
  66.         while(s.length()-p+1 > Tail.length-Pos)  
  67.         {  
  68.             Extend_Tail();  
  69.         }  
  70.         for(int i=p; i<s.length();++i)  
  71.         {  
  72.             Tail[_Pos] = s.charAt(i);  
  73.             _Pos++;  
  74.         }  
  75.         return _Pos;  
  76.     }  
  77.       
  78.     private int x_check(Integer []set)  
  79.     {  
  80.         for(int i=1; ; ++i)  
  81.         {  
  82.             boolean flag = true;  
  83.             for(int j=0;j<set.length;++j)  
  84.             {  
  85.                 int cur_p = i+set[j];  
  86.                 if(cur_p>= Base.length) Extend_Array();  
  87.                 if(Base[cur_p]!= 0 || Check[cur_p]!= 0)  
  88.                 {  
  89.                     flag = false;  
  90.                     break;  
  91.                 }  
  92.             }  
  93.             if (flag) return i;  
  94.         }  
  95.     }  
  96.       
  97.     private ArrayList<Integer> GetChildList(int p)  
  98.     {  
  99.         ArrayList<Integer> ret = new ArrayList<Integer>();  
  100.         for(int i=1; i<=CharMap.size();++i)  
  101.         {  
  102.             if(Base[p]+i >= Check.length) break;  
  103.             if(Check[Base[p]+i] == p)  
  104.             {  
  105.                 ret.add(i);  
  106.             }  
  107.         }  
  108.         return ret;  
  109.     }  
  110.       
  111.     private boolean TailContainString(int start,String s2)  
  112.     {  
  113.         for(int i=0;i<s2.length();++i)  
  114.         {  
  115.             if(s2.charAt(i) != Tail[i+start]) return false;  
  116.         }  
  117.           
  118.         return true;  
  119.     }  
  120.     private boolean TailMatchString(int start,String s2)  
  121.     {  
  122.         s2 += END_CHAR;  
  123.         for(int i=0;i<s2.length();++i)  
  124.         {  
  125.             if(s2.charAt(i) != Tail[i+start]) return false;  
  126.         }  
  127.         return true;  
  128.     }  
  129.       
  130.       
  131.     public void Insert(String s) throws Exception  
  132.     {  
  133.         s += END_CHAR;  
  134.           
  135.         int pre_p = 1;  
  136.         int cur_p;  
  137.         for(int i=0; i<s.length(); ++i)  
  138.         {  
  139.             //獲取狀態(tài)位置  
  140.             cur_p = Base[pre_p]+GetCharCode(s.charAt(i));  
  141.             //如果長度超過現(xiàn)有,拓展數(shù)組  
  142.             if (cur_p >= Base.length) Extend_Array();  
  143.               
  144.             //空閑狀態(tài)  
  145.             if(Base[cur_p] == 0 && Check[cur_p] == 0)  
  146.             {  
  147.                 Base[cur_p] = -Pos;  
  148.                 Check[cur_p] = pre_p;  
  149.                 Pos = CopyToTailArray(s,i+1);  
  150.                 break;  
  151.             }else 
  152.             //已存在狀態(tài)  
  153.             if(Base[cur_p] > 0 && Check[cur_p] == pre_p)  
  154.             {  
  155.                 pre_p = cur_p;  
  156.                 continue;  
  157.             }else 
  158.             //沖突 1:遇到 Base[cur_p]小于0的,即遇到一個被壓縮存到Tail中的字符串  
  159.             if(Base[cur_p] < 0 && Check[cur_p] == pre_p)  
  160.             {  
  161.                 int head = -Base[cur_p];  
  162.                   
  163.                 if(s.charAt(i+1)== END_CHAR && Tail[head]==END_CHAR)    //插入重復(fù)字符串  
  164.                 {  
  165.                     break;  
  166.                 }  
  167.                   
  168.                 //公共字母的情況,因為上一個判斷已經(jīng)排除了結(jié)束符,所以一定是2個都不是結(jié)束符  
  169.                 if (Tail[head] == s.charAt(i+1))  
  170.                 {  
  171.                     int avail_base = x_check(new Integer[]{GetCharCode(s.charAt(i+1))});  
  172.                     Base[cur_p] = avail_base;  
  173.                       
  174.                     Check[avail_base+GetCharCode(s.charAt(i+1))] = cur_p;  
  175.                     Base[avail_base+GetCharCode(s.charAt(i+1))] = -(head+1);  
  176.                     pre_p = cur_p;  
  177.                     continue;  
  178.                 }  
  179.                 else 
  180.                 {  
  181.                     //2個字母不相同的情況,可能有一個為結(jié)束符  
  182.                     int avail_base ;  
  183.                     avail_base = x_check(new Integer[]{GetCharCode(s.charAt(i+1)),GetCharCode(Tail[head])});  
  184.                       
  185.                     Base[cur_p] = avail_base;  
  186.                       
  187.                     Check[avail_base+GetCharCode(Tail[head])] = cur_p;  
  188.                     Check[avail_base+GetCharCode(s.charAt(i+1))] = cur_p;  
  189.                       
  190.                     //Tail 為END_FLAG 的情況  
  191.                     if(Tail[head] == END_CHAR)  
  192.                         Base[avail_base+GetCharCode(Tail[head])] = 0;  
  193.                     else 
  194.                         Base[avail_base+GetCharCode(Tail[head])] = -(head+1);  
  195.                     if(s.charAt(i+1) == END_CHAR)   
  196.                         Base[avail_base+GetCharCode(s.charAt(i+1))] = 0;  
  197.                     else 
  198.                         Base[avail_base+GetCharCode(s.charAt(i+1))] = -Pos;  
  199.                       
  200.                     Pos = CopyToTailArray(s,i+2);  
  201.                     break;  
  202.                 }  
  203.             }else 
  204.             //沖突2:當前結(jié)點已經(jīng)被占用,需要調(diào)整pre的base  
  205.             if(Check[cur_p] != pre_p)  
  206.             {  
  207.                 ArrayList<Integer> list1 = GetChildList(pre_p);  
  208.                 int toBeAdjust;  
  209.                 ArrayList<Integer> list = null;  
  210.                 if(true)  
  211.                 {  
  212.                     toBeAdjust = pre_p;  
  213.                     list = list1;  
  214.                 }  
  215.                   
  216.                 int origin_base = Base[toBeAdjust];  
  217.                 list.add(GetCharCode(s.charAt(i)));  
  218.                 int avail_base = x_check((Integer[])list.toArray(new Integer[list.size()]));  
  219.                 list.remove(list.size()-1);  
  220.                   
  221.                 Base[toBeAdjust] = avail_base;  
  222.                 for(int j=0; j<list.size(); ++j)  
  223.                 {  
  224.                     //BUG   
  225.                     int tmp1 = origin_base + list.get(j);  
  226.                     int tmp2 = avail_base + list.get(j);  
  227.                       
  228.                     Base[tmp2] = Base[tmp1];  
  229.                     Check[tmp2] = Check[tmp1];  
  230.                       
  231.                     //有后續(xù)  
  232.                     if(Base[tmp1] > 0)  
  233.                     {  
  234.                         ArrayList<Integer> subsequence = GetChildList(tmp1);  
  235.                         for(int k=0; k<subsequence.size(); ++k)  
  236.                         {  
  237.                             Check[Base[tmp1]+subsequence.get(k)] = tmp2;  
  238.                         }  
  239.                     }  
  240.                       
  241.                     Base[tmp1] = 0;  
  242.                     Check[tmp1] = 0;  
  243.                 }  
  244.                   
  245.                 //更新新的cur_p  
  246.                 cur_p = Base[pre_p]+GetCharCode(s.charAt(i));  
  247.                   
  248.                 if(s.charAt(i) == END_CHAR)  
  249.                     Base[cur_p] = 0;  
  250.                 else 
  251.                     Base[cur_p] = -Pos;  
  252.                 Check[cur_p] = pre_p;  
  253.                 Pos = CopyToTailArray(s,i+1);  
  254.                 break;  
  255.             }  
  256.         }  
  257.     }  
  258.       
  259.     public boolean Exists(String word)  
  260.     {  
  261.         int pre_p = 1;  
  262.         int cur_p = 0;  
  263.           
  264.         for(int i=0;i<word.length();++i)  
  265.         {  
  266.             cur_p = Base[pre_p]+GetCharCode(word.charAt(i));  
  267.             if(Check[cur_p] != pre_p) return false;  
  268.             if(Base[cur_p] < 0)  
  269.             {  
  270.                 if(TailMatchString(-Base[cur_p],word.substring(i+1)))  
  271.                     return true;  
  272.                 return false;  
  273.             }  
  274.             pre_p = cur_p;  
  275.         }  
  276.         if(Check[Base[cur_p]+GetCharCode(END_CHAR)] == cur_p)  
  277.             return true;  
  278.         return false;  
  279.     }  
  280.       
  281.     //內(nèi)部函數(shù),返回匹配單詞的最靠后的Base index,  
  282.     class FindStruct  
  283.     {  
  284.         int p;  
  285.         String prefix="";  
  286.     }  
  287.     private FindStruct Find(String word)  
  288.     {  
  289.         int pre_p = 1;  
  290.         int cur_p = 0;  
  291.         FindStruct fs = new FindStruct();  
  292.         for(int i=0;i<word.length();++i)  
  293.         {  
  294.             // BUG  
  295.             fs.prefix += word.charAt(i);  
  296.             cur_p = Base[pre_p]+GetCharCode(word.charAt(i));  
  297.             if(Check[cur_p] != pre_p)  
  298.             {  
  299.                 fs.p = -1;  
  300.                 return fs;  
  301.             }  
  302.             if(Base[cur_p] < 0)  
  303.             {  
  304.                 if(TailContainString(-Base[cur_p],word.substring(i+1)))  
  305.                 {  
  306.                     fs.p = cur_p;  
  307.                     return fs;  
  308.                 }  
  309.                 fs.p = -1;  
  310.                 return fs;  
  311.             }  
  312.             pre_p = cur_p;  
  313.         }  
  314.         fs.p =  cur_p;  
  315.         return fs;  
  316.     }  
  317.       
  318.     public ArrayList<String> GetAllChildWord(int index)  
  319.     {  
  320.         ArrayList<String> result = new ArrayList<String>();  
  321.         if(Base[index] == 0)  
  322.         {  
  323.             result.add("");  
  324.             return result;  
  325.         }  
  326.         if(Base[index] < 0)  
  327.         {  
  328.             String r="";  
  329.             for(int i=-Base[index];Tail[i]!=END_CHAR;++i)  
  330.             {  
  331.                 r+= Tail[i];  
  332.             }  
  333.             result.add(r);  
  334.             return result;  
  335.         }  
  336.         for(int i=1;i<=CharMap.size();++i)  
  337.         {  
  338.             if(Check[Base[index]+i] == index)  
  339.             {  
  340.                 for(String s:GetAllChildWord(Base[index]+i))  
  341.                 {  
  342.                     result.add(CharList.get(i)+s);  
  343.                 }  
  344.                 //result.addAll(GetAllChildWord(Base[index]+i));  
  345.             }  
  346.         }  
  347.         return result;  
  348.     }  
  349.       
  350.     public ArrayList<String> FindAllWords(String word)  
  351.     {  
  352.         ArrayList<String> result = new ArrayList<String>();  
  353.         String prefix = "";  
  354.         FindStruct fs = Find(word);  
  355.         int p = fs.p;  
  356.         if (p == -1return result;  
  357.         if(Base[p]<0)  
  358.         {  
  359.             String r="";  
  360.             for(int i=-Base[p];Tail[i]!=END_CHAR;++i)  
  361.             {  
  362.                 r+= Tail[i];  
  363.             }  
  364.             result.add(fs.prefix+r);  
  365.             return result;  
  366.         }  
  367.           
  368.         if(Base[p] > 0)  
  369.         {  
  370.             ArrayList<String> r =  GetAllChildWord(p);  
  371.             for(int i=0;i<r.size();++i)  
  372.             {  
  373.                 r.set(i, fs.prefix+r.get(i));  
  374.             }  
  375.             return r;  
  376.         }  
  377.           
  378.         return result;  
  379.     }  
  380.       

測  試

  1. import java.io.BufferedReader;  
  2. import java.io.FileInputStream;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import java.util.ArrayList;  
  7. import java.util.Scanner;  
  8.  
  9. import javax.xml.crypto.Data;  
  10.  
  11.  
  12. public class Main {  
  13.  
  14.     public static void main(String[] args) throws Exception {  
  15.         ArrayList<String> words = new ArrayList<String>();  
  16.         BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("E:/兔子的試驗學習中心[課內(nèi)]/ACM大賽/ACM第四屆校賽/E命令提示/words3.dic")));  
  17.         String s;  
  18.         int num = 0;  
  19.         while((s=reader.readLine()) != null)  
  20.         {  
  21.             words.add(s);  
  22.             num ++;  
  23.         }  
  24.         DoubleArrayTrie dat = new DoubleArrayTrie();  
  25.           
  26.         for(String word: words)  
  27.         {  
  28.             dat.Insert(word);  
  29.         }  
  30.           
  31.         System.out.println(dat.Base.length);  
  32.         System.out.println(dat.Tail.length);  
  33.           
  34.         Scanner sc = new Scanner(System.in);  
  35.         while(sc.hasNext())  
  36.         {  
  37.             String word = sc.next();  
  38.             System.out.println(dat.Exists(word));  
  39.             System.out.println(dat.FindAllWords(word));  
  40.         }  
  41.           
  42.     }  
  43.  
  44. }  

下面是測試結(jié)果,構(gòu)造6W英文單詞的DAT,大概需要20秒

 

我增長數(shù)組的時候是每次長度增加到2倍,初始1024

Base和Check數(shù)組的長度為131072

Tail的長度為262144

原文地址:Java實現(xiàn)雙數(shù)組Trie樹(DoubleArrayTrie,DAT)

責任編輯:林師授 來源: dingyaguang117博客
相關(guān)推薦

2021-06-30 17:38:03

Trie 樹字符Java

2020-10-30 09:56:59

Trie樹之美

2021-06-04 10:18:03

Trie字典樹數(shù)據(jù)

2012-09-25 09:19:26

Spring數(shù)據(jù)庫雙數(shù)據(jù)庫

2022-09-14 07:59:27

字典樹Trie基數(shù)樹

2022-10-28 09:10:40

數(shù)據(jù)結(jié)構(gòu)字典樹

2016-12-08 11:01:39

紅黑樹Java

2017-09-06 10:55:19

Java

2012-04-09 16:22:43

C#

2010-10-27 17:00:32

oracle樹查詢

2021-05-12 19:19:44

字典樹數(shù)據(jù)結(jié)構(gòu)

2009-11-16 16:17:45

PHP數(shù)組排序

2024-11-12 08:00:00

LSM樹GolangMemTable

2023-09-27 09:39:08

Java優(yōu)化

2012-01-06 15:18:53

Java

2023-01-09 18:15:21

數(shù)組Python類型

2014-12-10 10:02:14

華為銀行數(shù)據(jù)中心網(wǎng)絡(luò)

2009-08-13 10:35:05

Scala數(shù)組排序

2022-02-18 17:34:47

數(shù)組多維五維數(shù)組

2021-03-17 07:56:29

數(shù)組Map二叉樹
點贊
收藏

51CTO技術(shù)棧公眾號

99国产精品免费网站| 色综合久久影院| 久久这里只有| 久久久电影免费观看完整版| 佐佐木明希电影| 亚洲永久av| 亚洲乱码日产精品bd| 久久久久久国产精品mv| 国产又色又爽又黄又免费| 国产精品多人| 中日韩美女免费视频网址在线观看| 黄色aaaaaa| 范冰冰一级做a爰片久久毛片| 亚洲视频你懂的| 欧美不卡在线一区二区三区| 国产黄a三级三级看三级| 欧美亚洲专区| 欧美日韩国产999| 国产成人一区二区在线观看| 成人激情自拍| 日韩一区二区麻豆国产| 狠狠热免费视频| 国产福利电影在线播放| 亚洲天堂2016| 日韩在线电影一区| 日韩永久免费视频| 国产乱子伦视频一区二区三区 | 亚洲精品电影在线| 久久精品国产露脸对白| 欧美男女交配| 婷婷久久综合九色综合绿巨人| 在线观看精品视频| 国产永久免费高清在线观看视频| 成人午夜视频在线| 91九色单男在线观看| 波多野结衣在线电影| 国产欧美另类| 久久免费在线观看| 免费毛片在线播放免费| 91精品天堂福利在线观看| 中文在线不卡视频| 婷婷色一区二区三区| 偷拍视屏一区| 精品伊人久久97| 国产十八熟妇av成人一区| 久久综合偷偷噜噜噜色| 91精品国产一区二区三区香蕉| xxx国产在线观看| 经典三级一区二区| 色哟哟一区二区在线观看| 免费黄色福利视频| 在线免费三级电影网站| 欧美性极品xxxx做受| 欧美a v在线播放| 精品极品在线| 日韩欧美极品在线观看| 免费无码av片在线观看| 日韩毛片在线| 51精品视频一区二区三区| 在线看免费毛片| 国产精品亚洲综合在线观看 | 精品成人乱色一区二区| 日本十八禁视频无遮挡| 欧美13videosex性极品| 日韩欧美精品网站| 日韩中文字幕免费在线| 欧美va视频| 7777精品伊人久久久大香线蕉超级流畅| 又色又爽又黄视频| 清纯唯美激情亚洲| 亚洲大胆人体在线| xxxxx在线观看| 久久中文字幕av| 欧美成人精品一区二区| 国产无遮挡又黄又爽又色| 亚洲视频1区| 国产精品观看在线亚洲人成网| 中文字幕一区二区三区四区免费看 | 欧美成人四级hd版| 自拍偷拍欧美亚洲| 日韩成人免费电影| 亚洲精品免费一区二区三区| 日韩在线视频免费| 国产色产综合产在线视频| 亚洲欧美日韩不卡一区二区三区| 中文在线手机av| 亚洲va中文字幕| 欧美自拍小视频| 国产亚洲久久| 亚洲国产精品人人爽夜夜爽| 51妺嘿嘿午夜福利| 国产专区一区| 国产精品r级在线| 国产情侣自拍小视频| 久久综合色婷婷| 午夜啪啪免费视频| 美女在线视频免费| 欧美巨大另类极品videosbest | 日韩综合在线视频| 亚洲最大福利网站| 久草在现在线| 亚洲午夜av在线| 中文字幕网av| 黄色欧美网站| 久久精品99久久香蕉国产色戒| 国产精品美女毛片真酒店| 免费观看在线综合色| 国产视色精品亚洲一区二区| 欧美69xxx| 色婷婷综合久久久中文一区二区| 伊人av在线播放| 手机在线电影一区| 国产91亚洲精品| 午夜视频免费在线| 亚洲精品免费播放| 五月婷婷六月丁香激情| 精品中文一区| 久久久亚洲影院| 99久久久国产精品无码网爆| 国产精品免费久久久久| 四虎永久在线精品无码视频| 大陆精大陆国产国语精品| 久久这里有精品| 在线观看免费视频a| 久久青草欧美一区二区三区| 国产玉足脚交久久欧美| 精品一级视频| www.国产精品一二区| 秋霞av一区二区三区| www.99精品| 日本熟妇人妻xxxx| 亚洲一区电影| 欧美成人午夜影院| 中文字幕在线观看1| 国产亚洲成av人在线观看导航| 黄色大片中文字幕| julia中文字幕一区二区99在线| 精品激情国产视频| 亚洲天堂中文字幕在线| 亚洲国产精品二十页| www.欧美日本| 欧洲激情综合| 国产精品成人av性教育| 激情视频在线观看免费| 色妞www精品视频| 中文字幕av网址| 久久永久免费| 日日夜夜精品网站| 欧美大片网站| 超薄丝袜一区二区| www.色呦呦| 亚洲国产精品久久人人爱| 日批免费观看视频| 亚洲福利一区| 鲁鲁狠狠狠7777一区二区| 亚洲人成在线网站| 亚洲一区二区福利| 日本一区二区三区久久| 国产精品伦理一区二区| 欧美视频亚洲图片| 欧美午夜影院| 国产亚洲情侣一区二区无| 欧美激情护士| 亚洲色图35p| 亚洲一区 中文字幕| 中文字幕视频一区二区三区久| 操人视频免费看| 亚洲清纯自拍| 翔田千里亚洲一二三区| 日韩美女在线| 久久最新资源网| 午夜激情在线视频| 欧美日韩在线播放一区| 日韩影院一区二区| 成人av片在线观看| 成人中文字幕av| 亚洲激情中文在线| 国产在线欧美日韩| 国产一区一一区高清不卡| 久久色在线播放| 人成免费电影一二三区在线观看| 欧美性受xxxx黑人xyx性爽| 国产在线一卡二卡| 97国产一区二区| 亚洲一区二区福利视频| 一本色道久久综合亚洲精品不| 午夜一区二区三区| 中文字幕一区二区三区日韩精品| 日本精品视频在线播放| 成人福利网站| 亚洲毛片在线观看| 999国产精品视频免费| 欧美性猛交xxxx乱大交| 人人澡人人澡人人看| 91麻豆swag| 91亚洲一区二区| 老司机午夜精品视频在线观看| 中文字幕一区二区三区有限公司| 粉嫩av一区二区| 国产精品一区久久久| 国产传媒在线| 久久亚洲春色中文字幕| 四虎精品在永久在线观看 | 三区视频在线观看| 午夜亚洲影视| 久久综合久久网| 天天做天天爱天天综合网2021| 蜜桃网站成人| 国产色噜噜噜91在线精品| 国产一区二区色| 欧美最新精品| 69久久夜色精品国产69乱青草| v片在线观看| 综合国产在线视频| 少妇性bbb搡bbb爽爽爽欧美| 精品国产乱码91久久久久久网站| 伊人精品在线视频| 在线亚洲+欧美+日本专区| 日本特黄一级片| 亚洲综合在线五月| 乱h高h女3p含苞待放| 日本一区二区视频在线观看| 亚洲调教欧美在线| 国产精品一二一区| 日韩av在线中文| 日本视频在线一区| 色欲av无码一区二区人妻| 亚洲国产专区校园欧美| 成年丰满熟妇午夜免费视频| 亚洲国产精品成人| 四虎影院一区二区| 99久久99久久精品国产片果冰| 日本午夜一区二区三区| 国产乱码精品一区二区亚洲| 久久草.com| 日本成人7777| 久久综合色一本| 在线成人动漫av| 欧美精品一区在线| 久久av导航| 日韩.欧美.亚洲| 欧美综合久久| 日韩欧美一区二区三区久久婷婷| 在线观看欧美理论a影院| 欧美裸体网站| 亚洲欧美校园春色| 久久久99国产精品免费| 美女少妇全过程你懂的久久| 欧美激情论坛| 国产一区二区精品福利地址| 四虎影院一区二区三区 | 中文字幕av久久爽| 欧美日韩一级黄| 国产超碰人人模人人爽人人添| 制服丝袜中文字幕亚洲| www.日日夜夜| 亚洲精品成人av| 国产三级电影在线观看| 国产亚洲精品久久久久久777| 成人精品一区二区三区免费| 日韩在线观看免费网站| 国产在线看片| 欧美大片免费看| 九色porny丨入口在线| 日本精品免费一区二区三区| 日韩成人在线一区| 亚洲一区中文字幕| 国产香蕉精品| 日本一区视频在线观看免费| 97视频精品| av片在线免费| 久久婷婷麻豆| 伦伦影院午夜理论片| 99久久久免费精品国产一区二区| brazzers精品成人一区| 《视频一区视频二区| 日本在线观看视频网站| 在线免费观看日本欧美| 99久久久国产精品无码免费 | 视频免费一区| 欧美国产日韩一区二区在线观看 | 亚洲五码在线| 97欧洲一区二区精品免费| 婷婷成人综合| 黄色a级在线观看| 亚洲黄色av| 国产一级做a爰片久久| 国产高清久久久久| aaaaa级少妇高潮大片免费看| 亚洲欧洲三级电影| 日本一级淫片免费放| 欧美视频三区在线播放| 亚洲成人中文字幕在线| 亚洲色在线视频| 蜜乳av一区| 国产精品一区二区三区久久久| 一区二区三区四区精品视频| 青娱乐国产91| 亚洲高清免费| 久久6免费视频| 91浏览器在线视频| 一区二区视频免费看| 色婷婷av一区二区三区gif| 国产欧美综合视频| 亚洲色图av在线| 91豆花视频在线播放| 成人免费在线视频网站| 都市激情亚洲欧美| 中文视频一区视频二区视频三区| 欧美中文日韩| 丰满少妇xbxb毛片日本| 中文字幕在线观看一区二区| 99热在线观看免费精品| 91精品国产乱码久久蜜臀| 国外av在线| 91国语精品自产拍在线观看性色| 日韩黄色在线| 日韩精品欧美一区二区三区| 亚洲综合不卡| 韩国无码一区二区三区精品| 亚洲一区二区在线播放相泽| 国产女人高潮时对白| 色系列之999| av成人在线观看| 日韩福利二区| 久久亚洲色图| 91视频啊啊啊| 亚洲成人免费视| www.天堂在线| 欧美成人合集magnet| www.久久热| 国产精品h视频| 麻豆精品新av中文字幕| jizz中文字幕| 91高清在线观看| 免费国产在线观看| 9.1国产丝袜在线观看| 精品视频在线一区| 欧洲美女和动交zoz0z| 狠狠色丁香久久婷婷综| 欧美a级片免费看| 欧美另类变人与禽xxxxx| 免费在线看黄| 91精品中文在线| 欧美大片一区| 国产精品久久久久久亚洲av| 亚洲午夜久久久久久久久电影网 | 亚州精品国产| 亚洲第一页在线视频| 国产一区二区免费在线| 99久久婷婷国产综合| 日韩欧美视频在线| 里番在线播放| 精品国产乱码久久久久久蜜柚| 国产精品毛片一区二区三区| 欧美一区二区三区成人精品| 色悠久久久久综合欧美99| 95在线视频| 96sao精品视频在线观看| 中文av一区| 中文字幕免费高清视频| 欧美性xxxxxxx| 天堂中文а√在线| 亚洲尤物视频网| 亚洲激情午夜| 婷婷色一区二区三区| 欧美日本乱大交xxxxx| 2024最新电影在线免费观看| 国产伦一区二区三区色一情| 久久av一区| 毛片久久久久久| 日韩欧美一区中文| 国产在线精彩视频| 偷拍视频一区二区| 国产精品亚洲第一区在线暖暖韩国| 精品小视频在线观看| 亚洲毛片在线观看| 国产一区二区三区免费观看在线| 99在线精品免费视频| 国产欧美一区二区精品忘忧草 | 亚洲奶大毛多的老太婆| 国产精品无码久久久久| 国产精品久久久久久久乖乖| 国产拍揄自揄精品视频麻豆 | 亚洲欧美日韩精品久久亚洲区| 国产69精品久久| 日韩视频在线视频| 国产欧美精品一区| 亚洲乱熟女一区二区| 国产成人一区三区| 欧美精品一卡| 国产一区二区三区四区在线| 日韩欧美国产小视频| 电影一区二区三区| 日韩精品久久一区二区| 国产欧美一区二区三区网站| 午夜精品一二三区| 国产精品日韩在线一区| 亚洲区一区二| 东方av正在进入|