java有没有这样的算法 java最短路径算法如何实现有向任意两点的最短路径?
java最短路径算法如何实现有向任意两点的最短路径?
Dijkstra算法是一种典型的最短路径路由算法,用于计算从一个节点到所有其他节点的最短路径。主要特征是从起点向外扩展,直到终点。Dijkstra一般有两种表达,一种是使用永久和临时标注,另一种是使用开闭表,采用了贪心法的算法策略。一般流程如下:1.声明两组,打开和关闭。open用于存储未遍历的节点,close用于存储已遍历的节点。
2.在初始阶段,将初始节点置于关闭状态,将所有其他节点置于打开状态。
3.以初始节点为中心逐层向外遍历,得到离指定节点最近的子节点,放入close并重新计算路径,直到close包含所有子节点编码。例子如下:Node对象用于封装节点信息,包括名称和子节点[Java]view plain copy public class
用最通俗易懂的解释一致哈希算法;
首先要明确,一般的哈希算法在取模的时候往往和实际应用有关!
比如使用nginx hash时,会根据后台应用服务器的数量取模。比如后台有四个应用,通过hash(key)%4 =(0,1,2,3)可以得到其中一个的具体标签。此时,如果后台应用需要扩展,哈希算法将改为hash (key) % 6 = (0,1)。它不 t把请求分发到6台不同的机器上看起来问题不大,但是如果我们把场景切换到一个数据库按照业务主键business_no进行哈希的子数据库和子表结构,切换之后因为哈希算法的变化,原始数据下降到4,但是哈希结果是5,那么原始数据可以 t被发现,并且存在数据查询错误问题!
但如果在redis上出现上述问题,由于大量数据未命中,大量查询降落在底层数据库上,严重的话会出现缓存雪崩问题,导致数据库系统甚至整个系统的雪崩;
让 下面我们来详细说说一致哈希算法(以redis存储为例)解决上述问题的方法:
一致哈希算法,不管你有多少应用,都是以2 ^ 32(2的32次方)为模数,把0和2 ^ 32-1首尾相连形成一个环,这样所有使用一致哈希算法的数据都是大概率一致的。落在这枚戒指上;
掉在环上的数据最后怎么会在不同的redis服务器上?无论我们使用redis服务器的IP还是域名,它都是一个唯一的标识符。很好理解,通过计算hash值,同样落在这个环上(ABCD服务器节点),然后规定落在环上的数据顺时针旋转,存储在我们遇到的第一个节点(服务器)上。如下图所示:
使用一致哈希后,我们服务器的扩展也将变得非常容易。如果监测到一个节点(D)的压力相对较高,则通过计算哈希值,在这个节点的上游逆时针方向增加一个服务器E(A和D之间),如下图所示:
这时,如果有请求进来,整个环中只有A和E之间的数据可以 t被获取,会对下层数据库产生影响,其他所有数据不会有任何影响,所以使用一致哈希扩展非常方便!
一致性哈希存在的问题:
1.雪崩效应:假设我们不 t有类似上面说的监控,或者A节点(B)的数据激增,在我们做出反应之前,这个节点此时宕机,那么所有的数据请求都会迅速落在A身上,A不仅要承担自己的数据,还要承担B ;s,而且肯定会马上崩溃,最后整个缓存系统都会产生雪崩效应!
2.分布不均匀:上面的例子对于哈希算法来说太理想化了。比如四台ABCD服务器的hash值刚好是1,2,3,4,这意味着所有hash值在(4,2 32-1)范围内的数据都会落在一个服务上,这也将是灾难性的。。。
那么我们如何解决这种非常不均匀的数据分布呢?
解决方案:最好的方法是添加虚拟节点。截图如下:
ABCD向每个服务器A、B、C和D添加了一个虚拟节点(或多个虚拟节点),这意味着节点A现在可以接受从B2-A1加上C1到A2的数据。假设服务A宕机,A1的数据会落在C2(也就是C),A2的数据会落在D1(也就是D),这意味着随着崩溃服务器的增加,相应的数据会更加分散。
通过以上案例,我们可以看到,一致哈希遵循以下原则:①平衡:将数据尽可能均匀地分布在整个哈希环上,
(2)单调性:在扩展时,会保证原始数据尽可能少的落在新的节点上。
3.去中心化:尽量避免相同的内容落在不同的节点上!
一致哈希的原理很简单,但是一致哈希算法在redis集群、数据库子数据库子表等场景中应用广泛,解决了数据分布不均匀、扩展困难等问题,是大规模集群中的优秀算法!
本文个人感受这个解释相当容易理解。如果你有朋友不喜欢。;我不明白,你可以私下信任我。我会再解释一遍。后期会有更多的技术分享,请继续关注。谢谢你。。。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。