首页 文章 精选 留言 我的

精选列表

搜索[分代式],共10000篇文章
优秀的个人博客,低调大师

一分钟说清楚并查集

分离集合(disjoint set)是一种经典的数据结构,它有三类操作: Make-set(a):生成包含一个元素a的集合S; Union(X, Y):合并两个集合X和Y; Find-set(a):查找元素a所在集合S,即通过元素找集合句柄; 它非常适合用来解决集合合并与查找的问题,也常称为并查集。 一、并查集的链表实现 如上图,并查集可以用链表来实现。 链表实现的并查集,Find-set(a)的时间复杂度是多少? 集合里的每个元素,都指向“集合的句柄”,这样可以使得“查找元素a所在集合S”,即Find-set(a)操作在O(1)的时间内完成。 链表实现的并查集,Union(X, Y)的时间复杂度是多少? 假设有集合: S1={7,3,1,4} S2={1,6} 合并S1和S2两个集合,需要做两件事情: (1) 第一个集合的尾元素,链向第二个集合的头元素(蓝线1); (2) 第二个集合的所有元素,指向第一个集合的句柄(蓝线2,3); 合并完的效果是: 变成了一个更大的集合S1。 集合合并时,将短的链表,往长的链表上接,这样变动的元素更少,这个优化叫做“加权合并”。 画外音:实现的过程中,集合句柄要存储元素个数,头元素,尾元素等属性,以方便上述操作进行。 假设每个集合的平均元素个数是n,Union(X, Y)操作的时间复杂度是O(n)。 能不能Find-set(a)与Union(X, Y)都在O(1)的时间内完成呢? 可以,这就引发了并查集的第二种实现方法。 二、并查集的有根树实现 什么是有根树,和普通的树有什么不同? 常用的set,就是用普通的二叉树实现的,其元素的数据结构是: element{ int data; element* left; element* right; } 通过左指针与右指针,父亲节点指向儿子节点。 而有根树,其元素的数据结构是: element{ int data; element* parent; } 通过儿子节点,指向父亲节点。 假设有集合: S1={7,3,1,4} S2={1,6} 通过如果通过有根树表示,可能是这样的: 所有的元素,都通过parent指针指向集合句柄,所有元素的Find-set(a)的时间复杂度也是O(1)。 画外音:假设集合的首个元素,代表集合句柄。 有根树实现的并查集,Union(X, Y)的过程如何?时间复杂度是多少? 通过有根树实现并查集,集合合并时,直接将一个集合句柄,指向另一个集合即可。 如上图所示,S2的句柄,指向S1的句柄,集合合并完成:S2消亡,S1变为了更大的集合。 容易知道,集合合并的时间复杂度为O(1)。 会发现,集合合并之后,有根树的高度变高了,与“加权合并”的优化思路类似,总是把节点数少的有根树,指向节点数多的有根树(更确切的说,是高度矮的树,指向高度高的树),这个优化叫做“按秩合并”。 新的问题来了,集合合并之后,不是所有元素的Find-set(a)操作都是O(1)了,怎么办? 如图S1与S2合并后的新S1,首次“通过元素6来找新S1的句柄”,不能在O(1)的时间内完成了,需要两次操作。 但为了让未来“通过元素6来找新S1的句柄”的操作能够在O(1)的时间内完成,在首次进行Find-set(“6”)时,就要将元素6“寻根”路径上的所有元素,都指向集合句柄,如下图。 某个元素如果不直接指向集合句柄,首次Find-set(a)操作的过程中,会将该路径上的所有元素都直接指向句柄,这个优化叫做“路径压缩”。 画外音:路径上的元素第二次执行Find-set(a)时,时间复杂度就是O(1)了。 实施“路径压缩”优化之后,Find-set的平均时间复杂度仍是O(1)。 结论 通过链表实现并查集: ● Find-set的时间复杂度,是 O(1) 常数时间 ● Union的时间复杂度,是集合平均元素个数,即 线性时间 画外音:别忘了“加权合并”优化。 通过有根树实现并查集: ● Union的时间复杂度,是 O(1) 常数时间 ● Find-set的时间复杂度,通过“按秩合并”与“路径压缩”优化后,平均时间复杂度 也是O(1) 使用并查集,非常适合解决“微信群覆盖”问题。 思路比结论重要,有收获就是好的。 原文发布时间为:2018-11-20 本文作者:58沈剑 本文来自云栖社区合作伙伴“架构师之路”,了解相关信息可以关注“架构师之路”。

优秀的个人博客,低调大师

三十分钟快速搭建serverless网盘服务

前言 函数计算支持以无服务器架构快速构建企业和开发者的软件系统,以其全托管事件触发模式、超弹性伸缩以及低廉的计费方式,相对于传统服务器架构,在开发效能和运维模式上都取得了明显优势。另外还提供了各种服务间的触发功能,作为云端各种产品的黏合剂,适用于各种应用场景。 本节,将带领大家利用函数计算,快速搭建一个功能完整的网盘服务。网盘服务的项目见(即将开源): apis site ui 网盘服务简介 功能 网盘服务功能详细介绍请参考文章网盘服务系统和相应的项目 repo 。 本文重点不是介绍网盘功能,所以,请大家通过已经搭建好的网盘 demo 自行体验,这里不做过多赘述。 网盘系统无服务器架构 网盘服务功能集较多,这里就以上传文件功能为例,展现其网盘的实现架构。 网盘服务自身模块以及资源依赖 网盘服务的模块实现分为三个部分,如下图所示: apis : 提供了网盘的

优秀的个人博客,低调大师

10分钟上线 - 函数计算实现Serverless图片处理服务

阿里云函数计算服务(FunctionCompute,FC)是一个事件驱动的全托管计算服务。通过函数计算与云端各个服务的广泛集成,开发者只需要编写函数代码,就能够快速地开发出弹性高可用的后端系统。接下来我们使用FC,来快速实现一个图片转换服务。 图片转换服务展示 我们用图像处理中经典的lena为例 处理example入口地址: reszie path:/resize/[width]/[height]/[pic_name] rezise example rotate: path:/rotate/[angle]/[pic_name] rotate example crop: path:/crop/[left]/[top]/[right]/[bottom]/[pic_name] crop example flip: path: /flip/[pic_name] fli

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册