您好、欢迎来到现金彩票网!
当前位置:欢乐棋牌 > 边集合 >

图论(1):有向无环图的定义及应用

发布时间:2019-07-16 14:41 来源:未知 编辑:admin

  ),过程中碰到了一些问题,于是花时间研究了一下其具体实现。其核心源码是,本篇文章内容如标题所示暂不去分析其整体的运行机制,而是打算抽出其中一个点——

  这里先给出结论:View之间的依赖关系恰好是有向图(child指向dependency的一条有向无权边)的一个具体应用(具体还要检测是否有环),CoordinatorLayout采用邻接表(SimpleArrayMapT, ArrayListT)的数据结构构建有向图的依赖关系,并将图的拓扑排序结果作为View的处理(measure、layout等)顺序。因此这里也刚好有助于我们复习一下大学学过的核心课程《数据结构》中关于图的相关内容。

  图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

  图中某个节点与其他节点的直连边条数称为该节点的度。有向图中,指向其他节点的边成为出度,被其他节点指向的边称为入度。

  如果在有向图中,无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。

  拓扑排序是将图中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

  我们来看看CoordinatorLayout和Behavior这一套机制主要是为了实现什么功能。个人理解是谷歌弄的这个机制为了简化开发者在通过自定义View实现比以往更复杂的交互时的工作量(抽象)和工作难度(仅需实现自己关注的功能)。比如:如果自定义一个能解决父-子View之间的事件冲突的View结构时,必须要重写父View和子View的onInterceptTouchEvent()和onTouchEvent()接口以及其他必要接口,然后分别处理事件拦截,且这个自定义View很难重用起来(必须两个View配合行动)。但是当Behavior出现后,触摸事件、滑动冲突、依赖关系等工作都被CoordinatorLayout进行抽象完成了,仅抛出一个Behavior的接口让开发者自定义感兴趣的部分即可。Behavior机制通常用来实现如下三种功能:

  如果要实现这样一个效果:滑动A-View时,让另一个B-View也能跟着滑动。按照传统的做法,首先我们需要重新自定义一个父View来处理滑动事件来,然后在滑动A-View时,根据A-View的位置来设置B-View的translation值实现(实现较繁琐),如果滑动的View是一个列表呢,比如RecyclerView,这里的操作又该如何进行。但是有了Behavior之后,仅需要非常简单的实现的两个接口就能达到这个效果了,如下所示:

  具体的原理就是CoordinatorLayout在滑动之初(onMeasure()函数中)就通过layoutDependsOn()回调确定了View两两之间的依赖关系(通过双重for循环遍历,因此layoutDependsOn中最好不要写复杂逻辑,仅需简单确定是否是依赖View),所以当依赖View发生变化时,自然就能再回调回来告诉被依赖View发生了变化。

  这里的mDependencySortedChildren存放的就是有向图的拓扑排序结果(依赖的节点排在列表前面,被依赖的节点排在列表后面);mChildDag是整个有向图数据结构,触发onDependentViewChanged()回调时就是通过mChildDag非常简单找到被依赖View列表的(时间复杂度为O(1))。这么做是为了在dependency发生变化时,只需通知它的被依赖view即可,而其他与之无关的view则不应该回调(因为没有依赖关系),后面还列出了类中定义的获取依赖view列表和被依赖view列表的接口也是如此,它的实现如下实现如下:

  到这里,有向图的一个实际应用场景就介绍完了。接下来我们来看看源码中有向无环图(DirectedAcyclicGraphT)的具体实现,总体来讲就是围绕下面这一个邻接表的操作:

  SimpleArrayMap是一个android自己实现的一个Map,它的key(T)为图中的每一个节点对象,value(ArrayListT)是指向key节点的节点,即key节点的入度边。它的方法addNode()、addEdge()就是将这些关系存入到这个邻接表中,然后再通过它获取其入度和出度(出度需要遍历整个邻接表才能获取);函数getSortedList()调用深度优先的递归函数dfs()实现其拓扑排序。

  图中标有‘A’、‘B’、‘C’、‘D’、‘E’、‘F’、‘G’、‘H’、‘I’、‘J’、‘K’这11个节点。由于SimpleArrayMap中key的最终顺序会自动按升序排列(非插入的顺序),为了结果比较明显特意将图中的节点打乱。

  虽然此处图的数据结构使用了泛型,却并不通用(仅可以用来表示有向、无权图,且其他运算操作缺失)。由于JDK的集合类中并没有提供表示图数据结构的相关类,以至于图在开发人员间其实并不普及,开发过程中很少借助图去实现某些特定功能。于是,图就像神话般一样,仅仅出现在相关面试宝典里,以及偶尔回忆其概念的程序员心中。

  在网上找了下实现图通用的数据结构的开源库,也很少看到评星很高的,最好找到下载了很久没有浏览过的谷歌开源库guava,最近23版本增加了图数据结构,而且实现android版本了,于是想接下来借助它来梳理图的相关知识。

  CoordinatorLayout 终于到这个控件了,其实我的内心是忐忑的,因为我其实一直想要深入的理解 CoordinatorLayout+Behavior的原理,但是又苦于太难懂了,以前也零零碎碎研究过几次,最后都以失败告终。这次是没办法,MaterialDesign ...

  概述 Google官方对它的概述如下: 大概的意思也就是说:CoordinatorLayout 是一个增强版的FrameLayout。(继承自ViewGroup) 主要有两个用途:1、作为应用的顶层视图2、作为一个可以指定子views之间相互作用的容器,通过给Coordin...

  今天早盘消息:西部战区联合参谋部作战局副局长张水利7日就印度无人飞行器侵入中方领空并坠毁发表谈话。他说,近日,一架印度无人飞行器侵入中方领空并坠毁。印方此举侵犯了中国领土主权,我们对此表示强烈不满和反对。我们将扎实履行职责使命,坚决捍卫国家主权安全。 今天早盘看到军工异动,...

  为了排除毒素一身轻松,很多人都会在起床后喝一杯水。 而且很多人都知道一句话:“每天饮用八杯水,身体健康皮肤美”。这是提倡每天要多喝水,水可以帮助代谢有利于减肥、排除体内毒素,对抗便秘、疲劳和皮肤干燥造成的衰老等等。 但很多人不知道的是,有一些人的脸色发黄、皮肤松弛下垂、小肚...

  初一走春拜拜,一家人 到寺庙走走,祈求平安, 还能做什么呢? 谢谢老公找好玩的APP, 謝謝女兒跟婆婆加入一起玩, 我們祖孫三代是不是很可愛呀? #感覺是好玩又開心一整年的好預兆 #100天感恩行動

  今天去幼儿园参加孩子毕业之前的最后一次家长会,收获了意外的惊喜,so来说说感受吧。 首先,我和别的妈妈们对幼儿园老师们的创意和精心策划给予10086个赞。这种提前背着孩子妈给孩子爸打电话要准备礼物和信的密谋,在今天(2017.3.8)给了到场的每一位妈妈一个大大的惊喜,...

http://vuagiamgia.com/bianjihe/317.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有