日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《漫画算法-小灰的算法之旅》第1章-算法概述读书笔记

發(fā)布時(shí)間:2023/12/31 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《漫画算法-小灰的算法之旅》第1章-算法概述读书笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 1. 前言
  • 2. 正文
    • 2.1 算法和數(shù)據(jù)結(jié)構(gòu)
      • 2.1.1 什么是算法?
      • 2.1.2 衡量算法好壞最重要的標(biāo)準(zhǔn)有哪兩個(gè)?
      • 2.1.3 什么是數(shù)據(jù)結(jié)構(gòu)?
      • 2.1.4 算法和數(shù)據(jù)結(jié)構(gòu)有什么關(guān)系呢?
      • 2.1.5 數(shù)據(jù)結(jié)構(gòu)有哪些組成方式?
    • 2.2 時(shí)間復(fù)雜度
      • 2.2.1 如何評(píng)估算法時(shí)間上的優(yōu)劣?
      • 2.2.2 什么是基本操作或者說常數(shù)操作?
      • 2.2.3 如何計(jì)算程序的基本操作次數(shù)?
      • 2.2.4 什么是時(shí)間復(fù)雜度?
      • 2.2.5 推導(dǎo)出時(shí)間復(fù)雜度的原則有哪些?
    • 2.3 空間復(fù)雜度
      • 2.3.1 什么是空間復(fù)雜度?
      • 2.3.2 如何計(jì)算空間復(fù)雜度?
      • 2.3.5 如何在時(shí)間復(fù)雜度和空間復(fù)雜度之間取舍?
  • 3. 最后
  • 參考

1. 前言

說實(shí)話,對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法,是存在畏懼心理的。但是,一點(diǎn)一點(diǎn)地學(xué),總會(huì)能克服掉這種心理吧。

2. 正文

2.1 算法和數(shù)據(jù)結(jié)構(gòu)

2.1.1 什么是算法?

算法,對(duì)應(yīng)的英文單詞是 algorithm,最早來自數(shù)學(xué)領(lǐng)域。

在數(shù)學(xué)領(lǐng)域,算法是用于解決某一類問題的公式和思想。如等差數(shù)列的公式:

在計(jì)算機(jī)科學(xué)領(lǐng)域,算法的本質(zhì)是一系列程序指令,用于解決特定的運(yùn)算和邏輯問題。如給出一系列整數(shù),找出最大的整數(shù),或者給出一系列整數(shù),按從小到大排序。

2.1.2 衡量算法好壞最重要的標(biāo)準(zhǔn)有哪兩個(gè)?

時(shí)間復(fù)雜度和空間復(fù)雜度。

考量一個(gè)算法好壞主要從算法所占用的時(shí)間和空間兩個(gè)維度去考量。

  • 時(shí)間維度:是指執(zhí)行當(dāng)前算法所消耗的時(shí)間,通常用時(shí)間復(fù)雜度來描述;
  • 空間維度:是指執(zhí)行當(dāng)前算法需要占用多少內(nèi)存空間,通常用空間復(fù)雜度來描述。

2.1.3 什么是數(shù)據(jù)結(jié)構(gòu)?

數(shù)據(jù)結(jié)構(gòu),對(duì)應(yīng)的英文單詞是 data structure,是數(shù)據(jù)的組織、管理和存儲(chǔ)格式,使用數(shù)據(jù)結(jié)構(gòu)的目的是為了更加高效地訪問和修改數(shù)據(jù)。

2.1.4 算法和數(shù)據(jù)結(jié)構(gòu)有什么關(guān)系呢?

數(shù)據(jù)結(jié)構(gòu)是算法的基石。如果把算法比作美麗靈動(dòng)的舞者,那么數(shù)據(jù)結(jié)構(gòu)就是舞者腳下廣闊而堅(jiān)實(shí)的舞臺(tái)。
數(shù)據(jù)結(jié)構(gòu)和算法是互不分開的。離開了算法,數(shù)據(jù)結(jié)構(gòu)就顯得毫無意義;而沒有了數(shù)據(jù)結(jié)構(gòu),算法就沒有實(shí)現(xiàn)的條件了。在解決問題時(shí),不同的算法會(huì)選用不同的數(shù)據(jù)結(jié)構(gòu)。

2.1.5 數(shù)據(jù)結(jié)構(gòu)有哪些組成方式?

  • 線性結(jié)構(gòu):最簡(jiǎn)單的基本數(shù)據(jù)結(jié)構(gòu),包括數(shù)組、鏈表,以及由它們衍生出來的棧、隊(duì)列、哈希表;
  • :相對(duì)復(fù)雜的基本數(shù)據(jù)結(jié)構(gòu),包括二叉樹,以及由它衍生出來的二叉堆等;
  • :更為復(fù)雜的基本數(shù)據(jù)結(jié)構(gòu);
  • 其他數(shù)據(jù)結(jié)構(gòu):由基本數(shù)據(jù)結(jié)構(gòu)變形而來,用于解決某些特定問題,如跳表、哈希鏈表、位圖等。

2.2 時(shí)間復(fù)雜度

2.2.1 如何評(píng)估算法時(shí)間上的優(yōu)劣?

通過統(tǒng)計(jì)代碼的絕對(duì)執(zhí)行時(shí)間:代碼的絕對(duì)執(zhí)行時(shí)間只有在實(shí)際運(yùn)行后才能得到,但是絕對(duì)執(zhí)行時(shí)間會(huì)受到運(yùn)行環(huán)境(機(jī)器性能的高低)和輸入規(guī)模(數(shù)據(jù)規(guī)模的大小)的影響,所以通過比較代碼的絕對(duì)執(zhí)行時(shí)間來確定算法的時(shí)間復(fù)雜度有很大的局限性。

通過預(yù)估代碼的基本操作次數(shù):這需要對(duì)一個(gè)算法流程非常熟悉,然后寫出這個(gè)算法流程中,發(fā)生了多少次基本執(zhí)行操作,進(jìn)而總結(jié)出基本操作次數(shù)的表達(dá)式。基本操作次數(shù)的表達(dá)式會(huì)轉(zhuǎn)化為時(shí)間復(fù)雜度指標(biāo)來表示。

如果時(shí)間復(fù)雜度指標(biāo)無法區(qū)分算法好壞,就需要通過實(shí)際運(yùn)行代碼的方式來比較算法好壞了。

2.2.2 什么是基本操作或者說常數(shù)操作?

如果一個(gè)操作花費(fèi)的時(shí)間是固定的并且和樣本的數(shù)據(jù)量沒有關(guān)系,就把這樣的操作稱為基本操作,或常數(shù)操作。

常見的基本操作有:

  • 從數(shù)組里面取出一個(gè)元素;
  • 加減乘除運(yùn)算;
  • 位運(yùn)算。

常見的非基本操作有:

  • 從鏈表上面取出一個(gè)元素(跟鏈表長(zhǎng)度有關(guān));
  • 在數(shù)組上查找最小值(跟數(shù)組長(zhǎng)度有關(guān))。

2.2.3 如何計(jì)算程序的基本操作次數(shù)?

這里分場(chǎng)景來舉例說明。

場(chǎng)景1:

從鏈表中取出第 i 個(gè)元素,每次查找下一個(gè)節(jié)點(diǎn)耗時(shí)為 1 時(shí)間單位:

public static void case1() {LinkedList<Integer> list = new LinkedList<>();for (int i = 0; i < 2000; i++) {list.add(i);}// 取出第 1 個(gè)元素Integer a = list.get(0);// 取出第 999 個(gè)元素Integer c = list.get(999); }

則基本操作次數(shù)表達(dá)式 T(n) = n,因?yàn)榈?n 個(gè)元素需要從鏈表頭查找 n 次才可以獲取到。

場(chǎng)景2:
給定一個(gè)整數(shù) n,求初始值為 1 的整數(shù)乘以多少次 2 才可以達(dá)到 n:

public static void case2() {int i = 1;int n = 16;while (i < n) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}i = i * 2;}System.out.println("i = " + i); }

這里我們把循環(huán)內(nèi)的休眠時(shí)間和 i = i * 2 作為一個(gè)大的常數(shù)操作,而忽略掉 i < n 這個(gè)常數(shù)操作時(shí)間。
可以知道,
如果 n = 2,則 T = 1;
如果 n = 4,則 T = 2;
如果 n = 16,則 T = 4;
總結(jié)一下,T(n) = log2^n;

場(chǎng)景3:
從數(shù)組中取出第 i 個(gè)元素,每次挪動(dòng)指針耗時(shí)為 1 時(shí)間單位:

public static void case3() {int[] arr = new int[2000];for (int i = 0; i < 2000; i++) {arr[i] = i;}// 實(shí)際上第一次挪動(dòng)比較耗時(shí)int a = arr[0];// 以后的獲取耗時(shí)相當(dāng)int b = arr[1];int c = arr[1999];}

T(n) = 1 時(shí)間單位。

場(chǎng)景4:
打印 n 行 n 列的星號(hào):

public static void case4() {int n = 6;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {System.out.print("*");}System.out.println();} }

打印第 1 行,需要 1 次 int i = 1; 賦值操作;1 次 i <= n 比較;n 次 j <= n 比較;n 次 j++ 操作;n 次 System.out.print("*");,1 次System.out.println(); 換行操作 ,總共需要 3n + 3 次常數(shù)操作;
打印第 2 行,需要 1 次 i++ 操作;1 次 i <= n 比較; n 次 j <= n 比較;n 次 j++ 操作;n 次 System.out.print("*");,1 次System.out.println(); 換行操作 ,總共需要 3n + 3 次常數(shù)操作;

打印第 n 行,需要 1 次 i++ 操作;1 次 i <= n 比較; n 次 j <= n 比較;n 次 j++ 操作;n 次 System.out.print("*");,1 次System.out.println(); 換行操作 ,總共需要 3n + 3 次常數(shù)操作。
最后還需要 1 次 i <= n 比較;結(jié)束循環(huán)。

所以,總共需要的常數(shù)操作次數(shù) T(n) = (3n + 3) * n + 1 = 3n^2 + 3n + 1。

2.2.4 什么是時(shí)間復(fù)雜度?

若存在函數(shù) f(n),使得當(dāng) n 趨于無窮大時(shí),T(n) / f(n) 的極限值為不等于零的常數(shù),則稱 f(n) 是 T(n) 的同數(shù)量級(jí)函數(shù)。記作 T(n) = O(f(n)),稱為O(f(n)),O為算法的漸進(jìn)時(shí)間復(fù)雜度,簡(jiǎn)稱為時(shí)間復(fù)雜度。

因?yàn)闈u進(jìn)時(shí)間復(fù)雜度用大寫O來表示,所以也被稱為大O表示法。大O用來表示上界,表示了算法的最壞情況運(yùn)行時(shí)間。

2.2.5 推導(dǎo)出時(shí)間復(fù)雜度的原則有哪些?

  • 如果運(yùn)行時(shí)間是常數(shù)量級(jí),則用常數(shù) 1 表示;
  • 只保留時(shí)間函數(shù)中的最高階項(xiàng);
  • 如果最高階項(xiàng)存在,則省去最高階項(xiàng)前面的系數(shù)。

場(chǎng)景1:T(n) = n。
不是常數(shù)量級(jí),最高階項(xiàng)是 n,則轉(zhuǎn)化的時(shí)間復(fù)雜度為:T(n)=O(n);

場(chǎng)景2:T(n) = log2^n。
不是常數(shù)量級(jí),最高階項(xiàng)是 log2^n,省略常數(shù) 2,則轉(zhuǎn)化的時(shí)間復(fù)雜度為:T(n)=O(logn);

場(chǎng)景3:T(n) = 1。
是常數(shù)量級(jí),則轉(zhuǎn)化的時(shí)間復(fù)雜度為:T(n)=O(1);

場(chǎng)景4:T(n) = 3n^2 + 3n + 1。
不是常數(shù)量級(jí),最高階項(xiàng)是 3n^2,去除系數(shù) 3,則轉(zhuǎn)化的時(shí)間復(fù)雜度為:T(n)=O(n ^ 2);

2.3 空間復(fù)雜度

2.3.1 什么是空間復(fù)雜度?

空間復(fù)雜度是對(duì)一個(gè)算法在運(yùn)行過程中臨時(shí)占用存儲(chǔ)空間大小的量度,同樣使用大O(讀作歐,不是零)表示法。

程序占用空間大小的計(jì)算公式記作 S(n) = O(f(n)),其中 n 為問題的規(guī)模,f(n) 為算法所占存儲(chǔ)空間的函數(shù)。

2.3.2 如何計(jì)算空間復(fù)雜度?

這里需要分情況來說明。

場(chǎng)景1:常量空間

當(dāng)算法分配的存儲(chǔ)空間大小是固定的,和輸入規(guī)模沒有直接的關(guān)系時(shí),空間復(fù)雜度記作 O(1)。如:

public static void case1(int n) {// 給變量 i 分配的存儲(chǔ)空間大小是固定的,跟輸入規(guī)模 n 沒有直接的關(guān)系。int i = 0;for (; i < n; i++) {// 遍歷元素。} }

場(chǎng)景2:線性空間

當(dāng)算法分配的存儲(chǔ)空間是一個(gè)線性的集合(如數(shù)組或鏈表),并且集合大小和輸入規(guī)模 n 成正比時(shí),空間復(fù)雜度記作 O(n)。如:

public static void case2(int n) {int[] arr = new int[n]; }

場(chǎng)景3:二維空間

當(dāng)算法分配的存儲(chǔ)空間是一個(gè)二維數(shù)組集合,并且二維數(shù)組的行和列都與輸入規(guī)模 n 成正比時(shí),空間復(fù)雜度記作 O(n^2)。如:

public static void case3(int n) {int[][] arr = new int[n][n]; }

場(chǎng)景4:遞歸空間

計(jì)算機(jī)在執(zhí)行程序時(shí),會(huì)專門分配一塊內(nèi)存,用來存儲(chǔ)方法調(diào)用棧(棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),或者說后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu))。

方法調(diào)用棧包括進(jìn)棧和出棧兩種操作。

  • 進(jìn)棧:當(dāng)進(jìn)入一個(gè)方法時(shí),執(zhí)行進(jìn)棧操作,把調(diào)用的方法和參數(shù)信息(棧幀)壓入棧中。
  • 出棧:當(dāng)一個(gè)方法返回時(shí),執(zhí)行出棧操作,把調(diào)用的方法和參數(shù)信息(棧幀)從棧中彈出。
/*** 斐波那契數(shù)列指的是這樣一個(gè)數(shù)列:0,1,1,2,3,5,8,13,21,34,55,89...*/ public static int fibonacci(int n) {if (n <= 1) {return n;}return fibonacci(n - 2) + fibonacci(n - 1); }

當(dāng) n = 1 時(shí),會(huì)有 fibonacci 方法和 n = 1 入棧:在方法內(nèi)部,滿足 n <= 1,所以直接返回,有 1 個(gè)棧幀;
當(dāng) n = 2 時(shí),會(huì)有 fibonacci 方法和 n = 2 入棧:在方法內(nèi)部,fibonacci 方法和 n = 0 入棧,fibonacci 方法和 n = 1 入棧,總共會(huì)有 3 個(gè)棧幀;
當(dāng) n = 3 時(shí),會(huì)有 fibonacci 方法和 n = 3 入棧:在方法內(nèi)部,fibonacci 方法和 n = 1 入棧,fibonacci 方法和 n = 2 入棧,總共會(huì)有 5 個(gè)棧幀;
當(dāng) n = 4 時(shí),會(huì)有 fibonacci 方法和 n = 4 入棧:在方法內(nèi)部,fibonacci 方法和 n = 2 入棧,fibonacci 方法和 n = 3 入棧,總共會(huì)有 9 個(gè)棧幀;
當(dāng) n = 5 時(shí),會(huì)有 fibonacci 方法和 n = 5 入棧:在方法內(nèi)部,fibonacci 方法和 n = 3 入棧,fibonacci 方法和 n = 4 入棧,總共會(huì)有 15 個(gè)棧幀。
當(dāng) n = 6 時(shí),會(huì)有 fibonacci 方法和 n = 6 入棧:在方法內(nèi)部,fibonacci 方法和 n = 4 入棧,fibonacci 方法和 n = 5 入棧,總共會(huì)有 25 個(gè)棧幀。

S(n) ≈ (n - 1) ^ 2 = O(n^2);

再舉一個(gè)遞歸的例子:求和

public static int sum(int n) {if (n <= 1) {return 1;}return n + sum(n - 1); }

當(dāng) n = 1 時(shí),有 sum 方法和 n = 1 入棧,方法內(nèi)部:滿足 n <= 1,直接返回。總共有 1 個(gè)棧幀;
當(dāng) n = 2 時(shí),有 sum 方法和 n = 2 入棧,方法內(nèi)部:有 sum 方法和 n = 1 入棧。總共有 2 個(gè)棧幀;
當(dāng) n = 3 時(shí),有 sum 方法和 n = 3 入棧,方法內(nèi)部:有 sum 方法和 n = 2 入棧。總共有 3 個(gè)棧幀;

所以,S(n) = n = O(n);

2.3.5 如何在時(shí)間復(fù)雜度和空間復(fù)雜度之間取舍?

在絕大多數(shù)時(shí)候,時(shí)間復(fù)雜度更重要一些,也就是說,哪怕要多分配一些內(nèi)存空間,也要提升程序的執(zhí)行速度。

比如,查找一個(gè)數(shù)組中的重復(fù)數(shù)字的例子。

采用犧牲時(shí)間換空間的實(shí)現(xiàn)如下:

/*** i = 0 時(shí),外部循環(huán):1 次 int i = 0; 操作,1 次 i < arr.length; 操作,內(nèi)部循環(huán):1 次 int j = 0; 操作,1 次 j < i; 操作,共 4 次操作* i = 1 時(shí),外部循環(huán):1 次 i++ 操作,1 次 i < arr.length; 操作,內(nèi)部循環(huán):1 次 int j = 0; 操作,2 次 j < i; 操作,1 次比較操作,1 次 j++ 操作,共 7 次操作* i = 2 時(shí),外部循環(huán):1 次 i++ 操作,1 次 i < arr.length; 操作,內(nèi)部循環(huán):1 次 int j = 0; 操作,3 次 j < i; 操作,2 次比較操作,2 次 j++ 操作,共 10 次操作* i = n 時(shí),外部循環(huán):1 次 i++ 操作,1 次 i < arr.length; 操作,內(nèi)部循環(huán):1 次 int j = 0; 操作,n + 1 次 j < i; 操作,n 次比較操作,n 次 j++ 操作,共 3n + 4 次操作* 總共:T(n) = (3n + 4)*n / 2 = 1.5n^2 + 2n = O(n^2)*/ public static void findTheSameTwoNumber1() {int[] arr = new int[]{3, 1, 2, 5, 4, 9, 7, 2};for (int i = 0; i < arr.length; i++) {for (int j = 0; j < i; j++) {if (arr[j] == arr[i]) {System.out.println("the same number is: " + arr[j]);break;}}} } /**

時(shí)間復(fù)雜度是 O(n^2),空間復(fù)雜度是 O(1)。

采用犧牲空間換時(shí)間的實(shí)現(xiàn)如下:

/*** i = 0 時(shí),1 次 int i = 0; 操作,1 次 i < arr.length; 操作,1 次 hashSet.add(arr[i]) 操作,共 3 次操作* i = 1 時(shí),1 次 i++ 操作,1 次 i < arr.length; 操作,1 次 hashSet.add(arr[i]) 操作,共 3 次操作* i = n 時(shí),1 次 i++ 操作,1 次 i < arr.length; 操作,1 次 hashSet.add(arr[i]) 操作,共 3 次操作* 所以 T(n) = 3n = O(n);*/ public static void findTheSameTwoNumber2() {int[] arr = new int[]{3, 1, 2, 5, 4, 9, 7, 2};// 借助中間數(shù)據(jù),一個(gè)哈希集合,需要開辟一定的內(nèi)存空間來存儲(chǔ)有用的數(shù)據(jù)信息。HashSet<Integer> hashSet = new HashSet<>();for (int i = 0; i < arr.length; i++) {if (!hashSet.add(arr[i])) {System.out.println("the same number is: " + arr[i]);break;}} }

時(shí)間復(fù)雜度是 O(n),空間復(fù)雜度是 O(1)。

3. 最后

本文主要學(xué)習(xí)時(shí)間復(fù)雜度和空間復(fù)雜度的概念以及例子。

參考

  • 關(guān)于時(shí)間復(fù)雜度,你不知道的都在這里!;
  • 什么是大O表示法;
  • 三種表示方法:O, Ω, Θ

總結(jié)

以上是生活随笔為你收集整理的《漫画算法-小灰的算法之旅》第1章-算法概述读书笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 麻豆md0077饥渴少妇 | 521av在线| 可以免费看毛片的网站 | 国产丝袜第一页 | 久久99精品久久久久婷婷 | 亚洲国产高清视频 | 中文字幕第六页 | 中国女人毛茸茸 | 三级黄色在线 | 中文字幕91 | 亚洲精品综合网 | 欧美一二三级 | 无码精品a∨在线观看中文 福利片av | 伊人网视频在线 | 波多在线播放 | 日本伦理在线 | 91黄在线看 | 牛牛澡牛牛爽一区二区 | 日韩视频中文字幕 | 99碰碰| 日韩久久高清 | 久久99综合| 大象传媒成人在线观看 | 国产精品一级片在线观看 | 午夜av一区二区三区 | 99精品一级欧美片免费播放 | 国产精品国产三级国产aⅴ无密码 | 黄色三级a | 国产精品乱码一区二区 | 日韩毛片在线免费观看 | 一区二区三区福利视频 | 精品亚洲一区二区三区 | 黑人乱码一区二区三区av | 青娱乐国产在线 | www色网站 | 大战熟女丰满人妻av | 色老板av| 欧美亚洲视频一区 | 欧美a级在线 | 91在线观看.| 非洲黑人狂躁日本妞 | 一本色道久久综合亚洲 | 9l视频自拍蝌蚪9l视频 | 人人干美女 | 在线看国产视频 | 国产在线第二页 | 色插综合 | 在线观看成人一区 | 中文字幕在线观看视频免费 | 在线观看免费高清视频 | 日韩精品在线观看一区二区 | 大奶一区 | 久久国产精品网 | 国产高清在线观看视频 | 91丨porny丨国产 | 超碰成人免费 | 一区二区三区毛片 | 天堂中文在线网 | www.久久久久久| 中文字幕一区二区三区门四区五区 | 欧美成人性生活 | 欧美一区二区在线 | 冲田杏梨一区二区三区 | 免费看黄在线看 | 老司机深夜免费福利 | 黄色片网站在线 | 黄色网页免费看 | 国产小视频在线免费观看 | 欧美 日韩 国产 高清 | 欧美久久久久久久久 | 亚洲国产精品成人综合色在线婷婷 | 久久经典视频 | 午夜激情在线 | 午夜在线精品偷拍 | 四虎国产成人精品免费一女五男 | 图片区视频区小说区 | 久久精品国产亚洲AV熟女 | 日韩av一区二区三区在线观看 | 久久国产经典视频 | 欧美女优一区 | 欧美一区二区三 | 综合国产在线 | 黄色aa毛片 | 三级伦理视频 | 动漫同人高h啪啪爽文 | 亚洲熟妇av一区二区三区漫画 | 蜜臀久久 | www,av在线 | 日本高清免费aaaaa大片视频 | 蜜桃av噜噜一区二区三区麻豆 | 日韩视频专区 | 小泽玛利亚一区二区三区视频 | 美女视频久久 | 在线观看欧美精品 | 色婷婷综合久久久久中文 | 成人黄色大全 | 欧美国产在线视频 | 精品成人在线 | 国产欧美精品一区二区 |