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

一次倒在 LRU 上的經歷

網絡 通信技術
最近有個小伙伴跟我訴苦,說他沒面到LRU,他說他很久前知道有被問過LRU的但是心想自己應該不會遇到,所以暫時就沒準備。

[[438898]]

本文轉載自微信公眾號「bigsai」,作者大賽  。轉載本文請聯系bigsai公眾號。

前言

大家好,我是bigsai,好久不見,甚是想念!

最近有個小伙伴跟我訴苦,說他沒面到LRU,他說他很久前知道有被問過LRU的但是心想自己應該不會遇到,所以暫時就沒準備。

奈何不巧,這還就真的考到了!他此刻的心情,可以用一張圖來證明:

[[438899]]

他說他最終踉踉蹌蹌的寫了一個效率不是很高的LRU,面試官看著不是很滿意要求寫一個O(1)復雜度的LRU……后來果真GG了,后來發現這是力扣146的一道原題。

防止日后再碰到這個坑,今天和大家一起把這個坑踩了,這道題我自身剛開始也是用較為普通的方法,但是好的方法雖然不是很難但是想了真的很久才想到,雖然花了太多時間不太值,總算是自己想出來了,將這個過程給大家分享一下(只從算法的角度,不從操作系統的角度)。

理解LRU

設計一個LRU,你得知道什么是LRU吧?

LRU,英文全稱為Least Recently Used,翻譯過來就是最近最久未使用算法,是一種常用的頁面置換算法。

說起頁面置換算法,這就是跟OS關系比較大的了,我們都知道內存的速度比較快,但是內存的容量是非常有限的,不可能給所有頁面裝到內存中,所以就需要一個策略將常用的頁面預放到內存中。

但是吧,誰也不知道進程下次會訪問哪個內存,并不能很有效的知道(我們在當前并沒有預測未來的功能),所以有些頁面置換算法只是理想化但是沒法真實實現的(沒錯就是最佳置換算法(Optimal)),然后常見必回的算法就是FIFO(先進先出)和LRU(最近最久未使用)。

LRU理解不難,就是維護一個有固定大小的容器,核心就是get()和put()兩個操作。

我們先看一下LRU會有的兩個操作:

初始化:LRUCache(int capacity) ,以正整數作為容量 capacity 初始化 LRU 緩存。

查詢:get(int key),從自己的設計的數據結構中查找是否有當前key對應的value,如果有那么返回對應值并且要將key更新記錄為最近使用,如果沒有返回-1。

插入/更新:put(int key,int value),可能是插入一個key-value,也可能是更新一個key-value,如果容器中已經存才這個key-value那么只需要更新對應value值,并且標記成最新。如果容器不存在這個值,那么要考慮容器是否滿了,如果滿了要先刪除最久未使用的那對key-value。

這里的流程可以給大家舉個例子,例如

容量大小為2:

  1. 容量大小為2: 
  2. "put",  "put""get""put","get""put","get","get","get"
  3. [ [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1],  [3], [4]] 

這個過程如下:

大家容易忽略的細節有:

  • put()存在更新的操作,例如put(3,3),put(3,4)會更新key為3的操作。
  • get()可能查詢不到,但是查詢到也會更新最久未使用的順序。
  • 如果容器未使用滿,那么put可能更新可能插入,但是不會刪除;如果容器滿了并且put插入,就要考慮刪除最久未使用的key-value了。

對于上面的這么一個規則,我們該如何處理呢?

如果單單用一個List類似的列表,可以順序存儲鍵值對,在List前面的(0下標為前)我們認為它是比較久的,在List后我們認為它是比較新的。我們考慮下各種操作可能會這樣設計:

如果來get操作:

遍歷List一個個比對,查看是否有該key的鍵值對,如果有直接返回對應key的value,如果沒有那么返回-1.

如果來put操作:

遍歷List,如果有該key的鍵值對,那么果斷刪除這個key-value,最后在末尾統一插入該鍵值對。

如果沒有對應的key并且List容器已經到達最滿了,那么果斷刪除第一個位置的key-value。

用List可能需要兩個(一個存key一個存value),或者一個存Node節點(key,value為屬性)的List,考慮下這個時間復雜度:

put操作:O(n),get操作:O(n) 兩個操作都需要枚舉列表線性復雜度,效率屬實有點拉胯,肯定不行,這樣的代碼我就不寫了。

哈希初優化

從上面的分析來看,我們已經可以很自信的將LRU寫出來了,不過現在要考慮的是一個優化的事情。

如果說我們將程序中引入哈希表,那么肯定會有一些優化的。用哈希表存儲key-value,查詢是否存在的操作都能優化為O(1),但是刪除或者插入或者更新位置的復雜度可能還是O(n),我們一起分析一下:

最久未使用一定是一個有序的序列來儲存,要么是順序表(數組)要么是鏈表,如果是數組實現的ArrayList存儲最久未使用這個序列。

如果是ArrayList進行刪除最久未使用(第一個)key-value,新的key被命中變成最新被使用(先刪除然后插入末尾)操作都是O(n)。

同理如果是LinkedList的一些操作大部分也是O(n)的,像刪除第一個元素這個是因為數據結構原因O(1)。

你發現自己的優化空間其實非常非常小,但是確實還是有進步的,只是被卡住不知道雙O(1)的操作究竟怎么優化,這里面我把這個版本代碼放出來,大家可以參考一下(如果面試問到實在不會可以這么寫)

  1. class LRUCache { 
  2.  
  3.     Map<Integer,Integer>map=new HashMap<>(); 
  4.     List<Integer>list=new ArrayList<>(); 
  5.     int maxSize; 
  6.     public  LRUCache(int capacity) { 
  7.         maxSize=capacity; 
  8.     } 
  9.  
  10.     public int get(int key) { 
  11.         if(!map.containsKey(key))//不存在返回-1 
  12.             return -1; 
  13.         int val=map.get(key); 
  14.         put(key,val);//要更新位置 變成最新 很重要! 
  15.         return val; 
  16.     } 
  17.  
  18.     public void put(int keyint value) { 
  19.         //如果key存在,直接更新即可 
  20.         if (map.containsKey(key)) { 
  21.             list.remove((Integerkey); 
  22.             list.add(key); 
  23.         } else {//如果不存在 要插入到最后,但是如果容量滿了需要刪除第一個(最久) 
  24.             if (!map.containsKey(key)) { 
  25.                 if (list.size() == maxSize) { 
  26.                     map.remove(list.get(0)); 
  27.                     list.remove(0); 
  28.                 } 
  29.                 list.add(key); 
  30.             } 
  31.         } 
  32.         map.put(key, value); 
  33.     } 

哈希+雙鏈表

上面我們已經知道用哈希能夠直接查到有木有這個元素,但是苦于刪除!用List都很費力。

更詳細的說,是苦于List的刪除操作,Map的刪除插入還是很高效的。

在上面這種情況,我們希望的就是能夠快速刪除List中任意一個元素,并且效率很高,如果借助哈希只能最多定位到,但是無法刪除啊!該怎么辦呢?

哈希+雙鏈表啊!

我們將key-val的數據存到一個Node類中,然后每個Node知道左右節點,在插入鏈表的時候直接存入Map中,這樣Map在查詢的時候可以直接返回該節點,雙鏈表知道左右節點可以直接將該節點在雙鏈表中刪除。

當然,為了效率,這里實現的雙鏈表帶頭結點(頭指針指向一個空節點防止刪除等異常情況)和尾指針。

對于這個情況,你需要能夠手寫鏈表和雙鏈表啦,雙鏈表的增刪改查已經寫過清清楚楚,小伙伴們不要擔心,這里我已經整理好啦:

單鏈表:https://mp.weixin.qq.com/s/Cq98GmXt61-2wFj4WWezSg

雙鏈表:https://mp.weixin.qq.com/s/h6s7lXt5G3JdkBZTi01G3A

也就是你可以通過HashMap直接得到在雙鏈表中對應的Node,然后根據前后節點關系刪除,期間要考慮的一些null、尾指針刪除等等特殊情況即可。

具體實現的代碼為:

  1. class LRUCache { 
  2.     class Node { 
  3.         int key
  4.         int value; 
  5.         Node pre; 
  6.         Node next
  7.  
  8.         public Node() { 
  9.         } 
  10.  
  11.         public Node( int key,int value) { 
  12.             this.key = key
  13.             this.value=value; 
  14.         } 
  15.     } 
  16.     class DoubleList{ 
  17.         private Node head;// 頭節點 
  18.         private Node tail;// 尾節點 
  19.         private int length; 
  20.         public DoubleList() { 
  21.             head = new Node(-1,-1); 
  22.             tail = head; 
  23.             length = 0; 
  24.         } 
  25.         void add(Node teamNode)// 默認尾節點插入 
  26.         { 
  27.             tail.next = teamNode; 
  28.             teamNode.pre=tail; 
  29.             tail = teamNode; 
  30.             length++; 
  31.         } 
  32.         void deleteFirst(){ 
  33.             if(head.next==null
  34.                 return
  35.             if(head.next==tail)//如果刪除的那個剛好是tail  注意啦 tail指針前面移動 
  36.                 tail=head; 
  37.             head.next=head.next.next
  38.  
  39.             if(head.next!=null
  40.                 head.next.pre=head; 
  41.             length--; 
  42.         } 
  43.         void deleteNode(Node team){ 
  44.  
  45.             team.pre.next=team.next
  46.             if(team.next!=null
  47.                 team.next.pre=team.pre; 
  48.             if(team==tail) 
  49.                 tail=tail.pre; 
  50.            team.pre=null
  51.            team.next=null
  52.             length--; 
  53.         } 
  54.         public String toString() { 
  55.             Node team = head.next
  56.             String vaString = "len:"+length+" "
  57.             while (team != null) { 
  58.                 vaString +="key:"+team.key+" val:"+ team.value + " "
  59.                 team = team.next
  60.             } 
  61.             return vaString; 
  62.         } 
  63.     } 
  64.     Map<Integer,Node> map=new HashMap<>(); 
  65.     DoubleList doubleList;//存儲順序 
  66.     int maxSize; 
  67.     LinkedList<Integer>list2=new LinkedList<>(); 
  68.  
  69.     public   LRUCache(int capacity) { 
  70.         doubleList=new DoubleList(); 
  71.         maxSize=capacity; 
  72.     } 
  73.     public  void print(){ 
  74.         System.out.print("maplen:"+map.keySet().size()+" "); 
  75.         for(Integer in:map.keySet()){ 
  76.             System.out.print("key:"+in+" val:"+map.get(in).value+" "); 
  77.         } 
  78.         System.out.print("              "); 
  79.         System.out.println("listLen:"+doubleList.length+" "+doubleList.toString()+" maxSize:"+maxSize); 
  80.     } 
  81.  
  82.     public int get(int key) { 
  83.         int val; 
  84.         if(!map.containsKey(key)) 
  85.             return  -1; 
  86.         val=map.get(key).value; 
  87.         Node team=map.get(key); 
  88.         doubleList.deleteNode(team); 
  89.         doubleList.add(team); 
  90.         return  val; 
  91.     } 
  92.  
  93.     public void put(int keyint value) { 
  94.         if(map.containsKey(key)){// 已經有這個key 不考慮長短直接刪除然后更新 
  95.            Node deleteNode=map.get(key); 
  96.             doubleList.deleteNode(deleteNode); 
  97.         } 
  98.         else if(doubleList.length==maxSize){//不包含并且長度小于 
  99.             Node first=doubleList.head.next
  100.             map.remove(first.key); 
  101.             doubleList.deleteFirst(); 
  102.         } 
  103.        Node node=new Node(key,value); 
  104.         doubleList.add(node); 
  105.         map.put(key,node); 
  106.  
  107.     } 

就這樣,一個get和put都是O(1)復雜度的LRU寫出來啦!

尾聲

后來看了題解,才發現,Java中的LinkedHashMap也差不多是這種數據結構!幾行解決,但是一般面試官可能不會認同,還是會希望大家能夠手寫一個雙鏈表的。

  1. class LRUCache extends LinkedHashMap<IntegerInteger>{ 
  2.     private int capacity; 
  3.  
  4.     public LRUCache(int capacity) { 
  5.         super(capacity, 0.75F, true); 
  6.         this.capacity = capacity; 
  7.     } 
  8.  
  9.     public int get(int key) { 
  10.         return super.getOrDefault(key, -1); 
  11.     } 
  12.  
  13.     public void put(int keyint value) { 
  14.         super.put(key, value); 
  15.     } 
  16.  
  17.     @Override 
  18.     protected boolean removeEldestEntry(Map.Entry<IntegerInteger> eldest) { 
  19.         return size() > capacity;  
  20.     } 
  21. }//這個來源官方題解 給大家分享一下 

}//這個來源官方題解 給大家分享一下

哈希+雙鏈表雖然在未看題解的情況想出來,但是真的花了挺久才想到這個點,以前見得確實比較少,高效手寫LRU到今天算是真真正正的完全掌握啦!

不過除了LRU,其他的頁面置換算法無論筆試還是面試也是非常高頻啊,大家有空自己梳理一下哦。

 

除了算法水平真的很強的,不然大部分人其實不可能當場想到一些比較巧妙的方法,所以面對筆試最好的訣竅還是多刷力扣。

 

責任編輯:武曉燕 來源: bigsai
相關推薦

2012-08-28 09:21:59

Ajax查錯經歷Web

2025-03-17 10:01:07

2023-03-29 09:36:32

2016-12-06 09:34:33

線程框架經歷

2013-04-01 10:27:37

程序員失業

2011-04-13 09:21:30

死鎖SQL Server

2013-01-17 10:31:13

JavaScriptWeb開發firebug

2021-04-13 18:17:48

Hbase集群配置

2021-01-22 05:35:19

Lvm模塊Multipath

2012-07-12 14:35:31

面試經歷

2018-09-14 10:48:45

Java內存泄漏

2022-06-10 11:06:23

服務下線

2015-04-28 15:31:09

2017-11-09 09:06:29

流量暴增優化

2020-11-23 07:13:13

Nodejs源碼

2022-07-13 08:31:18

React問題排查

2018-12-06 16:25:39

數據庫服務器線程池

2020-02-10 10:15:31

技術研發指標

2019-04-04 15:00:40

SQL索引數據庫

2020-07-15 08:11:05

Linuxc++程序
點贊
收藏

51CTO技術棧公眾號

国产麻豆精品一区| 熟女少妇a性色生活片毛片| 色综合桃花网| 国产日韩欧美不卡在线| 91免费的视频在线播放| 国产真人真事毛片| 国产伦精品一区二区三区千人斩 | 欧美黑人一区二区三区| 风间由美一二三区av片| 91麻豆精品国产综合久久久| 性久久久久久久久久久久| 日本一区不卡| 成人毛片在线精品国产| 久久精品一区| 久久91精品国产| 日本少妇xxxxx| 成人中文字幕视频| 欧美日韩一级二级| 国产日韩av网站| 美女羞羞视频在线观看| 91看片淫黄大片一级| 国产中文欧美精品| 精品人妻一区二区三区潮喷在线 | 艳妇乳肉豪妇荡乳av| 亚洲人成免费| 欧美精品中文字幕一区| 国产一区二区三区精品在线| 精品国产一级| 欧美情侣在线播放| 50路60路老熟妇啪啪| 国产探花在线观看| 国产精品视频一区二区三区四蜜臂| 欧美日韩日日夜夜| 国产乱子夫妻xx黑人xyx真爽| 国产在线高清视频| 国产精品美女一区二区三区| 久久青青草综合| 二区三区在线视频| 国产精品自拍在线| 91久久久国产精品| 亚洲在线视频播放| 免费黄网站欧美| 国产97在线播放| 一级黄色免费网站| 国产欧美日韩一级| 性色av一区二区三区免费| 波多野结衣不卡视频| 99久久综合| 色偷偷9999www| 男人天堂av电影| 九色精品国产蝌蚪| 亚洲毛片一区二区| 成人片黄网站色大片免费毛片| 宅男在线一区| 怡红院精品视频| 亚洲黄色网址大全| 欧美日韩黑人| 色偷偷av亚洲男人的天堂| 后入内射无码人妻一区| 爽成人777777婷婷| 久久亚洲精品网站| 久久免费公开视频| 99视频精品| 日韩免费观看视频| 一区二区乱子伦在线播放| 蜜臀av一区二区三区| 91精品久久久久| 99在线观看免费| 大白屁股一区二区视频| 久久99精品久久久久久三级| 青青青草网站免费视频在线观看| 久久精品一区二区三区不卡牛牛| 日本高清一区| 秋霞午夜理伦电影在线观看| 亚洲精品日韩综合观看成人91| 欧美国产日韩激情| jizz内谢中国亚洲jizz| 欧美日韩国产美| 少妇高潮一69aⅹ| 卡一精品卡二卡三网站乱码| 亚洲欧美制服第一页| 国产wwwwxxxx| 激情综合网址| 国产成人精品a视频一区www| 国产精品久久欧美久久一区| 不卡大黄网站免费看| 欧美婷婷久久| 亚洲小说区图片区都市| 精品久久久久久久久久久久| 91香蕉视频污版| 精品午夜视频| 亚洲欧美一区二区三区四区 | 亚洲影院久久精品| av动漫在线看| 四虎地址8848精品| 亚洲成人激情图| 青青青视频在线播放| 欧美极品一区二区三区| 国产a∨精品一区二区三区不卡| 91丨九色丨丰满| 99r国产精品| 在线观看亚洲视频啊啊啊啊| av在线资源| 69堂精品视频| 中文字幕av久久爽一区| 欧美午夜视频| 91精品国产综合久久香蕉的用户体验| 日本加勒比一区| 国产精品二三区| 免费高清在线观看免费| 精品一区91| 在线性视频日韩欧美| 亚洲精品视频在线观看免费视频| 久久99国内精品| 欧美精品尤物在线| 91黄页在线观看| 欧美一区二区三区免费在线看| 美女100%无挡| 国产色综合网| 91日韩久久| 精品国产99久久久久久| 欧美香蕉大胸在线视频观看| 亚洲成人精品在线播放| 91偷拍一区二区三区精品| 欧美专区中文字幕| 日韩在线观看视频一区二区三区| 成人免费一区二区三区视频 | 精品一区二区三区在线视频| 欧美一进一出视频| 国产无遮挡裸体视频在线观看| 8x8x8国产精品| 国产三级aaa| 日韩高清在线一区| 欧美成人蜜桃| 色吧亚洲日本| 日韩av在线影院| 国产亚洲精品码| 国产精品1区二区.| 色综合666| 日韩久久一区二区三区| 亚洲欧美国产精品专区久久| 国产精品免费av一区二区| 成人做爰69片免费看网站| 国产女主播av| 久久久久久爱| 久久精品99久久久香蕉| 一区二区三区免费在线视频| 国产精品美女久久久久久久网站| 日本熟妇人妻中出| 成人免费av| 国产欧美韩国高清| 91精品国产91久久久久游泳池 | 日本午夜一区二区| 麻豆精品视频| 亚洲人成午夜免电影费观看| 亚洲美女视频网站| 日韩三级一区二区| 国产欧美日韩在线看| 日韩一区二区三区四区五区六区| 欧美一卡2卡3卡4卡无卡免费观看水多多| 绿色成人影院| 亚洲人成在线播放| 国产精品传媒在线观看| 日本一二三四高清不卡| 久久国产精品国产精品| 99国产精品一区二区| 成人久久一区二区| 丝袜美女在线观看| 亚洲国产欧美日韩精品| www.毛片.com| 国产精品污污网站在线观看| 涩涩网站在线看| 很黄很黄激情成人| 久久久久高清| 福利一区二区三区视频在线观看| www欧美日韩| 乱色精品无码一区二区国产盗| 午夜在线成人av| 欧美大波大乳巨大乳| 精品一区二区免费视频| 久久国产精品网| 奇米狠狠一区二区三区| 国产欧美日韩精品在线观看| 综合久久2019| 亚洲欧美另类自拍| 国产视频一二三四区| 天天做天天摸天天爽国产一区 | www.蜜桃av.com| 图片区小说区国产精品视频| 日本成人免费视频| 国产精品一区二区视频| 国产精品va无码一区二区| 久久国产亚洲精品| 国产伦精品一区二区三区免费视频 | 精品网站aaa| 国产精品av电影| 欧美bbbxxxxx| 中文字幕在线国产精品| 好吊视频一区二区三区| 欧美视频在线播放| 亚欧洲精品在线视频| 国产精品网站导航| 好男人香蕉影院| 黄色小说综合网站| 久久久久狠狠高潮亚洲精品| 午夜精品网站| 午夜免费电影一区在线观看| 久久久久高潮毛片免费全部播放| 国产日产久久高清欧美一区| 日韩伦理在线| 久久久久久国产| 黄页视频在线播放| 亚洲天堂av高清| 午夜福利视频一区二区| 日韩亚洲欧美高清| 中文字幕在线观看1| 精品女厕一区二区三区| 国产盗摄x88av| 中文字幕国产一区| 亚洲专区区免费| 成人综合在线观看| 特黄特黄一级片| 蜜桃视频在线观看一区二区| 男女午夜激情视频| 黑丝一区二区| 波多野结衣av一区二区全免费观看| 日本精品黄色| 日韩在线观看电影完整版高清免费| 麻豆精品av| 国产视色精品亚洲一区二区| 久久99成人| 成人羞羞国产免费| 3d动漫一区二区三区在线观看| 国产精品一区二区三| 久久精品女人天堂av免费观看| 91精品国产乱码久久久久久久久| 超碰在线免费公开| 欧美xxxx18性欧美| 黄色成年人视频在线观看| 日韩在线视频线视频免费网站| 成人在线视频成人| 精品调教chinesegay| 三级黄视频在线观看| 日韩av在线资源| 免费av在线电影| 国产一区二区三区视频| а天堂8中文最新版在线官网| 亚洲视频视频在线| 国产三级视频在线| 中文字幕日韩在线观看| av在线第一页| 日韩小视频网址| 激情视频在线观看| 欧美激情精品久久久久久大尺度| 美女尤物在线视频| 欧美精品第一页在线播放| ****av在线网毛片| 88国产精品欧美一区二区三区| 蜜臀国产一区| 国产精品久久久久久五月尺| 国语自产精品视频在线看抢先版结局| 国产精品综合久久久| 57pao成人永久免费| 97超碰人人模人人爽人人看| 国产成人高清精品免费5388| 久久五月天婷婷| 欧美一级精品| 欧美与动交zoz0z| 亚洲高清久久| 日本三级免费观看| 免播放器亚洲一区| 丰满少妇中文字幕| 97se亚洲国产综合自在线观| 久久亚洲AV无码专区成人国产| 欧美激情在线一区二区| 欧美爱爱免费视频| 亚洲6080在线| 最近中文在线观看| 欧美一区午夜视频在线观看| 熟妇人妻中文av无码| 亚洲人精选亚洲人成在线| 久cao在线| 午夜精品久久久久久99热| 日韩网站中文字幕| 亚洲综合国产精品| 免费久久精品| 肉大捧一出免费观看网站在线播放| 99热在线精品观看| 老司机午夜性大片| 91在线porny国产在线看| 成人性生交大片免费看无遮挡aⅴ| 亚洲日本丝袜连裤袜办公室| 久久免费激情视频| 91精品国产综合久久香蕉麻豆| 涩涩视频免费看| www.日韩不卡电影av| 国产99re66在线视频| 国产精品视频网| 男人的天堂久久| 无码毛片aaa在线| 久久午夜激情| 人妻换人妻a片爽麻豆| 欧美国产日韩a欧美在线观看| 久久久精品视频免费| 欧美色视频在线| 婷婷在线观看视频| 久久视频在线视频| 成人免费av电影| 国产亚洲情侣一区二区无| 亚洲h色精品| www.日日操| 91在线视频观看| 欧美另类视频在线观看| 欧美性videosxxxxx| 天堂91在线| 久久久人成影片一区二区三区| 欧美成a人片免费观看久久五月天| 欧美伦理一区二区| 日韩午夜黄色| 国产ts在线观看| 亚洲婷婷在线视频| 中文字幕av网站| 亚洲色在线视频| av资源亚洲| 你懂的视频在线一区二区| 在线电影一区| 久久久久亚洲av成人网人人软件| 亚洲欧美在线视频| 欧美高清69hd| 亚洲图片欧美日产| www.成人爱| 免费看国产精品一二区视频| 在线日韩中文| 欧美性生交xxxxx| 一级日本不卡的影视| av中文字幕免费在线观看| 精品国内亚洲在观看18黄| 国产极品一区| 日韩欧美亚洲日产国| 日韩精品国产欧美| 日本黄色网址大全| 日韩欧美国产免费播放| 四虎在线免费观看| 欧美一级淫片播放口| 日韩mv欧美mv国产网站| av高清在线免费观看| jlzzjlzz亚洲日本少妇| 亚洲 欧美 视频| 日韩毛片在线看| 久九九久频精品短视频| 欧美亚洲免费在线| 日韩精品一二三| 刘亦菲国产毛片bd| 欧美精品乱码久久久久久按摩| 男人在线资源站| 91系列在线观看| 欧美午夜在线视频| 超碰caoprom| 欧美性猛交xxxx乱大交3| 国产一区精品| 国产日韩在线看片| 欧美欧美天天天天操| 国产真实乱人偷精品| 色呦呦网站一区| 中文字幕日本在线观看| 成人中心免费视频| 国产精品v日韩精品v欧美精品网站| 日本人添下边视频免费| 欧美性猛交xxxx免费看漫画| 国产二区视频在线观看| 成人国产在线视频| 精品91在线| japanese中文字幕| 9191久久久久久久久久久| 波多野结衣精品| 欧美日韩一区二区视频在线观看| 免费人成精品欧美精品| 九九视频免费观看| 亚洲美女黄色片| 3d动漫一区二区三区在线观看| 日韩精品在线观看av| 久久精品视频免费| 国产视频手机在线| 午夜精品一区二区三区在线视频| 国产欧美一区二区三区精品观看 | 91日韩在线专区| 中文字幕一区二区三区四区免费看 | av片在线观看| 久久久久高清| 国产一区欧美日韩| 天天操天天摸天天干| 最好看的2019年中文视频| 4438全国亚洲精品观看视频| 日韩精品一区二区三区不卡 | 成年人视频在线免费| 亚洲人精品午夜| 国产专区在线| 成人动漫在线观看视频| 青青草国产成人99久久| 豆国产97在线 | 亚洲|