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

如何在 Go 中對依賴圖進行排序

開發 后端
最近,我在思考在軟件工程中遇到的許多重要問題可以歸結為幾個簡單的問題。只要看看任何關于算法的書,其中的大部分都會是排序或搜索集合的一些變體。

[[433885]]

大家好,我是程序員幽鬼。

最近,我在思考在軟件工程中遇到的許多重要問題可以歸結為幾個簡單的問題。只要看看任何關于算法的書,其中的大部分都會是排序或搜索集合的一些變體。谷歌的存在是因為“哪些文檔包含這些短語?”是一個真正難以解決的問題(好吧,這極大地簡化了 Google 產品的龐大范圍,但基本思想仍然成立)。

01 什么是拓撲排序?

在我的職業生涯中,我一次又一次遇到的常見問題之一就是對依賴圖的節點進行拓撲排序。換句話說,給定一些有向無環圖 — 想想可以依賴于其他軟件包或大型公司項目中的任務的軟件包 — 對它們進行排序,以便列表中的任何項目都不會依賴于列表中后面出現的任何內容。假設我們正在制作蛋糕,在開始之前,我們需要一些原料。讓我們來簡化一下,說我們只需要雞蛋和面粉。嗯,要吃雞蛋,我們需要雞(相信我,我在這里不是開玩笑),要吃面粉,我們需要谷物。雞也需要谷物作為飼料,谷物需要土壤和水才能生長。我們考慮表達所有這些依賴關系的圖表:

The dependency graph of cake

該圖的一種可能的拓撲順序是:

  1. []string{"soil""water""grain""chickens""flour""eggs""cake"

但是,還有其他可能的拓撲順序:

  1. []string{"water""soil""grain""flour""chickens""eggs""cake"

我們也可以把面粉放在雞蛋后面,因為唯一依賴雞蛋的就是蛋糕。由于我們可以重新排列項目,我們還可以并行完成其中一些項目,同時保持任何項目都不會出現在依賴于它的任何東西之前。例如,通過添加一層嵌套,我們可以表明內部切片中的所有內容都獨立于該切片中的其他任何內容:

  1. [][]string{ 
  2.     {"soil""water"}, 
  3.     {"grain"}, 
  4.     {"chickens""flour"}, 
  5.     {"eggs"}, 
  6.     {"cake"}, 

從這個圖中,我們得到了一個很好的“執行計劃”,用于為蛋糕準備依賴項。首先,我們需要找到一些土壤和水。接下來,我們種植谷物。然后,我們同時養一些雞和做面粉,收集雞蛋。最后,我們可以做蛋糕了!對于小于四歲的人來說,這似乎是一項艱巨的工作,但好的事情需要時間。

02 構建依賴圖

現在我們了解了要做什么,讓我們考慮如何編寫一些能夠構建這種依賴項列表的代碼。我們當然需要跟蹤元素本身,我們需要跟蹤什么取決于什么。為了使兩者都“取決于什么X?” 和“X取決于什么?” 高效,我們將跟蹤兩個方向的依賴關系。

我們已經足夠了解開始編寫代碼所需的內容:

  1. // A node in this graph is just a string, so a nodeset is a map whose 
  2. // keys are the nodes that are present. 
  3. type nodeset map[string]struct{} 
  4.  
  5. // depmap tracks the nodes that have some dependency relationship to 
  6. // some other node, represented by the key of the map. 
  7. type depmap map[string]nodeset 
  8.  
  9. type Graph struct { 
  10.  nodes nodeset 
  11.  
  12.  // Maintain dependency relationships in both directions. These 
  13.  // data structures are the edges of the graph. 
  14.  
  15.  // `dependencies` tracks child -> parents. 
  16.  dependencies depmap 
  17.  // `dependents` tracks parent -> children. 
  18.  dependents depmap 
  19.  // Keep track of the nodes of the graph themselves. 
  20.  
  21. func New() *Graph { 
  22.  return &Graph{ 
  23.   dependencies: make(depmap), 
  24.   dependents:   make(depmap), 
  25.   nodes:        make(nodeset), 
  26.  } 

這種數據結構應該適合我們的目的,因為它包含我們需要的所有信息:節點、“依賴”邊和“依賴于”邊。現在讓我們考慮創建用于向圖形添加新依賴關系的 API。所有我們需要的是一個聲明的方法,一些節點依賴于另一個,就像這樣:graph.DependOn("flour", "grain")。有幾種情況我們要明確禁止。首先,一個節點不能依賴于自己,其次,如果flour依賴于grain,那么grain一定不能依賴于flour,否則我們會創建一個無限的依賴循環。有了這個,讓我們編寫Graph.DependOn()方法。

  1. func (g *Graph) DependOn(child, parent string) error { 
  2.  if child == parent { 
  3.   return errors.New("self-referential dependencies not allowed"
  4.  } 
  5.  
  6.  // The Graph.DependsOn() method doesn't exist yet. 
  7.  // We'll write it next
  8.  if g.DependsOn(parent, child) { 
  9.   return errors.New("circular dependencies not allowed"
  10.  } 
  11.  
  12.  // Add nodes. 
  13.  g.nodes[parent] = struct{}{} 
  14.  g.nodes[child] = struct{}{} 
  15.  
  16.  // Add edges. 
  17.  addNodeToNodeset(g.dependents, parent, child) 
  18.  addNodeToNodeset(g.dependencies, child, parent) 
  19.  
  20.  return nil 
  21.  
  22. func addNodeToNodeset(dm depmap, key, node string) { 
  23.  nodes, ok := dm[key
  24.  if !ok { 
  25.   nodes = make(nodeset) 
  26.   dm[key] = nodes 
  27.  } 
  28.  nodes[node] = struct{}{} 

一旦我們實現,這將有效地為我們的圖表添加依賴關系Graph.DependsOn()。我們可以很容易地判斷一個節點是否直接依賴于其他某個節點,但我們也想知道是否存在傳遞依賴。例如,由于flour依賴于grain并且grain依賴于soil,因此也flour依賴于soil。這將要求我們獲取節點的直接依賴項,然后對于這些依賴項中的每一個,獲取其依賴項等等,直到我們停止發現新的依賴項。用計算機科學術語來說,我們正在計算一個固定點,以在我們的圖上找到“DependsOn”關系的傳遞閉包。

  1. func (g *Graph) DependsOn(child, parent string) bool { 
  2.  deps := g.Dependencies(child) 
  3.  _, ok := deps[parent] 
  4.  return ok 
  5.  
  6. func (g *Graph) Dependencies(child string) nodeset { 
  7.  if _, ok := g.nodes[root]; !ok { 
  8.   return nil 
  9.  } 
  10.   
  11.  out := make(nodeset) 
  12.  searchNext := []string{root} 
  13.  for len(searchNext) > 0 { 
  14.   // List of new nodes from this layer of the dependency graph. This is 
  15.   // assigned to `searchNext` at the end of the outer "discovery" loop. 
  16.   discovered := []string{} 
  17.   for _, node := range searchNext { 
  18.    // For each node to discover, find the next nodes. 
  19.    for nextNode := range nextFn(node) { 
  20.     // If we have not seen the node before, add it to the output as well 
  21.     // as the list of nodes to traverse in the next iteration. 
  22.     if _, ok := out[nextNode]; !ok { 
  23.      out[nextNode] = struct{}{} 
  24.      discovered = append(discovered, nextNode) 
  25.     } 
  26.    } 
  27.   } 
  28.   searchNext = discovered 
  29.  } 
  30.   
  31.  return out 

03 對圖表進行排序

現在我們有了一個圖數據結構,可以考慮如何按照拓撲順序將節點取出。如果我們可以發現葉節點—即,節點本身對其他節點沒有依賴關系—那么我們可以重復獲取葉子并將它們從圖中移除,直到圖為空。在第一次迭代中,我們將找到獨立的元素,然后在隨后的每次迭代中,我們將找到僅依賴于已刪除元素的節點。最終結果將是一個按拓撲排序的獨立“層”節點的切片。

獲取圖的葉子很簡單。我們只需要找到在 dependencies 中沒有條目的節點。這意味著它們不依賴于任何其他節點。

  1. func (g *Graph) Leaves() []string { 
  2.  leaves := make([]string, 0) 
  3.  
  4.  for node := range g.nodes { 
  5.   if _, ok := g.dependencies[node]; !ok { 
  6.    leaves = append(leaves, node) 
  7.   } 
  8.  } 
  9.  
  10.  return leaves 

最后一塊拼圖實際上是計算圖的拓撲排序層。這也是最復雜的一塊。我們將遵循的一般策略是迭代地收集葉子并將它們從圖中刪除,直到圖為空。由于我們將對圖進行變異,因此我們希望對其進行克隆,以便在執行排序后原始圖仍然完好無損,因此我們將繼續實施該克隆:

  1. func copyNodeset(s nodeset) nodeset { 
  2.  out := make(nodeset, len(s)) 
  3.  for k, v := range s { 
  4.   out[k] = v 
  5.  } 
  6.  return out 
  7.  
  8. func copyDepmap(m depmap) depmap { 
  9.  out := make(depmap, len(m)) 
  10.  for k, v := range m { 
  11.   out[k] = copyNodeset(v) 
  12.  } 
  13.  return out 
  14.  
  15. func (g *Graph) clone() *Graph { 
  16.  return &Graph{ 
  17.   dependencies: copyDepmap(g.dependencies), 
  18.   dependents:   copyDepmap(g.dependents), 
  19.   nodes:        copyNodeset(g.nodes), 
  20.  } 

我們還需要能夠從圖中刪除一個節點和所有邊。刪除節點很簡單,就像從每個節點刪除出站邊一樣。然而,我們跟蹤兩個方向的每條邊的事實意味著我們必須做一些額外的工作來刪除入站記錄。我們將用于刪除所有邊的策略如下:

在 dependents 中查找節點 A 的條目。這為我們提供了依賴于 A 的節點集 。

對于這些節點中的每一個,在 dependencies 中找到條目。從 nodeset 中刪除A。

在 dependents 中刪除節點 A 的條目。

執行逆操作,在 dependencies 中查找節點 A 等。

借助一個允許我們從 depmap 條目中刪除節點的小實用程序,我們可以編寫從圖中完全刪除節點的方法。

  1. func removeFromDepmap(dm depmap, key, node string) { 
  2.  nodes := dm[key
  3.  if len(nodes) == 1 { 
  4.   // The only element in the nodeset must be `node`, so we 
  5.   // can delete the entry entirely. 
  6.   delete(dm, key
  7.  } else { 
  8.   // Otherwise, remove the single node from the nodeset. 
  9.   delete(nodes, node) 
  10.  } 
  11.  
  12. func (g *Graph) remove(node string) { 
  13.  // Remove edges from things that depend on `node`. 
  14.  for dependent := range g.dependents[node] { 
  15.   removeFromDepmap(g.dependencies, dependent, node) 
  16.  } 
  17.  delete(g.dependents, node) 
  18.  
  19.  // Remove all edges from node to the things it depends on
  20.  for dependency := range g.dependencies[node] { 
  21.   removeFromDepmap(g.dependents, dependency, node) 
  22.  } 
  23.  delete(g.dependencies, node) 
  24.  
  25.  // Finally, remove the node itself. 
  26.  delete(g.nodes, node) 

最后,我們可以實現 Graph.TopoSortedLayers():

  1. func (g *Graph) TopoSortedLayers() [][]string { 
  2.  layers := [][]string{} 
  3.  
  4.  // Copy the graph 
  5.  shrinkingGraph := g.clone() 
  6.  for { 
  7.   leaves := shrinkingGraph.Leaves() 
  8.   if len(leaves) == 0 { 
  9.    break 
  10.   } 
  11.  
  12.   layers = append(layers, leaves) 
  13.   for _, leafNode := range leaves { 
  14.    shrinkingGraph.remove(leafNode) 
  15.   } 
  16.  } 
  17.  
  18.  return layers 

這種方法清楚地概述了我們對圖進行拓撲排序的策略:

  • 克隆圖,以便我們可以對其進行轉變。
  • 反復將圖的葉子收集到輸出的“層”中。
  • 收集后刪除每一層。
  • 當圖為空時,返回收集的圖層。

現在我們可以回到最初的蛋糕制作問題,以確保我們的圖為我們解決了這個問題:

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  "strings" 
  6.  
  7.  "github.com/kendru/darwin/go/depgraph" 
  8.  
  9. func main() { 
  10.  g := depgraph.New() 
  11.  g.DependOn("cake""eggs"
  12.  g.DependOn("cake""flour"
  13.  g.DependOn("eggs""chickens"
  14.  g.DependOn("flour""grain"
  15.  g.DependOn("chickens""grain"
  16.  g.DependOn("grain""soil"
  17.  g.DependOn("grain""water"
  18.  g.DependOn("chickens""water"
  19.  
  20.  for i, layer := range g.TopoSortedLayers() { 
  21.   fmt.Printf("%d: %s\n", i, strings.Join(layer, ", ")) 
  22.  } 
  23.  // Output
  24.  // 0: soil, water 
  25.  // 1: grain 
  26.  // 2: flour, chickens 
  27.  // 3: eggs 
  28.  // 4: cake 

所有這些工作都不是小菜一碟,但現在我們有了一個依賴圖,可以用來對幾乎任何東西進行拓撲排序。您可以在 GitHub 上找到[1]這篇文章的完整代碼。這個實現有一些明顯的限制,我想挑戰你改進它,以便它可以:

  • 存儲不是簡單字符串的節點
  • 允許單獨添加節點和邊/依賴信息
  • 產生用于調試的字符串輸出

原文鏈接:https://kendru.github.io/go/2021/10/26/sorting-a-dependency-graph-in-go/

參考資料

[1]在 GitHub 上找到: https://github.com/kendru/darwin/tree/main/go/depgraph

本文轉載自微信公眾號「幽鬼」,可以通過以下二維碼關注。轉載本文請聯系幽鬼公眾號。

 

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

2020-11-26 08:12:24

JavaScript對象數組

2021-09-02 22:52:16

ValueDictionary排序

2021-07-09 12:37:31

GoPython編程語言

2025-02-10 10:29:32

2016-12-01 15:43:41

Linuxls命令

2020-05-06 20:40:03

Go編程語言

2013-12-18 09:56:20

AngularJS測試

2020-11-25 12:20:08

Linuxps命令

2021-11-04 05:43:38

GoKartGo代碼靜態安全分析

2022-03-15 07:55:09

JavaScript線性儀表圖開發

2023-11-26 19:06:13

GO測試

2022-11-11 09:01:08

SwiftUI條形圖子視圖

2023-11-30 20:51:26

多子圖布局matplotlib

2021-05-17 14:02:38

Swift 多重排序

2024-05-06 13:34:28

WireGoogleGo

2023-06-15 13:01:07

JavaPythonJavaScript

2022-09-19 11:42:21

Go優化CPU

2014-04-02 13:27:29

iOSNSArray對象

2023-06-06 16:10:11

2021-07-02 07:18:19

Goresults通道類型
點贊
收藏

51CTO技術棧公眾號

色一情一乱一伦| 亚洲色图欧美日韩| 免费黄色在线| 高清国产一区二区| 欧美一级大片视频| 日本猛少妇色xxxxx免费网站| 日本国产一区| 黄网站色欧美视频| 在线观看成人av| 日韩在线观看视频网站| 日本大胆欧美人术艺术动态| 欧美黑人xxx| 欧美大波大乳巨大乳| 国产一区二区三区免费观看在线| 福利视频导航一区| 免费看av软件| 九九九伊在人线综合| 国产精品一区二区在线看| 日韩av毛片网| 国产午夜精品无码一区二区| 日韩啪啪电影网| 亚洲韩国日本中文字幕| 99九九99九九九99九他书对| 亚洲午夜天堂| 亚洲一区二区三区中文字幕在线| 日韩.欧美.亚洲| 免费a视频在线观看| 久久丁香综合五月国产三级网站| 午夜精品一区二区三区在线视| 成人三级视频在线观看| 亚洲涩涩av| 精品久久久久久久久久久院品网 | 97夜夜澡人人双人人人喊| 无码人妻久久一区二区三区| 伊人久久综合| 欧美大码xxxx| 国产黄a三级三级| 国产99亚洲| 亚洲第一页在线| 日本少妇xxx| 欧美性www| 在线观看免费成人| 国产免费视频传媒| 天天综合av| 精品高清一区二区三区| 给我免费播放片在线观看| 日本理论片午伦夜理片在线观看| 亚洲视频一区二区在线| 这里只有精品66| 91短视频版在线观看www免费| 久久欧美中文字幕| 欧美日韩精品久久| 日本啊v在线| 久久免费视频一区| 欧美日韩国产三区| 狠狠v欧美ⅴ日韩v亚洲v大胸| 91婷婷韩国欧美一区二区| 精品免费一区二区三区蜜桃| 神马午夜精品95| 99久久国产综合色|国产精品| 国产一区在线免费观看| 手机av免费在线观看| 91亚洲国产成人精品一区二区三| 精品久久久久久综合日本| 日本波多野结衣在线| 99re在线精品| 偷拍视频一区二区| 青青青青在线| 亚洲久本草在线中文字幕| 伊人网在线免费| 男插女视频久久久| 五月天精品一区二区三区| 国产精品免费观看久久| 国产成人精选| 日韩久久久精品| 超碰caoprom| 婷婷综合一区| 最近2019年中文视频免费在线观看| 国产精品久久久视频| 仙踪林久久久久久久999| 欧美高清在线播放| 五月婷婷色丁香| 蜜乳av一区二区三区| 亚洲va电影大全| 五月婷中文字幕| 国产欧美精品一区| 日本一级淫片演员| www.51av欧美视频| 日本乱码高清不卡字幕| 天堂av在线8| 欧美性生活一级片| 中文字幕在线看视频国产欧美在线看完整 | 亚洲一区欧美在线| 日韩avvvv在线播放| 91在线播放国产| 亚洲 小说区 图片区 都市| 日本一区二区在线不卡| 国产1区2区3区中文字幕| 26uuu亚洲电影| 7777女厕盗摄久久久| 国产精品一区二区人妻喷水| 欧美色网址大全| 欧美激情国内偷拍| 特级西西444www高清大视频| 国产成人精品亚洲午夜麻豆| 日韩精品久久久| 国产第一页在线| 欧美日韩精品一区二区三区四区 | 美日韩在线视频| 无码人妻精品一区二区三区不卡 | 99中文视频在线| 国产污视频在线| 亚洲午夜久久久久久久久电影院 | 亚洲日韩中文字幕一区| 日韩大片免费观看视频播放| 三级黄色免费观看| 每日更新成人在线视频| 92国产精品久久久久首页| 成人福利在线| 精品久久久久久国产91| 下面一进一出好爽视频| 日韩久久视频| 日韩**中文字幕毛片| 黄色三级网站在线观看| 中文字幕日韩一区| 天天插天天操天天射| 日韩美女毛片| 欧美激情视频网址| av综合在线观看| 国产精品天美传媒沈樵| 黑人糟蹋人妻hd中文字幕| 99精品中文字幕在线不卡 | 欧美日韩另类丝袜其他| a级片在线免费观看| 日韩一级欧美一级| 免费黄色国产视频| 免播放器亚洲一区| 亚洲国产一区二区精品视频 | 成人av免费在线看| 麻豆网在线观看| 欧美日韩视频一区二区| 国产传媒国产传媒| 日韩电影一二三区| 日韩精彩视频| 精品裸体bbb| 亚洲少妇中文在线| 乱子伦一区二区三区| 久久久久久99精品| 欧美日韩一区二区在线免费观看| 亚洲永久精品唐人导航网址| 91成人在线视频| 国产精品国产高清国产| 欧美日韩免费在线| 久久精品老司机| 久久精品盗摄| 日韩激情久久| 亚洲伦理一区二区| 久久精品国产免费观看| 国产精品久久综合青草亚洲AV| 国产精品高潮呻吟| 九九九九九九九九| 综合日韩在线| 国产区日韩欧美| 成人小电影网站| 在线日韩av观看| 中文字幕在线观看第二页| 成人欧美一区二区三区小说 | 久久精品这里都是精品| 午夜免费精品视频| 91久久夜色精品国产按摩| 91精品视频一区| 国产蜜臀一区二区打屁股调教| 欧美videossexotv100| 日韩手机在线观看| 国产日韩欧美制服另类| 九九热免费在线观看| 亚洲女同中文字幕| 国模精品娜娜一二三区| 日本在线精品| 欧美成人一区二区三区电影| 欧美 日韩 人妻 高清 中文| 日本久久电影网| 午夜爽爽爽男女免费观看| 成人avav影音| 美女网站视频黄色| 午夜激情一区| 蜜桃91精品入口| 中文字幕综合| 97精品伊人久久久大香线蕉| lutube成人福利在线观看| 日韩一区二区三区四区| 久久精品久久久久久久| 亚洲精品视频一区二区| 熟女俱乐部一区二区| 久88久久88久久久| 欧美色图色综合| 91精品婷婷色在线观看| 久久精品第九区免费观看| 久久91视频| 欧美在线中文字幕| av网站免费在线观看| 亚洲欧美国产视频| 精品人妻一区二区三区麻豆91| 欧美日韩一区二区三区| 四虎884aa成人精品| 91网站在线观看视频| 久久久九九九热| 日韩精品一区第一页| 国产a级黄色大片| 日韩88av| 欧美二区在线看| 国产图片一区| 亚洲xxxx18| 78精品国产综合久久香蕉| 韩国三级电影久久久久久| 欧美日韩视频在线播放| 亚洲美女视频网| 日韩在线观看视频网站| 日韩欧美一区在线观看| 在线观看免费视频a| 色综合久久中文综合久久牛| 国产亚洲精久久久久久无码77777| 国产精品久久久久久久久免费桃花| 精品中文字幕在线播放| 国产福利一区二区三区视频| 国内自拍第二页| 日本成人中文字幕| 熟妇人妻无乱码中文字幕真矢织江| 日韩午夜精品| 伊人久久99| 色无极亚洲影院| 日韩欧美激情一区二区| 欧美一性一交| 国产在线精品一区二区中文| 999久久久久久久久6666| 亚洲最大成人网色| 中文字幕综合| 91久久久久久久久久久久久| 成人全视频免费观看在线看| 国产精品女视频| 电影一区二区| 国产精品免费电影| 欧美日韩在线精品一区二区三区激情综合| 茄子视频成人在线| 一区二区三区四区日本视频| 欧美专区在线视频| 黑人巨大亚洲一区二区久 | 国产一区二区三区在线看| 你懂的视频在线播放| 日韩激情在线视频| 日韩av地址| 亚洲欧洲午夜一线一品| 国产区视频在线| 91亚洲精品| 欧美激情精品久久久久久蜜臀| 91蜜桃在线视频| 欧美夫妻性生活xx| 97超碰在线免费| 欧美一级大片视频| a一区二区三区| 国产成人精品电影| 成人深夜福利| 亚洲xxx自由成熟| 澳门成人av| 久久久免费看| 日韩一区自拍| 国内精品国产三级国产99| 欧美色图麻豆| 男人揉女人奶房视频60分| 玖玖视频精品| 亚洲国产成人va在线观看麻豆| 精品一区二区在线播放| 下面一进一出好爽视频| 99久久国产综合精品女不卡| 色哟哟精品观看| 成人免费在线视频观看| 久久午夜鲁丝片午夜精品| 午夜精品久久久久久| 69视频免费看| 91精品国产色综合久久久蜜香臀| 成人午夜免费在线观看| 亚洲欧洲av一区二区| 菠萝蜜视频国产在线播放| 久久久久久网址| 无人区在线高清完整免费版 一区二| 国产日韩视频在线观看| 岛国av一区| 午夜免费电影一区在线观看| 中文无码久久精品| 欧美色图色综合| 精东粉嫩av免费一区二区三区| 动漫av在线免费观看| 久久久99精品免费观看| 亚洲国产成人精品综合99| 黑人极品videos精品欧美裸| 国产乱色精品成人免费视频| 亚洲丁香婷深爱综合| av片在线免费观看| 欧美极品在线视频| www.久久| 极品校花啪啪激情久久| 久久国产影院| 免费国产黄色网址| 久久99久久久久| av直播在线观看| 亚洲精品国产视频| 无码任你躁久久久久久久| 69堂精品视频| 国产高清一区在线观看| 久久久久久久av| 日韩免费在线电影| 欧美一级二级三级| 伊人成人在线| 三级黄色片免费看| 国产亚洲人成网站| 久久视频免费在线观看| 欧美精品自拍偷拍| fc2在线中文字幕| 欧美亚洲第一页| 日韩在线亚洲| 日韩视频在线免费播放| 日本特黄久久久高潮| 欧类av怡春院| 亚洲主播在线观看| 国产乱淫a∨片免费视频| 亚洲人成电影网| 在线看片福利| 国产在线精品一区| 韩日精品视频| 欧美图片自拍偷拍| 亚洲人成亚洲人成在线观看图片| 最近中文字幕在线观看视频| 亚洲片av在线| 涩涩视频网站在线观看| 国产精品麻豆免费版| 欧美区亚洲区| 麻豆av免费看| 亚洲影院理伦片| 国产黄a三级三级三级| 久久激情视频久久| 99亚洲男女激情在线观看| 亚洲不卡1区| 久久黄色网页| 国产免费无遮挡吸奶头视频| 色婷婷精品久久二区二区蜜臂av| 亚洲色大成网站www| 91精品国产网站| 日韩av资源网| 激情五月宗合网| www国产亚洲精品久久麻豆| 在线观看亚洲欧美| 日韩电影中文字幕av| 亚洲十八**毛片| 欧美一级二级三级九九九| 日韩电影免费在线| 99热6这里只有精品| 91精品视频网| 国产羞羞视频在线播放| 好看的日韩精品| 久久精品人人| 中文字幕在线观看免费高清| 欧美日韩国产123区| 超鹏97在线| 国产一区二区在线观看免费播放| 先锋影音国产一区| 国产精品20p| 在线不卡一区二区| 手机av在线播放| 韩日午夜在线资源一区二区 | 欧美国产日韩一区二区三区| 中文字幕日韩在线| 日韩av新片网| 久久亚洲二区三区| 中文在线资源天堂| 久久天天躁狠狠躁夜夜av| 99久热这里只有精品视频免费观看| www.av毛片| 国产日韩精品一区二区浪潮av | 成人自拍av| 日韩 欧美 自拍| a级高清视频欧美日韩| 色老头在线视频| 久久精品国产成人| 欧美色资源站| 国产无遮挡猛进猛出免费软件 | 亚洲精品乱码日韩| 999久久欧美人妻一区二区| 99re8在线精品视频免费播放| 国产第一页在线观看| 久久成人一区二区| 欧美日韩一本| 精品久久久99| 黑人精品xxx一区| 巨大荫蒂视频欧美另类大| 国产日韩欧美精品| 久久精品国产免费看久久精品| 豆国产97在线 | 亚洲| 中文字幕亚洲欧美一区二区三区| 天堂精品在线视频| 国产wwwxx|