日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁(yè) > 學(xué)院 > 邏輯算法 > 正文

算法系列15天速成――第十三天 樹操作【下】

2024-09-08 23:18:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

聽說(shuō)赫夫曼勝過了他的導(dǎo)師,被認(rèn)為”青出于藍(lán)而勝于藍(lán)“,這句話也是我比較欣賞的,嘻嘻。

一  概念

    了解”赫夫曼樹“之前,幾個(gè)必須要知道的專業(yè)名詞可要熟練記住啊。

    1: 結(jié)點(diǎn)的權(quán)

            “權(quán)”就相當(dāng)于“重要度”,我們形象的用一個(gè)具體的數(shù)字來(lái)表示,然后通過數(shù)字的大小來(lái)決定誰(shuí)重要,誰(shuí)不重要。

    2: 路徑

             樹中從“一個(gè)結(jié)點(diǎn)"到“另一個(gè)結(jié)點(diǎn)“之間的分支。

    3: 路徑長(zhǎng)度

             一個(gè)路徑上的分支數(shù)量。

    4: 樹的路徑長(zhǎng)度

             從樹的根節(jié)點(diǎn)到每個(gè)節(jié)點(diǎn)的路徑長(zhǎng)度之和。

    5: 節(jié)點(diǎn)的帶權(quán)路徑路勁長(zhǎng)度

             其實(shí)也就是該節(jié)點(diǎn)到根結(jié)點(diǎn)的路徑長(zhǎng)度*該節(jié)點(diǎn)的權(quán)。

    6:   樹的帶權(quán)路徑長(zhǎng)度

             樹中各個(gè)葉節(jié)點(diǎn)的路徑長(zhǎng)度*該葉節(jié)點(diǎn)的權(quán)的和,常用WPL(Weight Path Length)表示。

二: 構(gòu)建赫夫曼樹

        上面說(shuō)了那么多,肯定是為下面做鋪墊,這里說(shuō)赫夫曼樹,肯定是要說(shuō)赫夫曼樹咋好咋好,赫夫曼樹是一種最優(yōu)二叉樹,

         因?yàn)樗腤PL是最短的,何以見得?我們可以上圖說(shuō)話。

現(xiàn)在我們做一個(gè)WPL的對(duì)比:

圖A: WPL= 5*2 + 7*2 +2*2+13*2=54

圖B:WPL=5*3+2*3+7*2+13*1=48

 

我們對(duì)比一下,圖B的WPL最短的,地球人已不能阻止WPL還能比“圖B”的小,所以,“圖B"就是一顆赫夫曼樹,那么大家肯定

要問,如何構(gòu)建一顆赫夫曼樹,還是上圖說(shuō)話。

 

第一步: 我們將所有的節(jié)點(diǎn)都作為獨(dú)根結(jié)點(diǎn)。

第二步:   我們將最小的C和A組建為一個(gè)新的二叉樹,權(quán)值為左右結(jié)點(diǎn)之和。

第三步: 將上一步組建的新節(jié)點(diǎn)加入到剩下的節(jié)點(diǎn)中,排除上一步組建過的左右子樹,我們選中B組建新的二叉樹,然后取權(quán)值。

第四步: 同上。

 

三: 赫夫曼編碼

      大家都知道,字符,漢字,數(shù)字在計(jì)算機(jī)中都是以0,1來(lái)表示的,相應(yīng)的存儲(chǔ)都是有一套編碼方案來(lái)支撐的,比如ASC碼。

 這樣才能在"編碼“和”解碼“的過程中不會(huì)成為亂碼,但是ASC碼不理想的地方就是等長(zhǎng)的,其實(shí)我們都想用較少的空間來(lái)存儲(chǔ)

更多的東西,那么我們就要采用”不等長(zhǎng)”的編碼方案來(lái)存儲(chǔ),那么“何為不等長(zhǎng)呢“?其實(shí)也就是出現(xiàn)次數(shù)比較多的字符我們采用短編碼,

出現(xiàn)次數(shù)較少的字符我們采用長(zhǎng)編碼,恰好,“赫夫曼編碼“就是不等長(zhǎng)的編碼。

    這里大家只要掌握赫夫曼樹的編碼規(guī)則:左子樹為0,右子樹為1,對(duì)應(yīng)的編碼后的規(guī)則是:從根節(jié)點(diǎn)到子節(jié)點(diǎn)

A: 111

B: 10

C: 110

D: 0

 

四: 實(shí)現(xiàn)

      不知道大家懂了沒有,不懂的話多看幾篇,下面說(shuō)下赫夫曼的具體實(shí)現(xiàn)。

         第一步:構(gòu)建赫夫曼樹。

         第二步:對(duì)赫夫曼樹進(jìn)行編碼。

         第三步:壓縮操作。

         第四步:解壓操作。

 

1:首先看下赫夫曼樹的結(jié)構(gòu),這里字段的含義就不解釋了。

復(fù)制代碼 代碼如下:

#region 赫夫曼樹結(jié)構(gòu)
    /// <summary>
/// 赫夫曼樹結(jié)構(gòu)
/// </summary>
    public class HuffmanTree
    {
        public int weight { get; set; }

        public int parent { get; set; }

        public int left { get; set; }

        public int right { get; set; }
    }
    #endregion

2: 創(chuàng)建赫夫曼樹,原理在上面已經(jīng)解釋過了,就是一步一步的向上搭建,這里要注意的二個(gè)性質(zhì)定理:

         當(dāng)葉子節(jié)點(diǎn)為N個(gè),則需要N-1步就能搭建赫夫曼樹。

         當(dāng)葉子節(jié)點(diǎn)為N個(gè),則赫夫曼樹的節(jié)點(diǎn)總數(shù)為:(2*N)-1個(gè)。

復(fù)制代碼 代碼如下:

#region 赫夫曼樹的創(chuàng)建
        /// <summary>
/// 赫夫曼樹的創(chuàng)建
/// </summary>
/// <param name="huffman">赫夫曼樹</param>
/// <param name="leafNum">葉子節(jié)點(diǎn)</param>
/// <param name="weight">節(jié)點(diǎn)權(quán)重</param>
        public HuffmanTree[] CreateTree(HuffmanTree[] huffman, int leafNum, int[] weight)
        {
            //赫夫曼樹的節(jié)點(diǎn)總數(shù)
            int huffmanNode = 2 * leafNum - 1;

            //初始化節(jié)點(diǎn),賦予葉子節(jié)點(diǎn)值
            for (int i = 0; i < huffmanNode; i++)
            {
                if (i < leafNum)
                {
                    huffman[i].weight = weight[i];
                }
            }

            //這里面也要注意,4個(gè)節(jié)點(diǎn),其實(shí)只要3步就可以構(gòu)造赫夫曼樹
            for (int i = leafNum; i < huffmanNode; i++)
            {
                int minIndex1;
                int minIndex2;
                SelectNode(huffman, i, out minIndex1, out minIndex2);

                //最后得出minIndex1和minindex2中實(shí)體的weight最小
                huffman[minIndex1].parent = i;
                huffman[minIndex2].parent = i;

                huffman[i].left = minIndex1;
                huffman[i].right = minIndex2;

                huffman[i].weight = huffman[minIndex1].weight + huffman[minIndex2].weight;
            }

            return huffman;
        }
        #endregion

        #region 選出葉子節(jié)點(diǎn)中最小的二個(gè)節(jié)點(diǎn)
        /// <summary>
/// 選出葉子節(jié)點(diǎn)中最小的二個(gè)節(jié)點(diǎn)
/// </summary>
/// <param name="huffman"></param>
/// <param name="searchNodes">要查找的結(jié)點(diǎn)數(shù)</param>
/// <param name="minIndex1"></param>
/// <param name="minIndex2"></param>
        public void SelectNode(HuffmanTree[] huffman, int searchNodes, out int minIndex1, out int minIndex2)
        {
            HuffmanTree minNode1 = null;

            HuffmanTree minNode2 = null;

            //最小節(jié)點(diǎn)在赫夫曼樹中的下標(biāo)
            minIndex1 = minIndex2 = 0;

            //查找范圍
            for (int i = 0; i < searchNodes; i++)
            {
                ///只有獨(dú)根樹才能進(jìn)入查找范圍
                if (huffman[i].parent == 0)
                {
                    //如果為null,則認(rèn)為當(dāng)前實(shí)體為最小
                    if (minNode1 == null)
                    {
                        minIndex1 = i;

                        minNode1 = huffman[i];

                        continue;
                    }

                    //如果為null,則認(rèn)為當(dāng)前實(shí)體為最小
                    if (minNode2 == null)
                    {
                        minIndex2 = i;

                        minNode2 = huffman[i];

                        //交換一個(gè)位置,保證minIndex1為最小,為后面判斷做準(zhǔn)備
                        if (minNode1.weight > minNode2.weight)
                        {
                            //節(jié)點(diǎn)交換
                            var temp = minNode1;
                            minNode1 = minNode2;
                            minNode2 = temp;

                            //下標(biāo)交換
                            var tempIndex = minIndex1;
                            minIndex1 = minIndex2;
                            minIndex2 = tempIndex;

                            continue;
                        }
                    }
                    if (minNode1 != null && minNode2 != null)
                    {
                        if (huffman[i].weight <= minNode1.weight)
                        {
                            //將min1臨時(shí)轉(zhuǎn)存給min2
                            minNode2 = minNode1;
                            minNode1 = huffman[i];

                            //記錄在數(shù)組中的下標(biāo)
                            minIndex2 = minIndex1;
                            minIndex1 = i;
                        }
                        else
                        {
                            if (huffman[i].weight < minNode2.weight)
                            {
                                minNode2 = huffman[i];

                                minIndex2 = i;
                            }
                        }
                    }
                }
            }
        }
        #endregion

3:對(duì)哈夫曼樹進(jìn)行編碼操作,形成一套“模板”,效果跟ASC模板一樣,不過一個(gè)是不等長(zhǎng),一個(gè)是等長(zhǎng)。

復(fù)制代碼 代碼如下:

#region 赫夫曼編碼
        /// <summary>
/// 赫夫曼編碼
/// </summary>
/// <param name="huffman"></param>
/// <param name="leafNum"></param>
/// <param name="huffmanCode"></param>
        public string[] HuffmanCoding(HuffmanTree[] huffman, int leafNum)
        {
            int current = 0;

            int parent = 0;

            string[] huffmanCode = new string[leafNum];

            //四個(gè)葉子節(jié)點(diǎn)的循環(huán)
            for (int i = 0; i < leafNum; i++)
            {
                //單個(gè)字符的編碼串
                string codeTemp = string.Empty;

                current = i;

                //第一次獲取最左節(jié)點(diǎn)
                parent = huffman[current].parent;

                while (parent != 0)
                {
                    //如果父節(jié)點(diǎn)的左子樹等于當(dāng)前節(jié)點(diǎn)就標(biāo)記為0
                    if (current == huffman[parent].left)
                        codeTemp += "0";
                    else
                        codeTemp += "1";

                    current = parent;
                    parent = huffman[parent].parent;
                }

                huffmanCode[i] = new string(codeTemp.Reverse().ToArray());
            }
            return huffmanCode;
        }
        #endregion

4:模板生成好了,我們就要對(duì)指定的測(cè)試數(shù)據(jù)進(jìn)行壓縮處理

復(fù)制代碼 代碼如下:

#region 對(duì)指定字符進(jìn)行壓縮
        /// <summary>
/// 對(duì)指定字符進(jìn)行壓縮
/// </summary>
/// <param name="huffmanCode"></param>
/// <param name="alphabet"></param>
/// <param name="test"></param>
        public string Encode(string[] huffmanCode, string[] alphabet, string test)
        {
            //返回的0,1代碼
            string encodeStr = string.Empty;

            //對(duì)每個(gè)字符進(jìn)行編碼
            for (int i = 0; i < test.Length; i++)
            {
                //在模版里面查找
                for (int j = 0; j < alphabet.Length; j++)
                {
                    if (test[i].ToString() == alphabet[j])
                    {
                        encodeStr += huffmanCode[j];
                    }
                }
            }

            return encodeStr;
        }
        #endregion

5: 最后也就是對(duì)壓縮的數(shù)據(jù)進(jìn)行還原操作。

復(fù)制代碼 代碼如下:

#region 對(duì)指定的二進(jìn)制進(jìn)行解壓
        /// <summary>
/// 對(duì)指定的二進(jìn)制進(jìn)行解壓
/// </summary>
/// <param name="huffman"></param>
/// <param name="leafNum"></param>
/// <param name="alphabet"></param>
/// <param name="test"></param>
/// <returns></returns>
        public string Decode(HuffmanTree[] huffman, int huffmanNodes, string[] alphabet, string test)
        {
            string decodeStr = string.Empty;

            //所有要解碼的字符
            for (int i = 0; i < test.Length; )
            {
                int j = 0;
                //赫夫曼樹結(jié)構(gòu)模板(用于循環(huán)的解碼單個(gè)字符)
                for (j = huffmanNodes - 1; (huffman[j].left != 0 || huffman[j].right != 0); )
                {
                    if (test[i].ToString() == "0")
                    {
                        j = huffman[j].left;
                    }
                    if (test[i].ToString() == "1")
                    {
                        j = huffman[j].right;
                    }
                    i++;
                }
                decodeStr += alphabet[j];
            }
            return decodeStr;
        }

        #endregion

最后上一下總的運(yùn)行代碼

復(fù)制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HuffmanTree
{
    class Program
    {
        static void Main(string[] args)
        {
            //有四個(gè)葉節(jié)點(diǎn)
            int leafNum = 4;

            //赫夫曼樹中的節(jié)點(diǎn)總數(shù)
            int huffmanNodes = 2 * leafNum - 1;

            //各節(jié)點(diǎn)的權(quán)值
            int[] weight = { 5, 7, 2, 13 };

            string[] alphabet = { "A", "B", "C", "D" };

            string testCode = "DBDBDABDCDADBDADBDADACDBDBD";

            //赫夫曼樹用數(shù)組來(lái)保存,每個(gè)赫夫曼都作為一個(gè)實(shí)體存在
            HuffmanTree[] huffman = new HuffmanTree[huffmanNodes].Select(i => new HuffmanTree() { }).ToArray();

            HuffmanTreeManager manager = new HuffmanTreeManager();

            manager.CreateTree(huffman, leafNum, weight);

            string[] huffmanCode = manager.HuffmanCoding(huffman, leafNum);

            for (int i = 0; i < leafNum; i++)
            {
                Console.WriteLine("字符:{0},權(quán)重:{1},編碼為:{2}", alphabet[i], huffman[i].weight, huffmanCode[i]);
            }

            Console.WriteLine("原始的字符串為:" + testCode);

            string encode = manager.Encode(huffmanCode, alphabet, testCode);

            Console.WriteLine("被編碼的字符串為:" + encode);

            string decode = manager.Decode(huffman, huffmanNodes, alphabet, encode);

            Console.WriteLine("解碼后的字符串為:" + decode);
        }
    }

    #region 赫夫曼樹結(jié)構(gòu)
    /// <summary>
/// 赫夫曼樹結(jié)構(gòu)
/// </summary>
    public class HuffmanTree
    {
        public int weight { get; set; }

        public int parent { get; set; }

        public int left { get; set; }

        public int right { get; set; }
    }
    #endregion

    /// <summary>
/// 赫夫曼樹的操作類
/// </summary>
    public class HuffmanTreeManager
    {
        #region 赫夫曼樹的創(chuàng)建
        /// <summary>
/// 赫夫曼樹的創(chuàng)建
/// </summary>
/// <param name="huffman">赫夫曼樹</param>
/// <param name="leafNum">葉子節(jié)點(diǎn)</param>
/// <param name="weight">節(jié)點(diǎn)權(quán)重</param>
        public HuffmanTree[] CreateTree(HuffmanTree[] huffman, int leafNum, int[] weight)
        {
            //赫夫曼樹的節(jié)點(diǎn)總數(shù)
            int huffmanNode = 2 * leafNum - 1;

            //初始化節(jié)點(diǎn),賦予葉子節(jié)點(diǎn)值
            for (int i = 0; i < huffmanNode; i++)
            {
                if (i < leafNum)
                {
                    huffman[i].weight = weight[i];
                }
            }

            //這里面也要注意,4個(gè)節(jié)點(diǎn),其實(shí)只要3步就可以構(gòu)造赫夫曼樹
            for (int i = leafNum; i < huffmanNode; i++)
            {
                int minIndex1;
                int minIndex2;
                SelectNode(huffman, i, out minIndex1, out minIndex2);

                //最后得出minIndex1和minindex2中實(shí)體的weight最小
                huffman[minIndex1].parent = i;
                huffman[minIndex2].parent = i;

                huffman[i].left = minIndex1;
                huffman[i].right = minIndex2;

                huffman[i].weight = huffman[minIndex1].weight + huffman[minIndex2].weight;
            }

            return huffman;
        }
        #endregion

        #region 選出葉子節(jié)點(diǎn)中最小的二個(gè)節(jié)點(diǎn)
        /// <summary>
/// 選出葉子節(jié)點(diǎn)中最小的二個(gè)節(jié)點(diǎn)
/// </summary>
/// <param name="huffman"></param>
/// <param name="searchNodes">要查找的結(jié)點(diǎn)數(shù)</param>
/// <param name="minIndex1"></param>
/// <param name="minIndex2"></param>
        public void SelectNode(HuffmanTree[] huffman, int searchNodes, out int minIndex1, out int minIndex2)
        {
            HuffmanTree minNode1 = null;

            HuffmanTree minNode2 = null;

            //最小節(jié)點(diǎn)在赫夫曼樹中的下標(biāo)
            minIndex1 = minIndex2 = 0;

            //查找范圍
            for (int i = 0; i < searchNodes; i++)
            {
                ///只有獨(dú)根樹才能進(jìn)入查找范圍
                if (huffman[i].parent == 0)
                {
                    //如果為null,則認(rèn)為當(dāng)前實(shí)體為最小
                    if (minNode1 == null)
                    {
                        minIndex1 = i;

                        minNode1 = huffman[i];

                        continue;
                    }

                    //如果為null,則認(rèn)為當(dāng)前實(shí)體為最小
                    if (minNode2 == null)
                    {
                        minIndex2 = i;

                        minNode2 = huffman[i];

                        //交換一個(gè)位置,保證minIndex1為最小,為后面判斷做準(zhǔn)備
                        if (minNode1.weight > minNode2.weight)
                        {
                            //節(jié)點(diǎn)交換
                            var temp = minNode1;
                            minNode1 = minNode2;
                            minNode2 = temp;

                            //下標(biāo)交換
                            var tempIndex = minIndex1;
                            minIndex1 = minIndex2;
                            minIndex2 = tempIndex;

                            continue;
                        }
                    }
                    if (minNode1 != null && minNode2 != null)
                    {
                        if (huffman[i].weight <= minNode1.weight)
                        {
                            //將min1臨時(shí)轉(zhuǎn)存給min2
                            minNode2 = minNode1;
                            minNode1 = huffman[i];

                            //記錄在數(shù)組中的下標(biāo)
                            minIndex2 = minIndex1;
                            minIndex1 = i;
                        }
                        else
                        {
                            if (huffman[i].weight < minNode2.weight)
                            {
                                minNode2 = huffman[i];

                                minIndex2 = i;
                            }
                        }
                    }
                }
            }
        }
        #endregion

        #region 赫夫曼編碼
        /// <summary>
/// 赫夫曼編碼
/// </summary>
/// <param name="huffman"></param>
/// <param name="leafNum"></param>
/// <param name="huffmanCode"></param>
        public string[] HuffmanCoding(HuffmanTree[] huffman, int leafNum)
        {
            int current = 0;

            int parent = 0;

            string[] huffmanCode = new string[leafNum];

            //四個(gè)葉子節(jié)點(diǎn)的循環(huán)
            for (int i = 0; i < leafNum; i++)
            {
                //單個(gè)字符的編碼串
                string codeTemp = string.Empty;

                current = i;

                //第一次獲取最左節(jié)點(diǎn)
                parent = huffman[current].parent;

                while (parent != 0)
                {
                    //如果父節(jié)點(diǎn)的左子樹等于當(dāng)前節(jié)點(diǎn)就標(biāo)記為0
                    if (current == huffman[parent].left)
                        codeTemp += "0";
                    else
                        codeTemp += "1";

                    current = parent;
                    parent = huffman[parent].parent;
                }

                huffmanCode[i] = new string(codeTemp.Reverse().ToArray());
            }
            return huffmanCode;
        }
        #endregion

        #region 對(duì)指定字符進(jìn)行壓縮
        /// <summary>
/// 對(duì)指定字符進(jìn)行壓縮
/// </summary>
/// <param name="huffmanCode"></param>
/// <param name="alphabet"></param>
/// <param name="test"></param>
        public string Encode(string[] huffmanCode, string[] alphabet, string test)
        {
            //返回的0,1代碼
            string encodeStr = string.Empty;

            //對(duì)每個(gè)字符進(jìn)行編碼
            for (int i = 0; i < test.Length; i++)
            {
                //在模版里面查找
                for (int j = 0; j < alphabet.Length; j++)
                {
                    if (test[i].ToString() == alphabet[j])
                    {
                        encodeStr += huffmanCode[j];
                    }
                }
            }

            return encodeStr;
        }
        #endregion

        #region 對(duì)指定的二進(jìn)制進(jìn)行解壓
        /// <summary>
/// 對(duì)指定的二進(jìn)制進(jìn)行解壓
/// </summary>
/// <param name="huffman"></param>
/// <param name="leafNum"></param>
/// <param name="alphabet"></param>
/// <param name="test"></param>
/// <returns></returns>
        public string Decode(HuffmanTree[] huffman, int huffmanNodes, string[] alphabet, string test)
        {
            string decodeStr = string.Empty;

            //所有要解碼的字符
            for (int i = 0; i < test.Length; )
            {
                int j = 0;
                //赫夫曼樹結(jié)構(gòu)模板(用于循環(huán)的解碼單個(gè)字符)
                for (j = huffmanNodes - 1; (huffman[j].left != 0 || huffman[j].right != 0); )
                {
                    if (test[i].ToString() == "0")
                    {
                        j = huffman[j].left;
                    }
                    if (test[i].ToString() == "1")
                    {
                        j = huffman[j].right;
                    }
                    i++;
                }
                decodeStr += alphabet[j];
            }
            return decodeStr;
        }

        #endregion
    }
}

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
中文字幕在线导航| 亚洲第一视频网站| 在线一区二区不卡| 亚洲中文字幕在线一区| 蜜桃精品在线| 欧美va亚洲va日韩∨a综合色| 免费国产成人看片在线| 国产日韩第一页v| 亚洲一卡二卡在线观看| 欧美91精品| 欧美日韩国产在线| 国产午夜精品一区二区三区视频| 日韩三级视频在线看| 亚洲欧洲日产国码av系列天堂| 色综合久久六月婷婷中文字幕| 国产一区久久久| 欧美久久一二三四区| 91精品久久久久久久久久| 丰满少妇一区二区| 久久麻豆视频| 国产福利久久| 国产一级视频| 国产嫩草影院久久久久| 国产不卡在线观看视频| 日韩高清不卡一区二区| 日韩中文字幕在线播放| 在线免费播放av| 日韩视频一区| 尤物av一区二区| 国产黄色一级片| 亚洲第一网中文字幕| 欧美一卡2卡三卡4卡5免费| 在线免费播放av| 日韩精品视频免费在线观看| 99这里有精品视频| 日韩欧美在线第一页| 亚洲一二三不卡| 欧美日韩精品综合在线| 九九精品调教| 在线观看国产一级片| 日韩欧美在线视频| 欧美日韩国产免费观看视频| 91精品综合久久| 国产综合成人久久大片91| 中文精品在线观看| 亚洲综合日韩中文字幕v在线| 日韩精品第一区| 一区二区不卡视频在线观看| 日韩视频中文字幕| 中文字幕99| 欧美日韩视频免费播放| 精品国产1区二区| 丰满少妇一区| 日韩精品福利一区二区三区| 精品全国在线一区二区| 国产欧美日韩第一页| 国产高清一级片| 日韩欧美中文字幕视频| 欧美国产日韩在线播放| 欧美久久久精品| 中文字幕第一页在线播放| 欧美日韩免费精品| 极品久久久久久| 亚洲国产午夜精品| 久久久久蜜桃| 国产aa精品| 在线综合 亚洲 欧美中文字幕| 日韩不卡一区二区| 精品1区2区3区| 欧美日韩在线不卡| 久久精品一级爱片| 91麻豆免费视频网站| 一区二区三区在线|网站| 久久久久蜜桃| 日韩欧美高清在线视频| 日韩精品在线中文字幕| 人成在线免费视频| 日本va欧美va精品发布| 国产999在线观看| 日韩国产亚洲欧美| 中文字幕在线高清| 欧美三级日韩三级| a天堂中文在线官网在线| 91精品日本| 欧洲精品在线一区| 中文字幕高清在线播放| 一本一道综合狠狠老| 欧美久久久精品| 蜜桃精品视频| 中文字幕久久av| 亚洲成av人片在线| wwwav91com| 不卡视频一区二区| 精品日韩在线观看| 国产一二三区精品视频| 亚洲一区在线视频观看| 亚亚洲欧洲精品| 国产成人精品亚洲| 一区二区欧美国产| 免费视频久久| 精品一二三区视频| 欧美在线视频第一页| 精品福利二区三区| 视频一区中文字幕国产| 日韩精品视频免费看| 国产成人精品免费在线| 国产一区成人| 一区二区三区在线|网站| 日本精品二区| 日韩在线视频免费观看高清中文| 国产一区不卡在线| 国产欧美一级| 免费看日韩精品| 国产三级在线播放| 黄污视频在线看| 日韩在线观看视频一区| 午夜伦欧美伦电影理论片| 亚洲黄色www| 精品在线网站观看| 日韩视频不卡中文| 精品一区二区三区中文字幕| 久久麻豆视频| 中文字幕不卡三区| 欧美日韩激情一区二区三区| 亚洲成人7777| 中文 欧美 日韩| av丝袜在线| 欧美国产三级| 欧美日韩人人澡狠狠躁视频| 日韩欧美99| 精品一二三四| 国产欧美综合在线| 日韩视频在线一区| 国产网站av| 亚洲女人天堂色在线7777| 日本黄色一区二区| 一区二区高清在线| 中文字幕在线欧美| 中文字幕欧美日韩在线不卡| 精品国内自产拍在线视频| 香蕉av一区| 欧美亚洲免费高清在线观看| 亚洲制服丝袜一区| 国产婷婷在线观看| 日韩久久久精品| 一区二区高清视频| 一区免费视频| 在线精品视频免费播放| 精品网站999| 亚洲福利视频专区| 欧美日韩性视频| 91精品国产色综合久久不卡蜜臀| 精品婷婷伊人一区三区三| 国产欧亚日韩视频| 欧美99久久| 久久精品日韩无码| 亚洲素人一区二区| 日韩三区免费| 日韩三级一区二区| 91精品国产综合久久蜜臀| www.老鸭窝.com| 国产小视频在线观看免费| 精品中文字幕视频| 亚洲大片精品永久免费| 香蕉视频亚洲一级| 国产在线二区| 欧美在线亚洲一区| 久久精品国产91精品亚洲| 91色在线看| 国产福利免费在线观看| 国产三级精品网站| 日韩欧美看国产| 九九在线精品| 欧美日韩一级黄| 影音先锋中文字幕在线观看| 国产在线播放一区二区| 色99中文字幕| 久久99久久99精品中文字幕| 欧美日韩精品在线视频| 日韩中文字幕在线视频观看| 欧美日韩成人一区二区| 91精品国产综合久久香蕉的特点| 欧美激情视频一区二区三区在线播放| 日本xxxwww免费视频| 亚洲第一视频| 日韩三级精品| 日韩免费精品| 精品久久电影| 一二三区精品视频| 久久精品久久精品亚洲人| 91精品国产91久久久久青草| 国产欧美日韩91| 黄色国产网站在线观看| 精品日韩视频| 国产成人日日夜夜| 日本精品二区| 欧美激情视频一区二区三区在线播放| 香蕉av一区| 久久精品在线观看| 中文在线第一页| 91精品高清| 欧美日韩精品免费看| 欧美xxxx中国| 欧美久久在线| 日韩视频在线一区二区三区| 色屁屁一区二区| eeuss一区| 一区精品在线播放| 国产区在线看| 日韩欧美在线不卡| 99精品999| 久久久精品国产免费观看同学| 欧美日韩精品是欧美日韩精品| 日韩欧美亚洲国产| 久久欧美中文字幕| 国产一区成人| 99综合视频| 亚洲福利精品| 中文字幕在线看视频国产欧美| 免费在线国产| 国产欧美日韩精品综合| 国产成人精品三级| 樱花草www在线| 亚洲一区精品在线| 99精品电影| 国产91久久久久蜜臀青青天草二 | 欧美国产综合视频| 亚洲国产一区自拍| 91精品免费在线观看| 中文在线视频观看| 中文字幕第一页在线播放| 色猫猫国产区一区二在线视频| 伊人网站在线| 久久精品日韩无码| 国产欧美日韩中文字幕| 日韩三级免费观看| 久久精品国产成人一区二区三区| av中文资源在线| 欧美日韩国产黄色| 第一页在线观看| 男人的天堂网av| www.老鸭窝.com| 国产99精品| 国产一级在线播放| av免费观看网站| 国产免费一级片| 久久人人精品| 日韩欧美在线字幕| 久久久精品免费免费| 欧美日韩综合在线免费观看| 亚洲一区视频在线观看视频| 日韩欧美国产免费播放| 日韩中文字幕亚洲| 黄色在线资源| 国内不卡的二区三区中文字幕| 欧美日韩精品三区| 国产免费一级| 国产一区 二区 三区一级| 欧美一级欧美三级在线观看| 精品免费久久久| 精品日韩欧美在线| 国产视频aaa| 国内精品99| 91精品国产综合久久香蕉最新版| 中文字幕在线播出| 国产91久久久久| 精品日韩视频| 日韩久久精品网| 在线观看一区日韩| 欧美久久久精品| 日韩欧美中文第一页| 91精品国产高清91久久久久久| 中文不卡在线| 国产字幕在线看| 日韩中文字幕在线视频播放| 日韩欧美在线中字| 日本中文字幕在线观看| 在线视频不卡一区二区| 日韩一级在线免费观看| 国产丝袜一区二区| 不卡视频一区二区三区| 日韩欧美色综合网站| 久久精品国产2020观看福利| 欧美日韩亚洲不卡| 蜜桃精品视频| 国产免费一级片| 日韩精品久久久| 91精品在线观看入口| 精品一区二区三区中文字幕 | 中文字幕久精品免费视频| 欧美一级免费在线观看| 欧美日韩免费高清| 免费国产h视频在线观看86| 亚洲福利一区二区三区| 国产成人精品综合网站| 不卡在线视频| 欧美三级中文字幕| 精品中文字幕在线| 亚洲日本欧美日韩高观看| 日韩视频在线一区二区| 不卡在线视频| 欧美日韩亚洲综合在线| 亚洲 欧美 中文字幕| 日韩欧美一级精品久久| 国产日韩精品在线看| 国产日韩在线亚洲字幕中文| 91日韩中文字幕| 在线视频1区2区| 中文字幕亚洲高清| 国产小视频在线| 国产激情在线播放| 国产乱国产乱300精品| 成人a在线观看| 亚洲狠狠婷婷综合久久久久图片| 国产一卡2卡3卡免费网站| 欧美xxxx中国| 国产乱一区二区| 亚洲中文字幕在线一区| 国产在线www| 国产婷婷色一区二区三区在线| 亚洲一区视频在线观看视频| av免费观看国产| 免费视频中文字幕| 精品乱人伦一区二区三区| 欧美日韩成人综合| 最近中文字幕在线中文视频| 一级特黄大欧美久久久| 国产wwww| 午夜一区二区三区| 精品久久久久久无| 中文字幕在线导航| 色99中文字幕| 精品一区二区三区中文字幕在线| 91精品蜜臀在线一区尤物| 国产在线一在线二| 日韩在线视频中文字幕| 日韩欧美色综合| 中文字幕第一页在线| 亚洲欧洲在线观看av| 欧美亚洲国产激情| 日韩欧美亚洲视频| 欧美日韩在线观看一区| 国产乱国产乱300精品| 99国内精品| 不卡一二三区| 最近中文字幕第一页| 91精品在线看V| 一区二区三区在线播| 精品久久久久久综合日本欧美| 国产黄色在线| 欧洲精品二区| 伊人中文字幕在线观看| 欧美三级在线播放| 日韩欧中文字幕| 久久久精品免费免费| 日韩中文欧美在线| 日韩一级网站| 午夜亚洲福利| 精品国产1区2区3区| 国产婷婷精品| 国产日韩成人精品| 日韩中文字幕网| 国产香蕉精品视频| 97国产视频| 日韩欧美中文字幕精品| 亚洲va中文字幕| 日韩精品视频在线观看视频| 天堂在线一区二区三区| 日韩欧美国产片| 精品视频三区| 中文字幕精品在线| 欧美另类久久久品| 蜜桃视频中文字幕| 中文欧美日韩| 欧美日韩国产一级片| 亚洲成a人片在线www| 日韩精品视频在线播放| 国产高清不卡av| 日韩免费视频一区二区视频在线观看| 欧美三级一区二区三区| 久久蜜桃精品| 欧美日韩高清在线| 天堂在线中文| 欧美日韩国产在线| 影音先锋一区二区资源站| 中文字幕日韩在线观看| 国产乱码在线观看| 欧美日韩视频不卡| 免费在线国产| 欧美日韩一级视频| 中文字幕 亚洲视频| 亚洲国产91精品在线观看| 亚洲高清视频一区| 亚洲一级在线| 国产福利不卡| 日本精品免费观看高清观看| 蜜桃视频中文字幕| 中文字幕在线欧美| 国产在线精品日韩| 在线观看国产一区|