博客园 - sangmado
uuid:24b78886-0ed1-41c2-8670-e3f31dcf42c4;id=147976
2022-11-23T05:24:05Z
sangmado
https://www.cnblogs.com/gaochundong/
feed.cnblogs.com
https://www.cnblogs.com/gaochundong/p/install-microk8s-on-macos-using-multipass.html
在 MacOS 中使用 multipass 安装 microk8s 环境 - sangmado
Kubernetes 集群通过可靠和可扩展的方式对容器化应用进行托管,使得在 DevOps 思维和体系中,让运维服务、系统升级等工作变得超级简单。
Multipass 是一款可运行于 Linux、Windows 和 MacOS 的轻量级虚拟机管理器,它专为希望使用单个命令即可启动全新 Ubuntu 环境的开发人员而设计。它在 Linux 上使用 KVM、在 Windows 上使用 Hyper-V、在 MacOS 上使用 HyperKit,以便以最小的开销运行虚拟机。它还可以在 Windows 和 MacOS 上使用 VirtualBox。Multipass 将协助你获取最新镜像,并持续保持更新。
MicroK8S 是 CNCF 认证的 Kubernetes 部署环境,可在工作站或边缘设备上运行。作为一个 snap 包,它可以原生的运行所有 Kubernetes 服务,如果需要还可以打包类库和二进制文件。它的安装仅受限于你的下载速度,而删除 MicroK8S 后不会留下任何痕迹。
2020-05-30T10:10:00Z
2020-05-30T10:10:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Kubernetes 集群通过可靠和可扩展的方式对容器化应用进行托管,使得在 DevOps 思维和体系中,让运维服务、系统升级等工作变得超级简单。
Multipass 是一款可运行于 Linux、Windows 和 MacOS 的轻量级虚拟机管理器,它专为希望使用单个命令即可启动全新 Ubuntu 环境的开发人员而设计。它在 Linux 上使用 KVM、在 Windows 上使用 Hyper-V、在 MacOS 上使用 HyperKit,以便以最小的开销运行虚拟机。它还可以在 Windows 和 MacOS 上使用 VirtualBox。Multipass 将协助你获取最新镜像,并持续保持更新。
MicroK8S 是 CNCF 认证的 Kubernetes 部署环境,可在工作站或边缘设备上运行。作为一个 snap 包,它可以原生的运行所有 Kubernetes 服务,如果需要还可以打包类库和二进制文件。它的安装仅受限于你的下载速度,而删除 MicroK8S 后不会留下任何痕迹。 <a href="https://www.cnblogs.com/gaochundong/p/install-microk8s-on-macos-using-multipass.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/design-patterns-for-container-based-distributed-systems.html
[译] 基于容器的分布式系统设计模式 - sangmado
在20世纪80年代末期和90年代早期,面向对象编程彻底改变了软件的开发方式,使用模块化的组件进行应用程序构建变得更为普遍。时至今日,我们看到分布式系统开发也在进行类似的变革,基于容器化软件组件构建的微服务架构正在变得越来越流行。容器,依赖其在容器化领域内创立的多重优点,已经成为分布式系统构建的基础"对象"。随着架构风格的成熟,我们也看到了设计模式的涌现,就像我们在面向对象编程时一样,出于对细粒度代码细节的封装抽象,最终揭示了在各种应用程序和算法中相通的更高级的设计模式。这篇论文描述了我们在基于容器构建的分布式系统中识别出的三种类型的设计模式:用于容器管理的单容器模式,多容器紧密协作的单节点模式,用于分布式算法的多节点模式。就像面向对象设计模式一样,这些为分布式计算而生的设计模式引入了最佳实践,简化了代码开发,并提升了使用它们的系统的可靠性。
2020-05-04T10:31:00Z
2020-05-04T10:31:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】在20世纪80年代末期和90年代早期,面向对象编程彻底改变了软件的开发方式,使用模块化的组件进行应用程序构建变得更为普遍。时至今日,我们看到分布式系统开发也在进行类似的变革,基于容器化软件组件构建的微服务架构正在变得越来越流行。容器,依赖其在容器化领域内创立的多重优点,已经成为分布式系统构建的基础"对象"。随着架构风格的成熟,我们也看到了设计模式的涌现,就像我们在面向对象编程时一样,出于对细粒度代码细节的封装抽象,最终揭示了在各种应用程序和算法中相通的更高级的设计模式。这篇论文描述了我们在基于容器构建的分布式系统中识别出的三种类型的设计模式:用于容器管理的单容器模式,多容器紧密协作的单节点模式,用于分布式算法的多节点模式。就像面向对象设计模式一样,这些为分布式计算而生的设计模式引入了最佳实践,简化了代码开发,并提升了使用它们的系统的可靠性。 <a href="https://www.cnblogs.com/gaochundong/p/design-patterns-for-container-based-distributed-systems.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/sangmado_common_libs.html
Sangmado之.NET项目公共基础类库 - sangmado
Sangmado 涵盖了支撑 .NET/C# 项目开发的最基础的公共类库,为团队在不断的系统开发和演进中发现和积累的最公共的代码可复用单元。Sangmado 公共类库设计原则:独立性:不与任何业务框架或业务应用耦合;依赖性:最小化外部类库依赖,选择最稳定的依赖库版本;分离性:分离重用关注点,满足 Separation of Concerns;兼容性:通过 x.y.z 版本号控制兼容性;易用性:发布 nuget 包,可在任意环境使用;开源性:使用 GitHub 代码管理,PR 功能开发;
2017-08-10T08:47:00Z
2017-08-10T08:47:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Sangmado 涵盖了支撑 .NET/C# 项目开发的最基础的公共类库,为团队在不断的系统开发和演进中发现和积累的最公共的代码可复用单元。Sangmado 公共类库设计原则:独立性:不与任何业务框架或业务应用耦合;依赖性:最小化外部类库依赖,选择最稳定的依赖库版本;分离性:分离重用关注点,满足 Separation of Concerns;兼容性:通过 x.y.z 版本号控制兼容性;易用性:发布 nuget 包,可在任意环境使用;开源性:使用 GitHub 代码管理,PR 功能开发; <a href="https://www.cnblogs.com/gaochundong/p/sangmado_common_libs.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/redola_rpc_consul_integration.html
Redola.Rpc 集成 Consul 服务发现 - sangmado
Redola.Rpc 是一个使用 C# 开发的 RPC 框架,代码开源在 GitHub 上。目前版本仅支持 .NET Framework 4.6 以上版本,未来待系统稳健后再考虑移植 .NET Standard 和 .NET Core。Redola.Rpc 在 0.3.2 版本中,尝试解决几个 RPC 设计问题: 我是谁?(Local Actor) 如何告诉别人我是谁?(Actor Directory) 我提供什么服务?(Service Catalog Provider) 如何告诉别人我提供什么服务?(Service Directory) 我需要的服务在哪里?(Service Discovery) 如何调用该服务?(Service Dynamic Proxy) 如何找到该服务?(Actor Directory) 如何发消息给该服务?(Remote Actor)。通过集成 Consul 服务,使得 Redola.Rpc 有能力进行服务发现和负载均衡策略的实施。
2017-08-02T00:23:00Z
2017-08-02T00:23:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Redola.Rpc 是一个使用 C# 开发的 RPC 框架,代码开源在 GitHub 上。目前版本仅支持 .NET Framework 4.6 以上版本,未来待系统稳健后再考虑移植 .NET Standard 和 .NET Core。Redola.Rpc 在 0.3.2 版本中,尝试解决几个 RPC 设计问题: 我是谁?(Local Actor) 如何告诉别人我是谁?(Actor Directory) 我提供什么服务?(Service Catalog Provider) 如何告诉别人我提供什么服务?(Service Directory) 我需要的服务在哪里?(Service Discovery) 如何调用该服务?(Service Dynamic Proxy) 如何找到该服务?(Actor Directory) 如何发消息给该服务?(Remote Actor)。通过集成 Consul 服务,使得 Redola.Rpc 有能力进行服务发现和负载均衡策略的实施。 <a href="https://www.cnblogs.com/gaochundong/p/redola_rpc_consul_integration.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/redola_yet_another_csharp_rpc_framework.html
Redola.Rpc 的一个小目标: 20000tps - sangmado
Redola.Rpc 是一个基于 C# 的轻量级 RPC 框架,源代码托管在 GitHub 上,并且发布了 nuget.org 上的可安装软件包。Redola.Rpc 基于 Cowboy.Sockets 进行构建,使用 TCP Socket 进行服务间通信,默认使用 .NET APM TCP Socket 模式。通过 Actor 模型抽象封装 Socket 连接与交互,实现 Actor 之间的 Register、Lookup、Handshake、KeepAlive 等功能;Actor Peer 与 Actor Peer 之间通过 TCP 长连接进行通信。Actor 封装了 TCP 中关于 TcpClient 和 TcpServer 的抽象,对外不再暴露 Client 和 Server 的概念,仅以 Peer 呈现,Peer 与 Peer 之间是平等的。Actor Master 与其他 Peer 的区别仅是承担了 Register 和 Lookup 的职责。Actor Peer 间通过 Actor Master 查询到需要通信的对端 Actor Peer 的 Actor Identity
2016-10-25T10:33:00Z
2016-10-25T10:33:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Redola.Rpc 是一个基于 C# 的轻量级 RPC 框架,源代码托管在 GitHub 上,并且发布了 nuget.org 上的可安装软件包。Redola.Rpc 基于 Cowboy.Sockets 进行构建,使用 TCP Socket 进行服务间通信,默认使用 .NET APM TCP Socket 模式。通过 Actor 模型抽象封装 Socket 连接与交互,实现 Actor 之间的 Register、Lookup、Handshake、KeepAlive 等功能;Actor Peer 与 Actor Peer 之间通过 TCP 长连接进行通信。Actor 封装了 TCP 中关于 TcpClient 和 TcpServer 的抽象,对外不再暴露 Client 和 Server 的概念,仅以 Peer 呈现,Peer 与 Peer 之间是平等的。Actor Master 与其他 Peer 的区别仅是承担了 Register 和 Lookup 的职责。Actor Peer 间通过 Actor Master 查询到需要通信的对端 Actor Peer 的 Actor Identity <a href="https://www.cnblogs.com/gaochundong/p/redola_yet_another_csharp_rpc_framework.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/cowboy_websockets.html
Cowboy 开源 WebSocket 网络库 - sangmado
Cowboy.WebSockets 是一个基于 .NET/C# 实现的开源 WebSocket 网络库,其完整实现了 RFC 6455 (The WebSocket Protocol) 协议标准,并部分实现了 RFC 7692 (Compression Extensions for WebSocket) 协议标准。Cowboy.WebSockets 中对于 WebSocket 的 Client/Server 分别做了实现。Cowboy.WebSockets 的内部实现是基于 Cowboy.Sockets 中的 TAP 模式的 AsyncTcpSocketServer 和 AsyncTcpSocketClient 。关于 Cowboy.Sockets 可以参考文章《C#高性能TCP服务的多种实现方式》。
2016-02-05T22:31:00Z
2016-02-05T22:31:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Cowboy.WebSockets 是一个基于 .NET/C# 实现的开源 WebSocket 网络库,其完整实现了 RFC 6455 (The WebSocket Protocol) 协议标准,并部分实现了 RFC 7692 (Compression Extensions for WebSocket) 协议标准。Cowboy.WebSockets 中对于 WebSocket 的 Client/Server 分别做了实现。Cowboy.WebSockets 的内部实现是基于 Cowboy.Sockets 中的 TAP 模式的 AsyncTcpSocketServer 和 AsyncTcpSocketClient 。关于 Cowboy.Sockets 可以参考文章《C#高性能TCP服务的多种实现方式》。 <a href="https://www.cnblogs.com/gaochundong/p/cowboy_websockets.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/csharp_tcp_service_models.html
C# 高性能 TCP 服务的多种实现方式 - sangmado
本篇文章的主旨是使用 .NET/C# 实现 TCP 高性能服务的不同方式,包括但不限于如下内容:APM 方式,即 Asynchronous Programming Model;TAP 方式,即 Task-based Asynchronous Pattern;SAEA 方式,即 SocketAsyncEventArgs;RIO 方式,即 Registered I/O。在 .NET/C# 中对于 Socket 的支持均是基于 Windows I/O Completion Ports 完成端口技术的封装,通过不同的 Non-Blocking 封装结构来满足不同的编程需求。以上方式均已在 Cowboy.Sockets 中有完整实现,并且 APM 和 TAP 方式已经在实际项目中应用。Cowboy.Sockets 还在不断的进化和完善中,如有任何问题请及时指正。
2016-02-05T06:42:00Z
2016-02-05T06:42:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】本篇文章的主旨是使用 .NET/C# 实现 TCP 高性能服务的不同方式,包括但不限于如下内容:APM 方式,即 Asynchronous Programming Model;TAP 方式,即 Task-based Asynchronous Pattern;SAEA 方式,即 SocketAsyncEventArgs;RIO 方式,即 Registered I/O。在 .NET/C# 中对于 Socket 的支持均是基于 Windows I/O Completion Ports 完成端口技术的封装,通过不同的 Non-Blocking 封装结构来满足不同的编程需求。以上方式均已在 Cowboy.Sockets 中有完整实现,并且 APM 和 TAP 方式已经在实际项目中应用。Cowboy.Sockets 还在不断的进化和完善中,如有任何问题请及时指正。 <a href="https://www.cnblogs.com/gaochundong/p/csharp_tcp_service_models.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/the_impressionism_of_code.html
代码的印象派:写点好代码吧 - sangmado
在各种软件质量模型的描述中,都包含着软件可维护性(Maintainability)这一属性。而越是生命周期长的软件,对其软件可维护性的要求越高。而提高软件可维护性的根本方式就是编写可阅读的代码,让其他人理解代码的时间最小化。代码生来就是为人阅读的,只是顺便在机器上执行以完成功能。在漫长的软件生命周期中,我们有很多机会去修改软件代码,比如发现了新的 Bug、增加新的功能、改进已有功能等。修改代码的第一步当然就是阅读代码,以了解当前的设计和思路。如果代码都读不懂的话,何谈修改呢?还有,大概率条件下,修复自己实现模块的 Bug 的人通常就是你自己,如果时隔几个月后自己都读不懂自己编写的代码,会是什么感受呢?所以,如何编写出易读的代码就成了问题的关键。而能否编写出易读代码,则直接取决于软件工程师自己的的编程风格和代码品味。
2015-05-04T08:22:00Z
2015-05-04T08:22:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】在各种软件质量模型的描述中,都包含着软件可维护性(Maintainability)这一属性。而越是生命周期长的软件,对其软件可维护性的要求越高。而提高软件可维护性的根本方式就是编写可阅读的代码,让其他人理解代码的时间最小化。代码生来就是为人阅读的,只是顺便在机器上执行以完成功能。在漫长的软件生命周期中,我们有很多机会去修改软件代码,比如发现了新的 Bug、增加新的功能、改进已有功能等。修改代码的第一步当然就是阅读代码,以了解当前的设计和思路。如果代码都读不懂的话,何谈修改呢?还有,大概率条件下,修复自己实现模块的 Bug 的人通常就是你自己,如果时隔几个月后自己都读不懂自己编写的代码,会是什么感受呢?所以,如何编写出易读的代码就成了问题的关键。而能否编写出易读代码,则直接取决于软件工程师自己的的编程风格和代码品味。 <a href="https://www.cnblogs.com/gaochundong/p/the_impressionism_of_code.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/kmeans_clustering.html
K-Means 聚类算法 - sangmado
K-Means 是一种基于距离的排他的聚类划分方法。K-Means 基本原理:给定划分数量 k。创建一个初始划分,从数据集中随机地选择 k 个对象,每个对象初始地代表了一个簇中心(Cluster Centroid)。对于其他对象,计算其与各个簇中心的距离,将它们划入距离最近的簇。采用迭代的重定位技术,尝试通过对象在划分间移动来改进划分。所谓重定位技术,就是当有新的对象加入簇或者已有对象离开簇的时候,重新计算簇的平均值,然后对对象进行重新分配。这个过程不断重复,直到各簇中对象不再变化为止。K-Means 算法最常见的实现方式是使用迭代式精化启发法的 Lloyd's algorithm。
2015-02-09T15:06:00Z
2015-02-09T15:06:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】K-Means 是一种基于距离的排他的聚类划分方法。K-Means 基本原理:给定划分数量 k。创建一个初始划分,从数据集中随机地选择 k 个对象,每个对象初始地代表了一个簇中心(Cluster Centroid)。对于其他对象,计算其与各个簇中心的距离,将它们划入距离最近的簇。采用迭代的重定位技术,尝试通过对象在划分间移动来改进划分。所谓重定位技术,就是当有新的对象加入簇或者已有对象离开簇的时候,重新计算簇的平均值,然后对对象进行重新分配。这个过程不断重复,直到各簇中对象不再变化为止。K-Means 算法最常见的实现方式是使用迭代式精化启发法的 Lloyd's algorithm。 <a href="https://www.cnblogs.com/gaochundong/p/kmeans_clustering.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/ford_fulkerson_maximum_flow_algorithm.html
Ford-Fulkerson 最大流算法 - sangmado
流网络(Flow Networks)指的是一个有向图 G= (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0。如果 (u, v) ∉ E 则可以规定 c(u, v) = 0。流网络中有两个特殊的顶点:源点 s (source)和汇点 t(sink)。为方便起见,假定每个顶点均处于从源点到汇点的某条路径上,就是说,对每个顶点 v ∈ E,存在一条路径 s --> v --> t。因此,图 G 为连通图,且 |E| ≥ |V| - 1。
2015-02-05T19:32:00Z
2015-02-05T19:32:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】流网络(Flow Networks)指的是一个有向图 G= (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0。如果 (u, v) ∉ E 则可以规定 c(u, v) = 0。流网络中有两个特殊的顶点:源点 s (source)和汇点 t(sink)。为方便起见,假定每个顶点均处于从源点到汇点的某条路径上,就是说,对每个顶点 v ∈ E,存在一条路径 s --> v --> t。因此,图 G 为连通图,且 |E| ≥ |V| - 1。 <a href="https://www.cnblogs.com/gaochundong/p/ford_fulkerson_maximum_flow_algorithm.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/johnson_algorithm.html
Johnson 全源最短路径算法 - sangmado
对于全源最短路径问题(All-Pairs Shortest Paths Problem),可以认为是单源最短路径问题的推广,即分别以每个顶点作为源顶点并求其至其它顶点的最短距离。Johnson 算法描述如下:给定图 G = (V, E),增加一个新的顶点 s,使 s 指向图 G 中的所有顶点都建立连接,设新的图为 G’;对图 G’ 中顶点 s 使用 Bellman-Ford 算法计算单源最短路径,得到结果 h[] = {h[0], h[1], .. h[V-1]};对原图 G 中的所有边进行 "re-weight",即对于每个边 (u, v),其新的权值为 w(u, v) + (h[u] - h[v]);移除新增的顶点 s,对每个顶点运行 Dijkstra 算法求得最短路径;Johnson 算法的运行时间为 O(V2logV + VE)。
2015-02-02T00:33:00Z
2015-02-02T00:33:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】对于全源最短路径问题(All-Pairs Shortest Paths Problem),可以认为是单源最短路径问题的推广,即分别以每个顶点作为源顶点并求其至其它顶点的最短距离。Johnson 算法描述如下:给定图 G = (V, E),增加一个新的顶点 s,使 s 指向图 G 中的所有顶点都建立连接,设新的图为 G’;对图 G’ 中顶点 s 使用 Bellman-Ford 算法计算单源最短路径,得到结果 h[] = {h[0], h[1], .. h[V-1]};对原图 G 中的所有边进行 "re-weight",即对于每个边 (u, v),其新的权值为 w(u, v) + (h[u] - h[v]);移除新增的顶点 s,对每个顶点运行 Dijkstra 算法求得最短路径;Johnson 算法的运行时间为 O(V2logV + VE)。 <a href="https://www.cnblogs.com/gaochundong/p/johnson_algorithm.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/floyd_warshall_algorithm.html
Floyd-Warshall 全源最短路径算法 - sangmado
Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,其中图 G 允许存在权值为负的边,但不存在权值为负的回路。Floyd-Warshall 算法的运行时间为 Θ(V^3)。Floyd-Warshall 算法的设计基于了如下观察。设带权图 G = (V, E) 中的所有顶点 V = {1, 2, . . . , n},考虑一个顶点子集 {1, 2, . . . , k}。对于任意对顶点 i, j,考虑从顶点 i 到 j 的所有路径的中间顶点都来自该子集 {1, 2, . . . , k},设 p 是该子集中的最短路径。Floyd-Warshall 算法描述了 p 与 i, j 间最短路径及中间顶点集合 {1, 2, . . . , k - 1} 的关系,该关系依赖于 k 是否是路径 p 上的一个中间顶点。
2015-02-02T00:32:00Z
2015-02-02T00:32:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,其中图 G 允许存在权值为负的边,但不存在权值为负的回路。Floyd-Warshall 算法的运行时间为 Θ(V^3)。Floyd-Warshall 算法的设计基于了如下观察。设带权图 G = (V, E) 中的所有顶点 V = {1, 2, . . . , n},考虑一个顶点子集 {1, 2, . . . , k}。对于任意对顶点 i, j,考虑从顶点 i 到 j 的所有路径的中间顶点都来自该子集 {1, 2, . . . , k},设 p 是该子集中的最短路径。Floyd-Warshall 算法描述了 p 与 i, j 间最短路径及中间顶点集合 {1, 2, . . . , k - 1} 的关系,该关系依赖于 k 是否是路径 p 上的一个中间顶点。 <a href="https://www.cnblogs.com/gaochundong/p/floyd_warshall_algorithm.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/dijkstra_algorithm.html
Dijkstra 单源最短路径算法 - sangmado
Dijkstra 算法又称为单源最短路径算法,由计算机科学家 Edsger Dijkstra 于 1956 年构思并于 1959 年发表。其解决的问题是:给定图 G 和源顶点 v,找到从 v 至图中所有顶点的最短路径。Dijkstra 算法的初始实现版本并未使用最小优先队列实现,其时间复杂度为 O(V^2)。Leyzorek et al 在 1957 提供了基于 Fibonacci heap 的最小优先队列实现版本,其时间复杂度为 O(VlogV)。
2015-02-02T00:30:00Z
2015-02-02T00:30:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Dijkstra 算法又称为单源最短路径算法,由计算机科学家 Edsger Dijkstra 于 1956 年构思并于 1959 年发表。其解决的问题是:给定图 G 和源顶点 v,找到从 v 至图中所有顶点的最短路径。Dijkstra 算法的初始实现版本并未使用最小优先队列实现,其时间复杂度为 O(V^2)。Leyzorek et al 在 1957 提供了基于 Fibonacci heap 的最小优先队列实现版本,其时间复杂度为 O(VlogV)。 <a href="https://www.cnblogs.com/gaochundong/p/dijkstra_algorithm.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/bellman_ford_algorithm.html
Bellman-Ford 单源最短路径算法 - sangmado
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径的算法。该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年。Bellman-Ford 算法和 Dijkstra 算法同为解决单源最短路径的算法。对于带权有向图 G = (V, E),Dijkstra 算法要求图 G 中边的权值均为非负,而 Bellman-Ford 算法能适应一般的情况(即存在负权边的情况)。Bellman-Ford 算法的时间复杂度为 O(V*E),其中 V 为顶点数量,E 为边的数量。
2015-02-02T00:29:00Z
2015-02-02T00:29:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径的算法。该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年。Bellman-Ford 算法和 Dijkstra 算法同为解决单源最短路径的算法。对于带权有向图 G = (V, E),Dijkstra 算法要求图 G 中边的权值均为非负,而 Bellman-Ford 算法能适应一般的情况(即存在负权边的情况)。Bellman-Ford 算法的时间复杂度为 O(V*E),其中 V 为顶点数量,E 为边的数量。 <a href="https://www.cnblogs.com/gaochundong/p/bellman_ford_algorithm.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/prim_minimum_spanning_tree.html
Prim 最小生成树算法 - sangmado
Prim 算法是一种解决最小生成树问题(Minimum Spanning Tree)的算法。和 Kruskal 算法类似,Prim 算法的设计也是基于贪心算法(Greedy algorithm)。Prim 算法的思想很简单,一棵生成树必须连接所有的顶点,而要保持最小权重则每次选择邻接的边时要选择较小权重的边。Prim 算法看起来非常类似于单源最短路径 Dijkstra 算法,从源点出发,寻找当前的最短路径,每次比较当前可达邻接顶点中最小的一个边加入到生成树中。
2015-01-31T01:23:00Z
2015-01-31T01:23:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Prim 算法是一种解决最小生成树问题(Minimum Spanning Tree)的算法。和 Kruskal 算法类似,Prim 算法的设计也是基于贪心算法(Greedy algorithm)。Prim 算法的思想很简单,一棵生成树必须连接所有的顶点,而要保持最小权重则每次选择邻接的边时要选择较小权重的边。Prim 算法看起来非常类似于单源最短路径 Dijkstra 算法,从源点出发,寻找当前的最短路径,每次比较当前可达邻接顶点中最小的一个边加入到生成树中。 <a href="https://www.cnblogs.com/gaochundong/p/prim_minimum_spanning_tree.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/kruskal_minimum_spanning_tree.html
Kruskal 最小生成树算法 - sangmado
对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小。因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为生成树(Spanning Tree),因为它生成了图 G。显然,由于树 T 连接了所有的顶点,所以树 T 有 V - 1 条边。一张图 G 可以有很多棵生成树,而把确定权值最小的树 T 的问题称为最小生成树问题(Minimum Spanning Tree)。术语 "最小生成树" 实际上是 "最小权值生成树" 的缩写。Kruskal 算法提供一种在 O(ElogV) 运行时间确定最小生成树的方案。Kruskal 算法基于贪心算法(Greedy Algorithm)的思想进行设计,其选择的贪心策略就是,每次都选择权重最小的但未形成环路的边加入到生成树中。
2015-01-31T01:22:00Z
2015-01-31T01:22:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小。因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为生成树(Spanning Tree),因为它生成了图 G。显然,由于树 T 连接了所有的顶点,所以树 T 有 V - 1 条边。一张图 G 可以有很多棵生成树,而把确定权值最小的树 T 的问题称为最小生成树问题(Minimum Spanning Tree)。术语 "最小生成树" 实际上是 "最小权值生成树" 的缩写。Kruskal 算法提供一种在 O(ElogV) 运行时间确定最小生成树的方案。Kruskal 算法基于贪心算法(Greedy Algorithm)的思想进行设计,其选择的贪心策略就是,每次都选择权重最小的但未形成环路的边加入到生成树中。 <a href="https://www.cnblogs.com/gaochundong/p/kruskal_minimum_spanning_tree.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/kosaraju_check_directed_graph_stronly_connected.html
Kosaraju 算法检测有向图的强连通性 - sangmado
给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strongly Connected)。如下图中,任意两个顶点都是互相可达的。实际上,解决该问题的较好的方式就是使用强连通分支算法(SCC:Strongly Connected Components),可以在 O(V+E) 时间内找到所有的 SCC。如果 SCC 的数量是 1,则说明整个图是强连通的。实现 SCC 的一种算法就是 Kosaraju 算法。Kosaraju 算法基于深度优先搜索(DFS),并对图进行两次 DFS 遍历。Kosaraju 算法的思想就是,如果从顶点 v 可以抵达所有顶点,并且所有顶点都可以抵达 v,则说明图是强连通的。
2015-01-30T14:29:00Z
2015-01-30T14:29:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strongly Connected)。如下图中,任意两个顶点都是互相可达的。实际上,解决该问题的较好的方式就是使用强连通分支算法(SCC:Strongly Connected Components),可以在 O(V+E) 时间内找到所有的 SCC。如果 SCC 的数量是 1,则说明整个图是强连通的。实现 SCC 的一种算法就是 Kosaraju 算法。Kosaraju 算法基于深度优先搜索(DFS),并对图进行两次 DFS 遍历。Kosaraju 算法的思想就是,如果从顶点 v 可以抵达所有顶点,并且所有顶点都可以抵达 v,则说明图是强连通的。 <a href="https://www.cnblogs.com/gaochundong/p/kosaraju_check_directed_graph_stronly_connected.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/kosaraju_algorithm.html
Kosaraju 算法查找强连通分支 - sangmado
有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的。通过 Kosaraju 算法,可以在 O(V+E) 运行时间内找到所有的强连通分支。Kosaraju 算法是基于深度优先搜索(DFS),算法的描述如下:创建一个空的栈 S,并做一次 DFS 遍历。在 DFS 遍历中,当在递归调用 DSF 访问邻接顶点时,将当前顶点压入栈中;置换图(Transpose Graph);从栈 S 中逐个弹出顶点 v,以 v 为源点进行 DFS 遍历。从 v 开始的 DFS 遍历将输出 v 关联的强连通分支。
2015-01-30T14:28:00Z
2015-01-30T14:28:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的。通过 Kosaraju 算法,可以在 O(V+E) 运行时间内找到所有的强连通分支。Kosaraju 算法是基于深度优先搜索(DFS),算法的描述如下:创建一个空的栈 S,并做一次 DFS 遍历。在 DFS 遍历中,当在递归调用 DSF 访问邻接顶点时,将当前顶点压入栈中;置换图(Transpose Graph);从栈 S 中逐个弹出顶点 v,以 v 为源点进行 DFS 遍历。从 v 开始的 DFS 遍历将输出 v 关联的强连通分支。 <a href="https://www.cnblogs.com/gaochundong/p/kosaraju_algorithm.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/disjoint_set_forests_heuristics.html
不相交集合森林的启发式策略 - sangmado
Union-Find 算法为不相交集合数据结构中的非常有用的操作。其通常使用链表或一维数组来实现,另一种实现方式是使用有根树来表示集合,树中的每个节点都包含集合的一个成员,每棵树表示一个集合,形成不相交集合森林(Disjoint-set forest)。每棵树的根包含了集合的代表,并且是它自己的父节点。通过引入两种启发式策略,可以获得目前已知的、渐进意义上最快的不想交集合数据结构。第一种启发式策略是按秩合并(Union by Rank),其思想是使包含较少节点的树的根指向包含较多节点的树的根。第二种启发式策略是路径压缩(Path Compression),在 Find 操作中,使查找路径上的每个节点都直接指向根节点。路径压缩并不改变节点的秩(Rank)。
2015-01-30T12:50:00Z
2015-01-30T12:50:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】Union-Find 算法为不相交集合数据结构中的非常有用的操作。其通常使用链表或一维数组来实现,另一种实现方式是使用有根树来表示集合,树中的每个节点都包含集合的一个成员,每棵树表示一个集合,形成不相交集合森林(Disjoint-set forest)。每棵树的根包含了集合的代表,并且是它自己的父节点。通过引入两种启发式策略,可以获得目前已知的、渐进意义上最快的不想交集合数据结构。第一种启发式策略是按秩合并(Union by Rank),其思想是使包含较少节点的树的根指向包含较多节点的树的根。第二种启发式策略是路径压缩(Path Compression),在 Find 操作中,使查找路径上的每个节点都直接指向根节点。路径压缩并不改变节点的秩(Rank)。 <a href="https://www.cnblogs.com/gaochundong/p/disjoint_set_forests_heuristics.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/gaochundong/p/union_find_detect_cycle_in_an_undirected_graph.html
Union-Find 检测无向图有无环路算法 - sangmado
不相交集合数据结构(Disjoint-set)是一种用于跟踪集合被分割成多个不相交的子集合的数据结构。Union-Find 算法为该数据结构提供了两种非常有用的操作:Find:判断子集合中是否存在特定的元素。可以用于检测是否两个元素存在于相同的子集合中。Union:将两个不子集合合并成新的子集合。Union-Find 算法的一个具体的应用就是在无向图(Undirected Graph)中检测是否存在环。
2015-01-30T12:49:00Z
2015-01-30T12:49:00Z
sangmado
https://www.cnblogs.com/gaochundong/
【摘要】不相交集合数据结构(Disjoint-set)是一种用于跟踪集合被分割成多个不相交的子集合的数据结构。Union-Find 算法为该数据结构提供了两种非常有用的操作:Find:判断子集合中是否存在特定的元素。可以用于检测是否两个元素存在于相同的子集合中。Union:将两个不子集合合并成新的子集合。Union-Find 算法的一个具体的应用就是在无向图(Undirected Graph)中检测是否存在环。 <a href="https://www.cnblogs.com/gaochundong/p/union_find_detect_cycle_in_an_undirected_graph.html" target="_blank">阅读全文</a>