<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 97,  comments - 93,  trackbacks - 0
    Trie樹的定義(轉(zhuǎn))

    Trie樹是一棵度 m ≥ 2 的樹,它的每一層分支不是靠整個(gè)關(guān)鍵碼的值來確定,而是由關(guān)鍵碼的一個(gè)分量來確定。

    如下圖所示Trie樹,關(guān)鍵碼由英文字母組成。它包括兩類結(jié)點(diǎn):元素結(jié)點(diǎn)和分支結(jié)點(diǎn)。元素結(jié)點(diǎn)包含整個(gè)key數(shù)據(jù);分支結(jié)點(diǎn)有27個(gè)指針,其中有一個(gè)空白字符‘b’,用來終結(jié)關(guān)鍵碼;其它用來標(biāo)識(shí)‘a’, ‘b’,..., ‘z’等26個(gè)英文字母。

    在第0層,所有的關(guān)鍵碼根據(jù)它們第0位字符, 被劃分到互不相交的27個(gè)類中。

    因此,root→brch.link[i] 指向一棵子Trie樹,該子Trie樹上所包含的所有關(guān)鍵碼都是以第 i 個(gè)英文字母開頭。

    若某一關(guān)鍵碼第 j 位字母在英文字母表中順序?yàn)?i ( i = 0, 1, ?, 26 ), 則它在Trie樹的第 j 層分支結(jié)點(diǎn)中從第 i 個(gè)指針向下找第 j+1 位字母所在結(jié)點(diǎn)。當(dāng)一棵子Trie樹上只有一個(gè)關(guān)鍵碼時(shí),就由一個(gè)元素結(jié)點(diǎn)來代替。在這個(gè)結(jié)點(diǎn)中包含有關(guān)鍵碼,以及其它相關(guān)的信息,如對應(yīng)數(shù)據(jù)對象的存放 地址等。

    Trie樹的類定義:

    const int MaxKeySize = 25; //關(guān)鍵碼最大位數(shù)

    typedef struct { //關(guān)鍵碼類型
    char ch[MaxKeySize]; //關(guān)鍵碼存放數(shù)組
    int currentSize; //關(guān)鍵碼當(dāng)前位數(shù)
    } KeyType;

    class TrieNode { //Trie樹結(jié)點(diǎn)類定義
    friend class Trie;
    protected:
    enum { branch, element } NodeType; //結(jié)點(diǎn)類型
    union NodeType { //根據(jù)結(jié)點(diǎn)類型的兩種結(jié)構(gòu)
    struct { //分支結(jié)點(diǎn)
    int num; //本結(jié)點(diǎn)關(guān)鍵碼個(gè)數(shù)
    TrieNode *link[27]; //指針數(shù)組
    } brch;
    struct { //元素結(jié)點(diǎn)
    KeyType key; //關(guān)鍵碼
    recordNode *recptr; //指向數(shù)據(jù)對象指針
    } elem;
    }
    }

    class Trie { //Trie樹的類定義
    private:
    TrieNode *root, *current;
    public:
    RecordNode* Search ( const keyType & );
    int Insert ( const KeyType & );
    int Delete ( const KeyType & );
    }

    10.3.2 Trie樹的搜索

    為了在Trie樹上進(jìn)行搜索,要求把關(guān)鍵碼分解成一些字符元素, 并根據(jù)這些字符向下進(jìn)行分支。

    函數(shù) Search 設(shè)定 current = NULL, 表示不指示任何一個(gè)分支結(jié)點(diǎn), 如果 current 指向一個(gè)元素結(jié)點(diǎn) elem,則 current→elem.key 是 current 所指結(jié)點(diǎn)中的關(guān)鍵碼。

    Trie樹的搜索算法:

    RecordNode* Trie::Search ( const KeyType & x ) {
    k = x.key;
    concatenate ( k, ‘b’ );
    current = root;
    int i = 0; //掃描初始化
    while ( current != NULL && current→NodeType != element && i <= x.ch[i] ) {
    current = current→brch.link[ord (x.ch[i])];
    i = i++;
    };
    if ( current != NULL && current→NodeType == element && current→elem.key == x )
    return current→recptr;
    else
    return NULL;
    }

    經(jīng)驗(yàn)證,Trie樹的搜索算法在最壞情況下搜索的時(shí)間代價(jià)是 O(l)。其中, l 是Trie樹的層數(shù)(包括分支結(jié)點(diǎn)和元素結(jié)點(diǎn)在內(nèi))。

    在用作索引時(shí),Trie樹的所有結(jié)點(diǎn)都駐留在磁盤上。搜索時(shí)最多做 l 次磁盤存取。

    當(dāng)結(jié)點(diǎn)駐留在磁盤上時(shí),不能使用C++的指針 (pointer) 類型, 因?yàn)镃++不允許指針的輸入 / 輸出。在結(jié)點(diǎn)中的 link 指針可改用整型(integer) 實(shí)現(xiàn)。

    10.3.3 在Trie樹上的插入和刪除

    示例:插入關(guān)鍵碼bobwhite和bluejay。
    a. 插入 x = bobwhite 時(shí),首先搜索Trie樹尋找 bobwhite 所在的結(jié)點(diǎn)。
    b. 如果找到結(jié)點(diǎn), 并發(fā)現(xiàn)該結(jié)點(diǎn)的 link[‘o’] = NULL。x不在Trie樹中, 可以在該處插入。插入結(jié)果參看圖。
    c. 插入 x = bluejay時(shí),用Trie樹搜索算法可找到包含有 bluebird 的元素結(jié)點(diǎn),關(guān)鍵碼bluebird 和 bluejay 是兩個(gè)不同的值,它們在第5個(gè)字母處不匹配。從 Trie樹沿搜索路徑,在第4層分支。插入結(jié)果參看圖。

    在Trie樹上插入bobwhite和bluejay后的結(jié)果 :

    示例:考慮在上圖所示Trie樹中刪除bobwhite。此時(shí),只要將該結(jié)點(diǎn)link[‘o’]置為0 (NULL)即可,Trie樹的其它部分不需要改變。

    考慮刪除 bluejay。刪除之后在標(biāo)記為δ3 的子Trie樹中只剩下一個(gè)關(guān)鍵碼,這表明可以刪去結(jié)點(diǎn)δ3 ,同時(shí)結(jié)點(diǎn) ρ 向上移動(dòng)一層。對結(jié)點(diǎn)δ2 和δ1 可以做同樣的工作,最后到達(dá)結(jié)點(diǎn)б。因?yàn)橐鸳? 為根的子Trie樹中有多個(gè)關(guān)鍵碼,所以它不能刪去,令該結(jié)點(diǎn)link[‘l’] = ρ即可。

    為便于Trie樹的刪除, 在每個(gè)分支結(jié)點(diǎn)中設(shè)置了一個(gè) num 數(shù)據(jù)成員,它記載了結(jié)點(diǎn)中子女的數(shù)目。

    Trie,又稱單詞查找樹,是一種形結(jié)構(gòu),用于保存大量的字符串。它的優(yōu)點(diǎn)是:利用字符串的公共前綴來節(jié)約存儲(chǔ)空間。

    性質(zhì)

    它有3個(gè)基本性質(zhì):

    1. 根節(jié)點(diǎn)不包含字符,除根節(jié)點(diǎn)外每一個(gè)節(jié)點(diǎn)都只包含一個(gè)字符
    2. 根節(jié)點(diǎn)到某一節(jié)點(diǎn)路徑上經(jīng)過的字符連接起來,為該節(jié)點(diǎn)對應(yīng)的字符串
    3. 每個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)包含的字符都不相同。

    例子

    這是一個(gè)Trie結(jié)構(gòu)的例子:

    在這個(gè)Trie結(jié)構(gòu)中,保存了t、to、te、tea、ten、i、in、inn這8個(gè)字符串,僅占用8個(gè)字節(jié)(不包括指針占用的空間)



    問題:

      一、 一個(gè)文本文件有多行,每行為一個(gè)URL。請編寫代碼,統(tǒng)計(jì)出URL中的文件名及出現(xiàn)次數(shù)。

      a) 文件名不包括域名、路徑和URL參數(shù),例如http://www.rs.com/n.op/q/rs?id=1中的文件名是rs。

      b) 部分URL可能沒有文件名,例如http://www.abc.com/,這類統(tǒng)計(jì)為“空文件名”。

      c) 出現(xiàn)在不同URL中的相同文件名視為同一文件名,例如http://www.ceshi.com/hi.php和ftp://ftp.cdef.com/hi.php為同一文件名

      文件內(nèi)容示例如下:

      http://www.test.com/abc/de/fg.php?id=1&url=http://www.test.com/index.html

      http://www.ceshi.com/hi.jsp

      ftp://ftp.ceshi.com/hi.jsp

      http://www.hello.com/cw/hi.jsp?k=8

      http://www.hi.com/jk/l.html?id=1&s=a.html

      http://www.rs.com/n.op/q/rs?id=1

      http://www.abc.com/

      二、 一個(gè)簡單的論壇系統(tǒng),以數(shù)據(jù)庫儲(chǔ)存如下數(shù)據(jù):

      用戶名,email,主頁,電話,聯(lián)系地址,發(fā)帖標(biāo)題,發(fā)帖內(nèi)容,回復(fù)標(biāo)題,回復(fù)內(nèi)容。

      每天論壇訪問量300萬左右,更新帖子10萬左右。

      請給出數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計(jì),并結(jié)合范式簡要說明設(shè)計(jì)思路。

      三、 現(xiàn)有兩個(gè)文件,

      a)數(shù)據(jù)文件A,格式為:關(guān)鍵詞、IP地址、時(shí)間,記錄條數(shù)為1000萬左右,該文件是無序排列的。

      b)數(shù)據(jù)文件B是關(guān)鍵詞ID到關(guān)鍵詞的對應(yīng)表文件,格式為:ID、關(guān)鍵詞,記錄條數(shù)在100萬左右,也是無序排列的。該對應(yīng)表中的記錄是一一對應(yīng)的,不存在ID或者關(guān)鍵詞重復(fù)的情況。

      要求將數(shù)據(jù)文件A對應(yīng)的關(guān)鍵詞替換為B中的ID,生成新的數(shù)據(jù)文件C,數(shù)據(jù)文件C的格式為:關(guān)鍵詞ID、IP地址、時(shí)間。

      請?jiān)O(shè)計(jì)一個(gè)程序,實(shí)現(xiàn)上述功能,并分析時(shí)間復(fù)雜度和空間復(fù)雜度。運(yùn)行程序所使用的服務(wù)器的內(nèi)存為1G,硬盤足夠大。(至少要給出關(guān)鍵算法和設(shè)計(jì)思路)


     第一題
      簡評(píng)
      百度的主要業(yè)務(wù)是搜索,搜索的基本原理如下
      1.編寫爬蟲程序到互聯(lián)網(wǎng)上抓取網(wǎng)頁海量的網(wǎng)頁。
      2.將抓取來的網(wǎng)頁通過抽取,以一定的格式保存在能快速檢索的文件系統(tǒng)中。
      3.把用戶輸入的字符串進(jìn)行拆分成關(guān)鍵字去文件系統(tǒng)中查詢并返回結(jié)果。
      由以上3點(diǎn)可見,字符串的分析,抽取在搜索引擎中的地位是何等重要。
      因此,百度的筆試面試題中,出現(xiàn)這樣的題就變得理所當(dāng)然了。 

      以下是該題的java實(shí)現(xiàn),代碼如下:

     

    import java.net.*;
    import java.io.*;
    import java.util.*;
     
    /**
     * @author tzy
     * j2sdk1.4.2下測試通過
     */
    public class FileNameStat
    {
            private String srcPath;//要統(tǒng)計(jì)的文件路徑
            private Map statMap;//用于統(tǒng)計(jì)的map
            
            public FileNameStat(String srcPath)
            {
                   this.srcPath=srcPath;
                   statMap=new TreeMap();
            }
            
            /*獲得要統(tǒng)計(jì)的URL的文件名*/
            public String getFileName(String urlString)
            {
                   URL url=null;
                   String filePath=null;
                   String fileName=null;
                   try
                   {
                           url=new URL(urlString);
                           filePath=url.getPath();
                           int index=0;
                           if ((index=filePath.lastIndexOf("/"))!=-1)
                           {
                                   fileName=filePath.substring(index+1);
                           }
                           else
                           {
                                   fileName="";
                           }
                   }
                   catch(MalformedURLException e)
                   {
                   }
                   return fileName;
            }
            
            /*統(tǒng)計(jì)指定文件名的個(gè)數(shù)*/
            public void stat(String filename)
            {
                   Integer count=null;
                   if(statMap.get(filename)!=null)
                   {
                           count=(Integer)statMap.get(filename);
                           count=new Integer(count.intValue()+1);
                   }
                   else
                   {
                           count=new Integer(1);
                   }
                   statMap.put(filename,count);          
            }
            
            /*統(tǒng)計(jì)的主方法*/
            public void start() throws FileNotFoundException,IOException
            {
                   BufferedReader bfin=new BufferedReader(new FileReader(this.srcPath));
                   String temp=null;
                   while((temp=bfin.readLine())!=null)
                   {
                           stat(getFileName(temp));
                   }
            }
            
            /*輸出統(tǒng)計(jì)結(jié)果*/
            public void result()
            {
                   Iterator it=statMap.entrySet().iterator();
                   while(it.hasNext())
                   {
                           Map.Entry entry=(Map.Entry)(it.next());
                           System.out.println((entry.getKey().equals("")?"空文件名":entry.getKey()) + "的個(gè)數(shù)是" + entry.getValue());
                   }       
            }
            
            public static void main(String[] args) throws Exception
            {
                   FileNameStat fns=new FileNameStat("src.txt");//指定成待統(tǒng)計(jì)文件
                   fns.start();
                   fns.result();  
            }
    }

      第二題

      簡評(píng):

      這道題也與百度的業(yè)務(wù)有關(guān),百度現(xiàn)在除了搜索外,還有貼吧,知道,博客等重要產(chǎn)品。
      同時(shí)也在積極的探索社區(qū)化,包括前不久宣布進(jìn)軍電子商務(wù)領(lǐng)域,搜索之外的這些產(chǎn)品,
    其主要功能的實(shí)現(xiàn)主要是對數(shù)據(jù)庫的操作。
      因此,想進(jìn)入百度,也需要對數(shù)據(jù)庫有一定的認(rèn)識(shí)。
       實(shí)現(xiàn)思路及數(shù)據(jù)庫設(shè)計(jì)

      1,該論壇主要有兩個(gè)實(shí)體對象,用戶和帖子;對于帖子對象,有一個(gè)問題:回復(fù)的帖子是否應(yīng)該跟主題帖子存放在同一個(gè)表里?

      考慮到每天更新10萬帖子,說明帖子數(shù)比較多,為了方便主題的呈現(xiàn),我一般都把主題貼和回帖分別放在不同的表中,把主題貼和回帖分開可以提高查詢效率(300萬的訪問量每天)。

      2,按照1中的思路,該論壇由兩個(gè)對象(用戶和帖子)變成三個(gè)實(shí)體對象,分別是用戶,主題帖子,回復(fù)帖子;

      3,上述三個(gè)對象存在三個(gè)關(guān)系,分別是:

      用戶--主題帖,一個(gè)用戶可以發(fā)0個(gè)或多個(gè)帖子,一個(gè)帖子對應(yīng)一個(gè)用戶(一對多關(guān)系),

      主題帖--回復(fù)帖:一個(gè)主題有0個(gè)或多個(gè)回復(fù)帖子,一個(gè)回復(fù)帖子對應(yīng)一個(gè)主題(一對多關(guān)系);

      用戶--回復(fù)貼:一個(gè)用戶可以回0個(gè)或多個(gè)帖,一個(gè)帖子對應(yīng)一個(gè)用戶(一對多關(guān)系)。

      還存在對回復(fù)貼的回復(fù),這個(gè)考慮用fatherId來表示。

    4,由于三個(gè)關(guān)系 “用戶--主題帖,主題帖--回復(fù)帖,用戶--回復(fù)貼” 都是一對多關(guān)系,根據(jù)表設(shè)計(jì)一般原則,可以將這兩個(gè)關(guān)系獨(dú)立建立表,也可以不另外建表而將一對多的關(guān)系體現(xiàn)在實(shí)體表中;然而,表間的連接查詢是非常耗資源 的,所以應(yīng)盡量減少表間連接,那么對三個(gè)關(guān)系不應(yīng)該分別建表,而是把用戶的id作為主題表和回帖表的外鍵,把主題貼id作為回帖表的外鍵。

      5,鑒于以上考慮,該論壇的三個(gè)表如下所示

      表名:t_user_info (用戶信息表)

    字段名   類型  缺省值  中文含義  約束   備注 
     id   Int    用戶編號(hào)   PRI  Auto_increment
     Name   Varchar(30)     用戶名    
     Email   Varchar(50)        
     Phone   Varchar(30)          
     Addr  Varchar(200)        

    其他字段略,根據(jù)需要添加

      表名:main_content_info (主題帖信息表)

    字段名  類型   缺省值  中文含義  約束  備注
     id  Int    貼編號(hào)  PRI  Auto_increment
     Title  Varchar(200)    發(fā)帖標(biāo)題    
     Content  Text    發(fā)帖內(nèi)容    
     UserID   Int    用戶編號(hào)    外鍵

      其他字段略,根據(jù)需要添加

     表名:sub_content_info (回復(fù)貼信息表)

     字段名 類型   缺省值  中文含義 約束  備注 
     id  Int    貼編號(hào)  PRI  Auto_increment
     Title  Varchar(200)    發(fā)帖標(biāo)題    
     Content  Text    發(fā)帖內(nèi)容    
     UserID  Int    用戶編號(hào)    外鍵
     FatherID  Int    父編號(hào)    
     MainID  Int    主題帖編號(hào)    外鍵

      其他字段略,根據(jù)需要添加

      6,符合范式分析:

      上述表中每個(gè)字段不可再分,首先滿足1NF;

      然后數(shù)據(jù)庫表中的每個(gè)實(shí)例或行都是可以被惟一地區(qū)分(id),不存在部分依賴,因此滿足2NF;

      t_user_info (用戶信息表)和main_content_info (主題帖信息表)不存在任何傳遞依賴,至少屬于BCNF;

      但是sub_content_info (回復(fù)貼信息表)不滿足3NF,因?yàn)榇嬖谌缦聜鬟f依賴:id-->FatherID,FatherID-->MainID。

      范式并不是越高越好,sub_content_info表只滿足2NF卻更有效率,也是當(dāng)今論壇較主流的設(shè)計(jì)。

    第三題

      簡評(píng):

      如何對海量數(shù)據(jù)進(jìn)行快速檢索,這是搜索引擎的必需考慮的問題。這又涉及到數(shù)據(jù)結(jié)構(gòu)和算法。
      因此,要想進(jìn)入百度,就必須熟悉一些基本的算法和數(shù)據(jù)結(jié)構(gòu)。 

      思路及解決方案如下:

      1: 設(shè)計(jì)用TRIE樹實(shí)現(xiàn)關(guān)鍵詞到其對應(yīng)id的快速詞典查找

      TRIE樹的每一個(gè)節(jié)點(diǎn)為一個(gè)包含256個(gè)元素的數(shù)組,同時(shí)指針指向其下一級(jí)節(jié)點(diǎn)

      節(jié)點(diǎn)定義如下:

    struct trienode
     {
      int   id;
      struct trienode *child[256];
     }TRIENODE;

      如果TRIE樹的某個(gè)節(jié)點(diǎn)的指針為NULL,說明從跟節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的路徑構(gòu)成文件B中的一個(gè)關(guān)鍵詞,

      在其節(jié)點(diǎn)的id保存該關(guān)鍵詞的id;如果指針不為NULL,則id對應(yīng)為0或者一個(gè)無窮大的整數(shù),標(biāo)志從根節(jié)點(diǎn)

      到當(dāng)前節(jié)點(diǎn)的路徑不是一個(gè)完整的關(guān)鍵詞。

      將關(guān)鍵詞轉(zhuǎn)化為二進(jìn)制無符號(hào)char型數(shù)組,即對于漢字等雙字節(jié)字符視為兩個(gè)無符號(hào)char型整數(shù),

      每個(gè)元素的取值范圍在0到255之間。

     2:生成文件b的TRIE樹

      步驟1:依次讀取文件b的每一行,對每一行執(zhí)行步驟2到步驟5

      步驟2:讀取關(guān)鍵詞id和關(guān)鍵詞,令為key

      步驟3:依次讀取key的每一個(gè)字符,對每一個(gè)字符,執(zhí)行步驟4;

      步驟4:如果該字符對應(yīng)的指針為NULL,則創(chuàng)建其兒子節(jié)點(diǎn);

      步驟5:為當(dāng)前節(jié)點(diǎn)的對應(yīng)字符id置為關(guān)鍵詞id

      3:根據(jù)A文件生成C文件

      步驟1:依次讀取文件A的每一行,對每一行執(zhí)行步驟2到步驟5

      步驟2:分別獲取當(dāng)前行關(guān)鍵詞、ip地址和時(shí)間

      步驟3:令關(guān)鍵詞key=c1c2...cm,對c1到cm每個(gè)字符,執(zhí)行步驟4

      步驟4:獲取根節(jié)點(diǎn)的第c1個(gè)元素指針,轉(zhuǎn)移到節(jié)點(diǎn)node1,

      根據(jù)node1的第c2個(gè)元素指針,轉(zhuǎn)移到node2...

      根據(jù)nodem的第cm個(gè)元素,獲取關(guān)鍵詞的id

      步驟5:往文件c中寫入一行數(shù)據(jù),格式為關(guān)鍵詞的id、ip地址和時(shí)間

      4:復(fù)雜度分析

      生成文件B的TRIE樹過程時(shí)間復(fù)雜度為O(n*m),其中n為文件b行數(shù),m為文件b關(guān)鍵詞的最大長度。TRIE的空間復(fù)雜度為O(n*m),n和m含義同上,但由于實(shí)際應(yīng)用中關(guān)鍵詞之間可能會(huì)有很多前綴相同現(xiàn)象,所以實(shí)際耗費(fèi)空間并不會(huì)很高。

    生成C文件的時(shí)間復(fù)雜度同樣為O(n*m),n為文件a行數(shù),m為文件a關(guān)鍵詞的最大長度,因?yàn)橛辛薚RIE樹之后,給定一個(gè)關(guān)鍵詞獲得其id的時(shí)間復(fù) 雜度為關(guān)鍵詞長度。生成C文件的過程除了TRIE樹空間外基本不需要太多額外的空間,空間復(fù)雜度為O(1),由于系統(tǒng)有1G的可用內(nèi)存,TRIE占用的空 間在幾十兆到200M之間(與關(guān)鍵詞集合有關(guān)),因此本方法完全可行。


    posted on 2007-12-13 20:07 wqwqwqwqwq 閱讀(1737) 評(píng)論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2007年12月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345




    常用鏈接

    留言簿(10)

    隨筆分類(95)

    隨筆檔案(97)

    文章檔案(10)

    相冊

    J2ME技術(shù)網(wǎng)站

    java技術(shù)相關(guān)

    mess

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    校園夢網(wǎng)網(wǎng)絡(luò)電話,中國最優(yōu)秀的網(wǎng)絡(luò)電話
    主站蜘蛛池模板: 激情无码亚洲一区二区三区| ASS亚洲熟妇毛茸茸PICS| 久久久久久免费视频| 久久精品免费一区二区三区| 美女一级毛片免费观看| 色偷偷噜噜噜亚洲男人| 亚洲国产精品一区二区久久| 三上悠亚亚洲一区高清| 免费一级毛片女人图片| 免费人成视频在线| 成年午夜视频免费观看视频| 999在线视频精品免费播放观看| 在线美女免费观看网站h| 最近的中文字幕大全免费8| 猫咪免费人成网站在线观看| 久久国产精品免费看| 51精品视频免费国产专区| 最新欧洲大片免费在线| 国产资源免费观看| 久久久久国产成人精品亚洲午夜 | 亚洲国产精品一区二区成人片国内| 91麻豆精品国产自产在线观看亚洲| 亚洲免费日韩无码系列| 亚洲VA中文字幕无码一二三区| 91精品国产亚洲爽啪在线观看| 亚洲一区二区三区91| 欧洲精品码一区二区三区免费看| 日韩免费高清播放器| 2020久久精品国产免费| 免费一看一级毛片全播放| 亚洲AV无码第一区二区三区 | 日本中文一区二区三区亚洲| 亚洲精品国产日韩无码AV永久免费网 | 国产gv天堂亚洲国产gv刚刚碰| 亚洲综合婷婷久久| 一本大道一卡二大卡三卡免费 | 亚洲av成本人无码网站| 日本免费人成视频在线观看| 国产又长又粗又爽免费视频| 亚洲系列国产精品制服丝袜第| 精品久久亚洲一级α|