-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlocal-search.xml
250 lines (120 loc) · 47.2 KB
/
local-search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>2022-Efficient_Shortest_Path_Counting_on_Large_Road_Networks</title>
<link href="/2023/01/02/2022-Efficient-Shortest-Path-Counting-on-Large-Road-Networks/"/>
<url>/2023/01/02/2022-Efficient-Shortest-Path-Counting-on-Large-Road-Networks/</url>
<content type="html"><![CDATA[<p>研究问题:在大型路径网络中快速处理两个顶点间最短路径数的询问</p><p>研究方法:</p><p>主要是引入了一个新型的数据结构,实现对应的Tree Decomposition</p><p>同时利用TL-index,快速处理查询问题</p><p>下面是ppt讲解部分:</p><div class="row"> <embed src="/pdf/20221029.pdf" width="100%" height="550" type="application/pdf"></div><p>最后是补充一下原论文:</p><div class="row"> <embed src="/pdf/2022-9-VLDB-Efficient_Shortest_Path_Counting_on_Large_Road_Networks.pdf" width="100%" height="550" type="application/pdf"></div>]]></content>
<categories>
<category>常规图问题</category>
<category>最短路计数</category>
</categories>
<tags>
<tag>最短路径数</tag>
</tags>
</entry>
<entry>
<title>2017-Maintaining Densest Subsets Efficiently in Evolving Hypergraphs</title>
<link href="/2023/01/02/Maintaining-Densest-Subsets-Efficiently-in-Evolving-Hypergraphs/"/>
<url>/2023/01/02/Maintaining-Densest-Subsets-Efficiently-in-Evolving-Hypergraphs/</url>
<content type="html"><![CDATA[<p>研究问题:超图下的密度子图提取及其动态维护</p><p>1) 静态超图的准确算法:</p><p>①类比于普通图,用网络流建图即可</p><p>②用线性规划求解</p><p>2)静态超图的近似算法:</p><p>①r-近似算法 直接剥离权重最小的点即可</p><p>②$r(1+\epsilon)$ 近似算法 剥离的是一个集合,为后续任务服务</p><p>3) 动态超图只能近似维护</p><p>① 只维护插入</p><p>② 插入和删除一起维护</p><p>这里只维护插入会比删除要简单的多,因此会分开讨论</p><p>下面是ppt讲解部分:</p><div class="row"> <embed src="/pdf/20221114.pdf" width="100%" height="550" type="application/pdf"></div><p>最后是补充一下原论文:</p><div class="row"> <embed src="/pdf/2017-11-Maintaining_Densest_Subsets_Efficiently_in_Evolving.pdf" width="100%" height="550" type="application/pdf"></div>]]></content>
<categories>
<category>动态图维护</category>
<category>密度维护</category>
<category>超图问题</category>
</categories>
<tags>
<tag>超图</tag>
<tag>动态维护</tag>
</tags>
</entry>
<entry>
<title>2012-VLDB-Dense Subgraph Maintenance under Streaming Edge Weight Updates for Real-time Story Identification</title>
<link href="/2023/01/02/2012-VLDB-Dense-Subgraph-Maintenance-under-Streaming-Edge-Weight-Updates-for-Real-time-Story-Identification/"/>
<url>/2023/01/02/2012-VLDB-Dense-Subgraph-Maintenance-under-Streaming-Edge-Weight-Updates-for-Real-time-Story-Identification/</url>
<content type="html"><![CDATA[<p>原论文放在最后了</p><p>PPT部分:</p><div class="row"> <embed src="/pdf/20221107.pdf" width="100%" height="550" type="application/pdf"></div><p>研究问题: 最密子图的动态维护,这个动态表示的是一个流式的边权更新情况</p><p>实际问题: 文章将这个问题与现实中的实时故事识别匹配在一起了</p><p>原论文部分:</p><div class="row"> <embed src="/pdf/Dense_Subgraph_Maintenance_under_Streaming_Edge.pdf" width="100%" height="550" type="application/pdf"></div>]]></content>
<categories>
<category>动态图维护</category>
<category>最密子图维护</category>
</categories>
<tags>
<tag>最密子图维护</tag>
<tag>流式更新</tag>
<tag>图密度维护</tag>
</tags>
</entry>
<entry>
<title>2021-hypercore Maintenance in Dynamic Hypergraphs</title>
<link href="/2022/12/31/2021-hypercore-Maintenance-in-Dynamic-Hypergraphs/"/>
<url>/2022/12/31/2021-hypercore-Maintenance-in-Dynamic-Hypergraphs/</url>
<content type="html"><![CDATA[<p>研究问题:动态超图的超核维护</p><ol><li><p>定义部分:</p><p>1) 超图:一条边可以连接多个顶点</p><p><img src="/images/image-20221231162443509.png" alt="image-20221231162443509"></p></li></ol><p> 2)超核:和k-core的定义是一样的,只不过引入到了超图汇总</p><ol start="2"><li><p>研究思路:</p><p>1) 证明了单边插入和删除只会使得超核数量增加1或减少1</p><p>2) 为超边提出了核的定义,同时提出了precore的定义,但两者都是为了实际问题服务</p><p>3) 提出了支持度的定义</p></li><li><p>定义部分:</p><p>1) 顶点和边的超核数定义:</p><p><img src="/images/image-20221231162926475.png" alt="image-20221231162926475"></p><p>2) pre-core定义:新插入超边的最初超核数</p><p><img src="/images/image-20221231163025758.png" alt="image-20221231163025758"></p></li><li><p>证明部分:</p><p>1) 证明了插入超边和删除超边,只会对应使得顶点和边的超核数最多变化1</p><p>2) 证明什么情况下,顶点和边的超核数会变化</p><p>插入时,只有$coreV(v)=\overline{coreE}(e_0)$ 时,顶点才可能增加超核数</p><p> 只有$coreE(e)=\overline{coreE}(e_0)$时,边才可能增加超核数</p><p>同时,上面的顶点和超边必须在一条通路,且这个通路的顶点和边都是超核数满足上述要求,且起点为插入边$e_0$</p><p>删除时,只有$coreV(v)={coreE}(e_0)$时,顶点才可能减少超核数</p><p> 只有$coreE(e)={coreE}(e_0)$时,边才可能减少超核数</p><p>同时,上面的顶点和超边必须在一条通路,且这个通路的顶点和边都是超核数满足上述要求,且起点为删 除的边$e_0$</p></li><li><p>引入支持度的定义:</p><p>1)其定义如下:</p><p>本质是计算顶点中有多少条边能满足其更改core值</p><p><img src="/images/image-20221231163821567.png" alt="image-20221231163821567"></p><p>2)根据sup的定义来剪枝</p><p>只有满足下面条件的顶点才能有core值的变化</p><p><img src="/images/image-20221231163923474.png" alt="image-20221231163923474"></p></li><li><p>整体算法:</p><p><img src="/images/image-20221231164014778.png" alt="image-20221231164014778"></p><p><img src="/images/image-20221231164029161.png" alt="image-20221231164029161"></p><p>由于在超核维护前应该还有一个静态算法,来在O(m)的时间复杂度内计算出原始图的超核数量:</p><p>本质是peel算法,但是多了一个超边的超核数</p><p><img src="/images/image-20221231164112483.png" alt="image-20221231164112483"></p><p>时间复杂度:</p><p><img src="/images/image-20221231164155657.png" alt="image-20221231164155657"></p></li><li><p>实验部分:</p><p>1)数据集和表现:</p><p>分为正常数据集和时序数据集</p><p>超图的构造和常规图是不同的,因为其超边需要连接多个顶点</p><p><img src="/images/image-20221231164235955.png" alt="image-20221231164235955"></p></li></ol><p>ppt整理:</p><div class="row"> <embed src="/pdf/1.pdf" width="100%" height="550" type="application/pdf"></div><p>原论文:</p><div class="row"> <embed src="/pdf/2021-Hypercore_Maintenance_in_Dynamic_Hypergraphs.pdf" width="100%" height="550" type="application/pdf"></div>]]></content>
<categories>
<category>动态图维护</category>
<category>k-core</category>
<category>超图维护</category>
</categories>
<tags>
<tag>k-core</tag>
<tag>超图</tag>
<tag>动态图维护</tag>
</tags>
</entry>
<entry>
<title>2022-Exploring Truss Maintenance in Fully Dynamic Graphs:A Mixed Structure Based Approach</title>
<link href="/2022/12/31/2022-Exploring-Truss-Maintenance-in-Fully-Dynamic-Graphs-A-Mixed-Structure-Based-Approach/"/>
<url>/2022/12/31/2022-Exploring-Truss-Maintenance-in-Fully-Dynamic-Graphs-A-Mixed-Structure-Based-Approach/</url>
<content type="html"><![CDATA[<p>研究问题:动态图中的k-truss维护</p><p>研究方法:</p><p>1) 其考虑了同时插入一个混合结构的情况,也就是可以支持多边插入和删除</p><p>2) 首先研究的是如何构建这个混合结构</p><p>3) 其次是对于这样的混合结构的插入和删除,如何进行有效的维护</p><p>下面是ppt讲解部分:</p><div class="row"> <embed src="/pdf/20221107.pdf" width="100%" height="550" type="application/pdf"></div><p>最后是补充一下原论文:</p><div class="row"> <embed src="/pdf/Exploring_Truss_Maintenance_in_Fully_Dynamic_Graphs_A_Mixed_Structure-Based_Approach.pdf" width="100%" height="550" type="application/pdf"></div>]]></content>
<categories>
<category>动态图维护</category>
<category>k-truss维护</category>
</categories>
<tags>
<tag>k-truss</tag>
</tags>
</entry>
<entry>
<title>2019-Enumerating k-Vertex Connected Components in Large Graphs</title>
<link href="/2022/12/30/2019-Enumerating-k-Vertex-Connected-Components-in-Large-Graphs/"/>
<url>/2022/12/30/2019-Enumerating-k-Vertex-Connected-Components-in-Large-Graphs/</url>
<content type="html"><![CDATA[<div class="row"> <embed src="/pdf/20221230.pdf" width="100%" height="550" type="application/pdf"></div><p>这篇论文是围绕k-VCC的求解</p><p>一、Abstract部分:</p><p>1)研究问题:给定k,求出图中的所有K-VCC</p><p>2)k-VCC特性:高耦合、高鲁棒性、子图重叠性</p><p>3) 方法: </p><p>① 证明了分割问题的上界——可以用多项式时间来进行解决问题</p><p>② 提出了两个优化策略:neighbor sweep 和 group sweep </p><p>4)结果:</p><p> 在大型数据集上证明了方法的高效性</p><p> 有数量级的提升</p><p>二、Introduction部分:</p><ol><li><p>k-VCC特性:</p><p>1) G的顶点连通性不大于边连通性和最小度</p><p>2) 直径较小</p><p>3) 子图的重叠性不超过n/2,其中n为顶点数</p></li><li><p>问题和现有方法:</p><p>1) 给定G和指定的k,求出所有的k-VCC</p><p>2) 现有方法:</p><p>递归的找到一个顶点小于k的顶点切割,并对图进行分区</p><p>一个顶点对的最小割是他们之间顶点独立路径的数量</p></li><li><p>本文方法:</p><p>1) 证明了k-VCC的数量不超过n/2 —— 因此可以用多项式时间来完成算法</p><p>2) Neighbor Sweep: 对一些顶点进行属性划分;一旦其被测试或swept,则对其所有邻居sweep;为顶点存一个值,结束测试为其周围邻居增加值,超过阈值则sweep掉</p><p>3) Group Sweep:将顶点划分为不相交的组,以组为单位进行上面的测试</p></li><li><p>贡献:</p><p>(1)一个多项式时间的算法</p><p>(2)两个有效的剪枝策略</p><p>(3)在实际问题的有效性</p></li></ol><p>三、前置知识</p><ol><li><p>定义1 : 顶点连通性k(G): 为移除最小数量的顶点导致原图不相连或成为平凡图</p></li><li><p>定义2: k-vertex-connected: (1) |V(G)|>k (2) 删除任意k-1个顶点后原图仍连通</p></li><li><p>定义3: k-vertex-connected-component </p><p>(1) g是k-vertex-connected (2) g is maximal</p></li></ol><p>四、分割的基础框架</p><ol><li><p>将原图分为t个连通块</p></li><li><p>对每个连通块都用GLOBAL-CUT来找点割集:</p><p>1)若点割集为空,则连通块本身就是一个VCC</p><p>2) 否则的话,kVCC将原图根据点割集分开,并将每一个分割后的子连通块再次递归调用KVCC-ENUM</p></li></ol><p><img src="/images/image-20221230191332813.png" alt="image-20221230191332813"></p><p>五、Basic Solution</p><ol><li><p>顶点割集计算:</p><p>Globla-cut的目的是计算出一个少于k个顶点的点割集</p><p>1) 先做一个sparse certification 的优化:将G提取其只有O(k.n)条边的k-vertex-connected连通的子图</p><p>2) 下面则分割根据u是否属于S(割集)进行分类讨论:</p><p>4-6行为不属于的情况,7-10 为属于的情况</p><p><img src="/images/image-20221230194735795.png" alt="image-20221230194735795"></p><p><img src="/images/image-20221230194755050.png" alt="image-20221230194755050"></p><p>具体需要结合上面的两个引理来进行理解,而LOC-Cut将原有的点拆点成为n+2m条边,2n个点的图,然后求u到v的最大流,即为其local connectivity</p><p><img src="/images/image-20221230194007930.png" alt="image-20221230194007930"></p></li></ol><p><img src="/images/image-20221230192156538.png" alt="image-20221230192156538"></p><p> 3) 整体时间度分析比较复杂:<img src="/images/image-20221230194918361.png" alt="image-20221230194918361"></p><p>六、搜索剪枝</p><p>A. neighbor Sweep</p><ol><li>side-vertex: u不属于一个所含顶点小于k的割集S</li><li>side-vertex u是可以传导k-vetex连通性的,进而减少了局部测试</li></ol><p><img src="/images/image-20221230195504193.png" alt="image-20221230195504193"></p><p> 而其具体的求法则根据上面的定理得到</p><ol start="3"><li><p>因为满足上面条件的为 strong-side-vertex,而这些点是可以传递k-vertex-connectivity,因此可以进行剪枝</p></li><li><p>其还可以利用Vertex Deposit进行维护</p><p>1) 若v可以和u的k个邻居都有k-vertex-connected,u和v也是k-vertex-connected的</p><p>2) 因此为每个顶点存一个deposit(v),表示其邻居节点中满足1)的条件个数的点</p></li></ol><p>B. Group Sweep</p><ol><li><p>首先是如何构造一个side-group</p><p>side-group定义如下:</p><p><img src="/images/image-20221231154307216.png" alt="image-20221231154307216"></p><p><img src="/images/image-20221231154236084.png" alt="image-20221231154236084"></p></li><li><p>group sweep rule:</p><p>side-group 可以有以下的作用:</p><p>换句话就是group内一个side-vertex完成了测试,整个gorup的k-vertex-connected 性质就相同了</p><p><img src="/images/image-20221231154516085.png" alt="image-20221231154516085"></p></li></ol><p> 更一般的方法是,测试group里面是否有k个点均符合条件,并用deposit记录:</p><p> <img src="/images/image-20221231154819629.png" alt="image-20221231154819629"></p><p>整体算法:</p><p><img src="/images/image-20221231155050998.png" alt="image-20221231155050998"></p><p><img src="/images/image-20221231155106047.png" alt="image-20221231155106047"></p>]]></content>
<categories>
<category>图论</category>
<category>k-VCC</category>
</categories>
<tags>
<tag>k-VCC</tag>
</tags>
</entry>
<entry>
<title>2018-Cohesive Subgraph Computation over Large Sparse Graphs</title>
<link href="/2022/12/30/2018-Cohesive-Subgraph-Computation-over-Large-Sparse-Graphs/"/>
<url>/2022/12/30/2018-Cohesive-Subgraph-Computation-over-Large-Sparse-Graphs/</url>
<content type="html"><![CDATA[<p>本文是对该书的内容进行简单整理,全文过长,详细内容在PPT内,其中对各个章节的核心内容和算法将在下方进行简单说明分类。</p><p>第一章:</p><p>基础知识介绍:包括图的基本术语,相应数据集;以及相应的图算法的综述</p><p>第二章:</p><p>数据结构的介绍,皆为用来存储对应图结构的:</p><ol><li><p>Linked List-Based Linear Heap</p><p><img src="/images/image-20221230093928389.png" alt="image-20221230093928389"></p><p>其基本结构很简单,主要是用了双向链表的结构</p><p>•<strong>heads</strong>:the heads of doubly linked lists</p><p>•<strong>pres and nexts</strong>: the information of doubly linked lists</p><p>•<strong>keys:</strong> the key values of all elements</p></li></ol><p> <img src="/images/image-20221230094449746.png" alt="image-20221230094449746"></p><p> 对应支持的操作如上所示</p><ol start="2"><li> Array-based Linear Heap</li></ol><p> <img src="/images/image-20221230094557259.png" alt="image-20221230094557259"></p><p> 其转换成为数组的结构了,可以理解为按照key_value来排序的,有点像桶排序的感觉</p><p> •<strong>ids</strong>: all elements with the same key value are stored consecutively in an array ids</p><p> •<strong>heads</strong>: the start position of the elements for each distinct key value is stored in heads</p><p> •<strong>keys:</strong> the key values of all elements</p><p> •<strong>rids</strong>: the position of elements in ids are stored in an array rids (i.e., rids[ids[<em>i</em>]]=<em>i</em>).</p><p> <img src="/images/image-20221230095112297.png" alt="image-20221230095112297"></p><p> 对应支持的操作如上</p><ol start="3"><li> LazyLinearHeap</li></ol><p> 相比较前面的链表结构,其主要是改成了单向的链表,且在维护元素更改时,会用懒标记</p><p> <img src="/images/image-20221230095030201.png" alt="image-20221230095030201"></p><p>第三章</p><p>主要是围绕着k-core的相关内容</p><ol><li><p>首先是k-core的定义部分:</p><p>定义部分包括:</p><p>1) k-core,如下图</p><p><img src="/images/image-20221230095308106.png" alt="image-20221230095308106"></p><p>2)顶点的core number,这也是通常k-core维护中维护的内容</p><p>3)degenerarcy $\delta(G)$:表示的是G中每个子图每个顶点的度最多为k</p><p>4) arboricity $\alpha(G)$: 表示的是G被分为最少的边不交的生成树的个数</p></li><li><p>k-core计算:</p><p>1)Peel 算法:本质是逐步剥离当前core值最小的顶点,对应会根据剥离顺序得到 degeneracy ordering </p><p>2)k-core计算:找到对应的子图</p><p>和peel算法类似,无非是将对应的子图进行了存储</p><p>3)Core Hierarchy Tree:</p><p>定义时,增加了连通k-core的定义,这样使得层次树中含有连通性信息,建立时需要用到并查集的结构</p><p><img src="/images/image-20221230095903173.png" alt="image-20221230095903173"></p><p>当前针对于这个问题,已经存在了动态的维护方法,对应的分布式算法也有提出。</p><p>4)Core Spanning Tree:</p><p><img src="/images/image-20221230100135458.png" alt="image-20221230100135458"></p><p>$G_w$生成方式是参考最大生成树来的,其中每一条连通边的权值$w(u,v)$被定义为 $min{core(u),core(v)}$</p><p>该问题意义:</p><p>①同时保留了k-core信息和对应的连通性信息,我们想提取最大的连通k-core时,只要保留最大的core值相连的边即可</p><p>②其可以用来做密度的近似,同样是用上面的办法,只保留最大的core,但是其中最后一个顶点需要重复加一遍前面的core值,然后最后将累计的权值除二再除以顶点数</p><p><img src="/images/image-20221230103640850.png" alt="image-20221230103640850"></p></li><li><p>其他情况下的k-core分解</p><p>1) An h-index-based Local Algorithm</p><p>定义了一个h-index ,然后基于这个定义来分解k-core</p><p>2)I/O- Efficient Core Decomposition</p><p>基于IO加速的分解,其实就是一边读写一边做操作,少了一些邻居信息</p></li></ol><p>第四章 最密子图计算</p><ol><li><p>定义部分:</p><p>$\rho(g)= \frac{|E(g)|}{|V(g)|}= \frac{d_{avg}(g)}{2}$</p><p>问题通常分为近似问题和精确问题</p></li><li><p>近似问题:</p><p>1)2-Approximation 算法</p><p>直接按照degenerarcy ordering 剥离即可</p><p>2) A straming $2(1+\epsilon)$- Approxiamtion 算法</p><p>利用当前度来计算,每次剥离 $d(v)<= 2*(1+\epsilon) * \rho(S)$ 的顶点</p><p>3) 精确算法:</p><p>密度测试——利用网络流+二分的算法,合理建图来判断密度区间</p></li></ol><p>第五章 高层结构的核分解</p><ol><li><p>3-clique(三角形分解):</p><p><img src="/images/image-20221230105417004.png" alt="image-20221230105417004"></p><p>本质很像暴力枚举,就是枚举顶点v,然后枚举v的邻居w,再枚举w的邻居u来判断是否和v相连</p><p>TriE Algorithm:</p><p>和上面算法很像,区别就是换了枚举v的次序,并且将原图变成了有向图</p></li><li><p>k-clique 枚举算法:</p><p>本质和前面一样啊,就是dfs多了几轮</p><p><img src="/images/image-20221230105745179.png" alt="image-20221230105745179"></p><p>k-clique-oriented: 则是基于了TriE的一个改进</p></li><li><p>k-truss:</p><p>k-truss是基于边来定义的,其定义了每条边的supp支持度,也就是其参与构成三角形的个数</p><p>然后k-truss则是一个子图中每条边都能参与构成至少k-2个三角形</p><p>性质:</p><p>1)每个k-truss都是(k-1)truss的子图</p><p>2) 每个k-truss都是(k+1) core 的子图</p><p>对应有每个边的truss number 的定义:表明的是含有该边的最大的k-truss</p><p>计算方式:</p><p>PeelTruss:</p><p><img src="/images/image-20221230110758635.png" alt="image-20221230110758635"></p><p>剥离过程中涉及到三角形的计算,肯定复杂度要大于peelcore</p></li><li><p>s-clique support: r-clique中含有s-clique的数量</p><p>对应的s-clique connected : 两个r-clique都被含在s-clique中包含对应的clique</p><p> k-(r,s)-nucleaus 的定义:</p><p>1) 任意r-clique 其s-clique的support 一定大于等于k</p><p>2) 任意的两个r-clique在s-clique中一定是连通的</p><p><img src="/images/image-20221230111712569.png" alt="image-20221230111712569"></p></li></ol><p> 计算:也是用的peelNucleus</p><p> <img src="/images/image-20221230111815277.png" alt="image-20221230111815277"></p><ol start="5"><li><p>k-clique density</p><p>$\rho_k(g) = \frac{c_k(g)}{|V(g)|}, c_k(g)是g中k-cliques的数量$ </p><p>其计算密度对应也是近似算法和精确算法</p></li></ol><p>第六章 边连通性分解</p><ol><li><p>K-ECC 删除任意k-1条边以后仍然连通</p><p><img src="/images/image-20221230112307094.png" alt="image-20221230112307094"></p><p>计算方式KECC:</p><p><img src="/images/image-20221230112912147.png" alt="image-20221230112912147"></p><p>这里面重点为如何分割</p><p>1) 两路分割:</p><p><img src="/images/image-20221230113030056.png" alt="image-20221230113030056"></p><p>其中计算最小割是通过下面的构造</p><p><img src="/images/image-20221230113208285.png" alt="image-20221230113208285"></p><p><img src="/images/image-20221230113242959.png" alt="image-20221230113242959"></p><p>2) 多路分割</p><p><img src="/images/image-20221230113341352.png" alt="image-20221230113341352"></p><p><img src="/images/image-20221230113354418.png" alt="image-20221230113354418"></p></li></ol><div class="row"> <embed src="/pdf/20221005.pdf" width="100%" height="550" type="application/pdf"></div>]]></content>
<categories>
<category>图论</category>
</categories>
<tags>
<tag>cohesive graphs</tag>
</tags>
</entry>
<entry>
<title>2021-Hierarchical Core Maintenance on Large Dynamic Graphs</title>
<link href="/2022/12/28/2021-Hierarchical-Core-Maintenance-on-Large-Dynamic-Graphs/"/>
<url>/2022/12/28/2021-Hierarchical-Core-Maintenance-on-Large-Dynamic-Graphs/</url>
<content type="html"><![CDATA[<p>第一次组会讲的内容,论文的核心部分都放在下面的ppt中了,根据PPT做一些补充。</p><p>发表:VLDB2021</p><p>研究问题:动态图下的层次化核维护,即k-core的层次化结构树</p><p><em><strong>*Page3:*</strong></em></p><p><img src="/images/image-20221228214932163.png" alt="image-20221228214932163"></p><p>如下图所示,也如PPT中图3所示,每一棵Core Hierarchy Tree有三部分构成:</p><p>Node:$C_i^k$ 表示的对于每个k-core,其中间至少有一个顶点其core值为k的话,则这些$coreness=k$ 的顶点将会被命名为$n_1$ , 其代表的是一个顶点的集合,$n_1$也就是我们树上的节点</p><p>Edge: 树上的边表示为树上两个顶点$n_1$和$n_2$ ,其分别对应k1-core和k2-core,其二者在树中有边需要满足对应的三个条件</p><ol><li>$ k_1 < k_2 $</li></ol><ol start="2"><li>$C_j^{k_2}$ 含于$ C_i^{k_1}$</li><li>不存在一个这样的$k_1<k’<k_2$ 使得$k’$ 可以成为$k_2$的父节点</li></ol><p>Root: 最后则是root记录孤立顶点,并将其对应和最顶层节点建立边的关联</p><p><em><strong>*Page4:*</strong></em></p><p>这是一个例子,其中$v_20,v_21,v_22$的coreness都是2,所以去掉其以后原图成为一个连通的3-core,去掉v19则是一个连通的4-core,去掉右下方的$v_{12}-v_{17}$则不再连通,而是分别两个单独的5-core,其分别标记为$C_5^1,C_5^2$</p><p><em><strong>*Page5:*</strong></em></p><p>值得注意的是,这里删掉了$(v_2,v_{17})$这条边以后,原来的3-core结构则需要拆分成两个连通3-core,分别是$v_6-v_{17}$和$v_0-v_5,v_{18} v_{19}$,这里可以注意到$v_6-v_{11}$的父节点是$v_{17}$,而没有4-core这一层次上的节点</p><p><em><strong>*Page6:*</strong></em></p><p>首先是如何静态的构建一个k-core-hierarchy</p><p>输入是图,以及其degeneracy order的seq和顶点的coreness,输出则是对应的层次化树。</p><p>首先是声明一个空树,先为每个点在树中建立一个对应节点,对应权重为coreu。</p><p><em><strong>*Page7:*</strong></em></p><p>然后在seq中逆序遍历所有顶点,对每个顶点遍历其所有的邻居,若邻居之前没有在之前被访问,且其不属于同一个并查集。</p><p>则若其权重相同则将树中节点合并,否则指定小权重的为大权重的父亲,合并二者所在的并查集。</p><p>这个算法可以在O(m)的时间复杂度内生成一棵k-core-层次树</p><p><em><strong>*Page8:*</strong></em></p><p>这里引用了2017年的一篇论文,其在动态维护k-core上有一个很好的效果。</p><p>这篇论文大致是他给定每个点一个k-order,同一个$O_i$内的表示其core值均为i,但是其同一个$O_i$内的顺序是根据图k-core分解的动态算法得到的,也就是其在k-core分解中先被移除,其order就会更小。就像这个图分别维护了1-core,2-core,3-core.</p><p>然后如果要插入一条边,只需要在$O_k$中顺序的遍历,并根据他给的两个候选集条件来判断是否需要更新即可。然后同时需要维护这样的k-order序列。</p><p><em><strong>*Page9:*</strong></em></p><p>下面是算法部分,首先是处理插入的情况,单边插入下,当插入一条$(x_1, x_2)$的边时,我们取其中$x_1$和$x_2$更小的core值,设为K。</p><p>然后我们根据core值更新,可以总结出以下规律:</p><p>1)设定所有core值增加的顶点集为V<em>, 则V</em>中所有顶点的core值在更新前均为K,更新后均为K+1</p><p>2)无论插入两点的core值是否相等,可以得到V*的导出子图在G中一定连通。</p><p>这是因为我们知道插入一条边$(x_1, x_2)$时,只有与$x_1$连通且存在一条通路其上面的core值都为K时,这个顶点的core值才有可能会更新,而只有这条通路上的顶点均依次更新的时候,这个顶点的core值才一定会更新。因此这样就形成了一个连通图。</p><p>对x1=x2的core值时这个也是满足的。</p><p><em><strong>*Page10:*</strong></em></p><p>而对于k-core层次树来说,</p><p>1)对于core值大于K+1的,其在插入边后,每一个连通的k-core $C_i^k$其中的点都不会有core值的变化;同时也不会有新的点加入到这个集合中,因此其在k-core层次树上不会更新</p><p>2)对于k<= K 的 有两种情况 第一种是连通k-core $C_i^k$中包含了x1或x2中的一个,那么假设x1属于,$C_i^k$插入后会和x2所在的k-core连通</p><p>b) 或者若k=K ,则V*中的顶点的core值都会从K增加到K+1,这样的话,$C_i^k$中可能有部分顶点会更新到中$C_i^{k+1}$去</p><p>3) 第三种情况是,k=K+1,这样的话在V*中的顶点可能会将K+1层次内的k-core进行连接。</p><p><em><strong>*Page11:*</strong></em></p><p>首先$G_0[n_0]$表示的是在k-core层次树上,以$n_0$为根的子树的导出子图。</p><p>这个定理的意思是若$n_0$的子树导出子图与x1和x2所在的k-core没有交集,那么$n_0$所在的分支在k-core层次树上也不会有相应的更新。</p><p>证明是根据k-core分解的定义来的:让$k_0=core(n_0)$,由于更新k值更新的节点一定在$C(x_1) \cup C(x_2)$所在的导出子图中,而两者又没有交集,因此分解k0 的时候分解情况不变</p><p>这样的话,我们在更新k-core层次树的时候,只需要更新和x1,x2有关的子树部分即可。</p><p><em><strong>*Page12:*</strong></em></p><p>根据上述分析,首先我们先处理第二种情况,如何对k-core层次树中的祖先节点进行处理</p><p>我们设定$x_1$的core值更小,并设定为K。</p><p>第二行则是利用core值动态更新算法,更新所有受影响的节点的core值,并将这些节点放到V*中</p><p>$node(x_1, T_0)$表示在T0这棵树上,$x_1$所在的节点集合。我们对应初始化$x_1$和$x_2$在树上的节点集合。</p><p>之后采用了一种自底向上的合并过程,(4-13行)在T中递归合并$n_1$和$n_2$直到$n_1=n_2$</p><p>在每次迭代中,我们都记core值小的为$n_1$,否则交换$n_1$与$n_2$.</p><p>合并有两种情况,</p><p>1)若$n_1$,$n_2$的core值相等,因为其含有了$x_1$与$x_2$为连通图,则将其对应合并,将其父节点设定为$n_1$与n2的父节点中core值更大的呢一个,更新$n_1$,$n_2$为其父节点。</p><p>2) 若$n_1$的core值小于$n_2$,若$n_1$的core值小于$n_2$父节点的core值,则把$n_2$的父节点更新为$n_1$。最后更新$n_2$为其父节点</p><p>这个整体的过程很像LCA的操作。</p><p><em><strong>*Page13:*</strong></em></p><p>下面举一个例子,对于图a),其初始k-core层次树为$T_0$, 在插入了$(v_0, v_5)$这样一条边后,需要对应的更新,$n_1=v_5, n_2=v_0$</p><p>第一次迭代比较的是$node(v_5)和node(v_0)$ ,由于其core值不相等,且$v_0$的父节点core值更大,只将$node(v_0)$更新为$node(v_{15})$</p><p>第二次迭代比较的是$node(v_5)$和$node(v_{15})$ 由于core值不相等,但$v_5$core值大于$v_{15}$的父亲,因此将node($v_{15}$)的父亲更新为$node(v_5)$, $node(v_{15})$更新为$v_15$原来的父节点$node(v_{16})$</p><p>同上一次迭代的情况,这次是将$v_5$的父节点指向了$v_{16}$,然后$v_5$更新为root</p><p>最后一次$v_{16}$迭代为root,二者相等结束,更新后得层次树为$T_1$,这里只完成了对其父节点的更新,还没有对子节点进行操作。</p><p><em><strong>*Page14:*</strong></em></p><p>下面是如何调整子树部分,</p><p>首先做的是先证明所有core值被更新的点V*都在上一步的n1‘所在的子树中,且要调整的节点也都在这个子树中。也就是要证明定理2</p><p>首先对于第一个部分,也就是V*均在n1’的子树中:</p><p>若插入边$(x_1,x_2)$中 $core(x_1)<core(x_2)$ 那么$n_1’ = node(x_1,T_1)$ V*就包含在$node(x_1)$中</p><p>若$core(x_1,x_2) n_1’ =node(x_1) \cup node(x_2)$ ,V*在$V(n_1’)$中</p><p>第二部分,其仍然是依据了核分解的定义,若某节点所在子树的导出子图与$n_1’$所在的导出子图没有交集,则其在k-core层次树中保持不变。</p><p> <em><strong>*Page15:*</strong></em></p><p>同时,我们可以证明V*必然被含在最终更新的k-core层次树中的一个节点内。</p><p>这是因为V*为连通图,且其中每一个顶点的core值均为K+1,</p><p><em><strong>*Page16:*</strong></em></p><p>下面是调整子树部分的代码,根据上述证明,我们知道了哪一部分的节点需要调整层数。</p><p>第14-17行为如何调整需要改变层数的节点。</p><p>$T_1=T$,也就是经过调整父节点后的树。首先是让n’ 即为含有$node(v^*)$在$T_1$中的节点。</p><p>之后是为每一个在T中为n’在第k+1层的子节点均创建一个新的节点n+,然后对所有的V*,都从n‘移动到N+中。</p><p><em><strong>*Page17:*</strong></em></p><p>首先我们定义cn,其表示的是以$n_0$为父节点的$nc$,且nc的子树中含有$v_0$这样的节点。</p><p>如右图所示$cn(n’,v_0) = node(v_{15})$</p><p>在此基础上,我们定义NC,其表明的是一个节点集合,其中每个节点都以$n_2’$为父节点,且其子树含有V*在原图的邻居中的一个节点。</p><p>如右图所示,$V*={v_5}$,其在原图的邻居为$(v_{11},v_6,v_0)$,则$NC(n2’,V*)={node(v_{11}), node(v_6),node(v_{15})}$</p><p>基于以上定义,我们证明定理4,也就是每一个NC中的节点,其所在的k-core层次树子树的导出子图都别涵盖在n*子树的导出子图中。</p><p>首先,根据NC的定义,因为n’的core值为K,而nc的父节点为n’,因此其core值均大于等于k+1.</p><p>其次,nc中存在一个顶点和n+中顶点相连,这是因为NC是通过V*中的邻居导出的,保证了其连通性。</p><p>这样的话,当nc的core值为k+1时,其应当与n+合并</p><p>或者其core值大于K+1时,n+就应当成为nc的一个祖先节点。因此证明了上述结论。</p><p>换句话说nc所在的节点应当在n*的子树中</p><p><em><strong>*Page18:*</strong></em></p><p>因此我们有这样的代码:</p><p>第17行先通过cn(n’,u)来提取所有的NC,然后对于NC中的每一个节点,</p><p>19-20行如果其为core值为k+1,那么将nc和n+合并</p><p>21-22行如果core值大于k+1,那么设置nc的父节点为n+</p><p>最后23-25行如果n‘中因为将所有的V*都移除变空了,那么对于n‘的所有子节点,都将其父节点置为n‘的父节点,删除n’即可。</p><p><em><strong>*page19:*</strong></em></p><p>前面的$cn(n_0,v_0)$的实现代码是这样的,给定$n_0,v_0$,我们将所有访问路径上的节点放到A中,然后设置$nc=n_1=node(v_0)$ nc为最终答案,在遍历中表示的是上一次的n1</p><p>当$n_1$不等于$n_0$时,就向上遍历即可,然后将访问过的节点放到A中,直到$n_1=n_0$,也就是nc的父节点为$n_0$</p><p>过程中用了一个Jump做记忆化,其表示的是若已经求过$cn(n_0,v_0)$则可以直接获得值</p><p>因此在求出nc后,需要将A中所有的节点,都设置其$cn(n_2,v_0)=nc$</p><p>****Page20:***<em>下面举一个例子说明,前面我们插入$(v_0,v_5)$后得到了如$T_1$这样的一棵树,然后已知V</em>={v5},那么我们建一个新的节点n+,并将n5,移入,同时我们根据NC的定义得到$NC={node(v_{11}),node(v_6),node(v_{15})}$</p><p>由于$node(v11),node(v_{15})和node(v_5)$ core值相等,因此合并</p><p>$node(v_6)和node(v_5)$core值不等,因此将$node(v_6)$的父节点指向$node(v_5)$</p><p>此时n’为空节点,对应将其子节点的指向更新即可。</p><p>****Page21:****这个是插入单边的完成更新算法,每一个部分前面讲过,主要思路就是先更新父节点,然后更新需要更改层级的节点,最后调整NC,也就是子节点。</p><p>****Page22:****复杂度分析</p><p>$O_k$表示core值为k的节点数, $k_max$为树的高度,第一部分复杂度为更新core值的复杂度,第二部分为merge最多的次数,也就是树的高度</p><p><em><strong>*page23:*</strong></em></p><p>后半部分的复杂度,一部分是将顶点从n+移动到n’</p><p>另一部分是遍历NC的复杂度,最多也就是node(x1)的子树+node(x2)的子树的大小</p><p>总时间复杂度为各部分加和</p><p>****page24:****多边插入</p><p>首先(2-3)行,是对每一条插入的边都做了一次core值更新</p><p>(4-6)行我们创建一个n*作为n‘的子节点,其中n’是至少含有一个V‘中顶点的节点</p><p>N表示为含有V‘中顶点的节点集合,其最后一定会被merge成一个节点。因此n‘可以设置成N中任意顶</p><p>之后我们需要枚举需要合并或更改指向的进入到候选集C中,第7行是将(n*,n0)更新到候选集中,这也就是需要子树调整的部分。</p><p>第八行则是对core值更新的节点都从n‘移动到了n+这样一个操作,这样所有需要调增层级的操作我们都做完了</p><p>对应我们将V*,G0更新</p><p>第11行则是因为插入一条边会导致部分节点的合并,放到候选集</p><p>13-15则是将所有的NC加入候选集</p><p>****page25:****例子,插入(v1,v14)没有节点更新</p><p>插入(v5,v16) V’={v16} ,因此为v16新创建一个节点,这个空集合为n’ ,n*=node(v16)</p><p>将(n’,n*) 加入候选集</p><p>根据算法我们需要将两条插入的边(node(v5),node(v16)), (node(v1),node(v14))加入候选集</p><p>最后则是v16的邻居(node(v5),node(v16))和(node(v16),node(v15))加入候选集</p><p><em><strong>*Page26:*</strong></em></p><p>下面我们对所有的候选集更新:</p><p>我们采取自底向上的方法,kmax代表core值最大的顶点</p><p>对core值为K的每次迭代,我们选取C中没有被访问过的顶点且core值为K的n0,</p><p>N1存储每个访问过的顶点,这些最终将被merge</p><p>N2存储有(n1,n2)属于C,且core(n2)<K,这些节点将成为n1的祖先。</p><p>然后遍历N1中没被访问过的节点n1,将P(n1)加入N2</p><p>若候选集中有和n1有关的(n1,n2)这样的pair</p><p>若core(n2)=K,那么n2加入n1;反之说明其为父子关系,加入N2</p><p>选取n’为N2中core值最大的节点,将所有的(n‘,n2)加入候选集之后处理</p><p>这一层就把所有的N1中合并成一个节点,并设置合并后的节点的父节点为n‘</p><p><em><strong>*Page27:*</strong></em></p><p>我们之前有三个个候选对</p><p>$( node(v_5),node(v_{16})) (node(v_{14}),node(v1)), (node(v_{16}) ,node(v_{15})$</p><p>这里前面的空集处理就是$v_{16}$直接指向root了</p><p>第一轮中</p><p>$N_1=node(v_1)$ 其父节点$node(v_{15})$加入$N_2$</p><p>$pair(node(v_1),node(v_{14}))$ 的core值不等,N2中加入$core(v_{14})$</p><p>这样的话就需要加入$pair(node(v_{15}),node(v_{14}))$</p><p>第二轮迭代 N1={node(v15),node(v14)} N2={node(v5),node(v16)</p><p>就会将node(v15)和node(v14)合并,</p><p>第三轮迭代就会合并对应的node(v5,v16)</p><p><em><strong>*Page28:*</strong></em></p><p>和插入类似,其首先分析了相关性质</p><p>对于core值仍然是,插入后会存在一个连通的V*其对应的core值从K变成K-1 其中K为插入边中core值小的那个顶点</p><p><em><strong>*page29:*</strong></em></p><p>其k-core层次树则是,core值大于K的无须更新</p><p>小于等于K的:</p><p>当core值小于K,可以保证其core值是不会改变的。但删除边可能导致V*中的顶点从K层移动到第K-1层</p><p>同时node(x1)和node(x2)可能失去连通性需要分裂。</p><p>****Page30:****与前面相反,删除时先维护的是子树部分</p><p>第二行代码首先还是计算更新的顶点V*</p><p>第三行则找到含有V<em>的n‘ ,如果其父节点不是在K-1层,则创建一个n0在第K-1层,作为当前n‘的父节点,并将V</em>移入;</p><p>若父节点在K-1层,直接将V*移入</p><p>移动完以后应当是原来含有V<em>的node (n‘)其父节点为对应的n</em></p><p><em><strong>*Page31:*</strong></em></p><p>但这种移动可能会改变n’的连通性,因此我们需要做对应的分割。</p><p>split函数表明了如何分割一个nr的子树,</p><p>(2-4行)首先为每一个nr中的顶点都创建一个空节点将其移入,这样nr就成为了一个空节点。</p><p>为快速检测两个顶点是否在一个k-core中,使用cn(n0,v0),5-7行预先处理了nr子树的cn(nr,node(v0))</p><p>对于图中的每一条边(u,v)其中u属于分割前的nr中,若其core值相等,则可以合并;10-11行这样做的</p><p>12-16 若core(v)>core(u), 那么我们找到cn(nr,v)也就是nr子节点nc,且nc子树中含有v的这样节点。当P(nc)=nr的时候,我们设置P(nc)=node(u)因为这个时候nr为空了。</p><p>否则,我们将P(nc)与node(u)合并,因为P(nc)不等于nr说明前面已经更改过一次指向了,而P(nc)所指向的又能和node(u)连通,因次合并。</p><p>最后若仍然有指向nr的子节点,将其父节点改为nr的父节点,删除nr</p><p><em><strong>*Page32:*</strong></em></p><p>删除(v2.v17) 则对应的V*={v17} ,因此在对应的图a中,n’中的v17被移动到n*中去了。然后对应的n‘每个顶点都分成一个节点。</p><p>之后Vr中包含{v18,v12,v13,v14,v15,v16},遍历这些顶点,并对每个顶点遍历其的邻居节点</p><p>对v18来说,因为其和v0相连,node(v0)就指向了v17</p><p>v12,v13,v14,v15,v16因为彼此相连其被合并为了同一个顶点</p><p>最后node(v6)因为仍然指向n‘,则将其父节点改为node(v19) 删除n’</p><p><em><strong>*page33:*</strong></em></p><p>然后我们来看其父节点,从上个图可以看出,将v<em>从n‘移动到n</em>的行为不一定能保证n<em>的连通,因此我们需要迭代的split n</em>直到分割前后没有任何改变了</p><p><em><strong>*Page34:*</strong></em></p><p>这是他的总体代码,这题就是先调整V*,然后利用split不停往上调整即可。</p><p><em><strong>*Page35:*</strong></em></p><p>这是删除多条边的情况,他在这个地方的处理我觉得没什么大的改进。</p><p>第三行先是找到V<em>,然后和前面一样,将每个V</em>所在的node‘进行移动到上一层去</p><p>然后仍然是增加候选集{n’, n*}</p><p>根据core值从底向上的进行split操作,就完成了维护。</p><p><em><strong>*Page36:*</strong></em></p><p>选取了10个不同数据集,分别用加粗的字母来代替这个数据集,这里列举了其顶点,边数,平均度,最大core值和k-core层次树中节点个数</p><p><em><strong>*page37:*</strong></em></p><p>这个实验是第一列和第二列表示的是作者的算法在插入和删除的效率。</p><p>第四列LCPS是一个静态计算k-core层次化的算法。</p><p>LCPS+则是在LCPS利用动态维护k-core的算法合成的。</p><p>可以看出,在进行单边插入和删除的时候,明显作者提出的想过要好很多。</p><p>但是当有多边插入的时候,插入的效果依然很好,但是删除就不一定了</p><p><em><strong>*Page38:*</strong></em></p><p>这个表明了插入x条边的速率,这里插入确实比删除快很多,删除到2的6次方,已经要跑到1000s了,插入到1024条边也才不到10s</p><p><em><strong>*Page39:*</strong></em></p><p>最后想讲一下他的这个实验,他这个实验很好的表明了自己研究结果的作用。</p><p>他讲user engagement来在网络中量化,对DBLP数据集,每个作者被视为一个顶点,两个作者之间若为共同作者,则视为有边。</p><p>在几何中,顶点的交接指的是它们通过多边形或其他几何图形的边相互连接的方式。例如,如果两个顶点通过一条边相连,则称这两个顶点是“相接”的。通常情况下,顶点的交接是几何中的一个重要概念,因为它决定了几何图形的整体形状和结构。</p><p>树上节点的参与度是节点内部用户平均发表的论文数量。</p><p>作者认为k-core层次树不仅能提供k-core信息,其对应的位置也是很重要的。</p><p>作者会选取第K层子树最大的呢个节点,然后他比较比起parent的参与度更高的顶点数也就是T-edge</p><p>另一个是比较其和同一层中其他节点的参与度,同样接近百分之百,作者用这两个对比想表明,k-core层次树是有实际应用意义的。</p><p><em><strong>*page40:*</strong></em></p><p>最后总结,这篇论文研究的问题是维护动态图的k核层次树问题</p><p>作者提出了有效的局部更新策略,同时比现有方法更加有效;</p><p>且作者认为这种方法可能应用到其他分解,并为分布式的k-core层次维护提供可能。</p><div class="row"> <embed src="/pdf/20221214.pdf" width="100%" height="550" type="application/pdf"></div>]]></content>
<categories>
<category>动态图维护</category>
<category>k-core维护</category>
</categories>
<tags>
<tag>k-core</tag>
<tag>k-core-hierarchy</tag>
</tags>
</entry>
<entry>
<title>Hello World</title>
<link href="/2022/12/28/hello-world/"/>
<url>/2022/12/28/hello-world/</url>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
</entry>
</search>