简介:在开发过程中,我遇到了数据场景或多或少。没有数据,就没有问题。当数据很大时,如果没有良好的算法逻辑或工具,则效率很慢且易于犯错。本文主要描述基于父子之间关系的有效算法。
关系函数可以通过此函数转换获得另一个元素,因此两个元素之间的关系可以由关系函数表示。父子关系函数可以通过打开函数转换来获得其子元素。父亲之间的关系功能可以代表两个要素。重新计算,大大降低了重复的计算步骤,并大大提高了计算速度。
如果a和b和c之间存在父森关系,则可以用函数f(a)= b,f(b)= c表示,因此a是b,b的父级,b是子级a,b是a的子级别,位是c的父级,c是b的子级别,a没有父级,a是根,在此ABC集合中,只有一个根a,c没有子级别,然后c是一个sub -node。这次,a,b和c遵循严格的父亲的关系,家庭血统链的长度为3,也就是说。ABC是一条血链。
问题:您是否需要验证{a,b,c}您是否严格遵循父子之间的关系?如何验证,只需验证每个元素是否合法即可。以元素C为例。要验证他是否合法,您必须验证该系列中的c是否严格跟随父亲关系,严格跟随父亲关系。我们必须找到C的血液链的根元素,并验证此根元素的确存在!以及C的父级元素到根元素的元素是合法的(在此示例中,A和B,以满足“ A是root is root,f(a)=的条件b“)!然后验证必须确定f(b)= c!如果通过上述验证,则C是法律元素,并且在此集合中严格遵循C。
可以看出,根据上述示例,我们如何判断{a,b,c}该集合的集合是完整且合法的?根据上述验证步骤,只要所有元素都可以通过上述验证步骤,并且不会有反向依赖性(例如f(c)= b),那么此集合是合法的。因此,必须通过以下验证步骤,但是验证元素的顺序是不确定的,而不是有序的,因此是以下步骤:
验证c:
C的父级为B,F(B)= C
B的父亲-Class是A,F(A)= B
一个没有父亲的阶级是根
验证a:
C的父级为B,F(B)= C
a没有父母 - 级是根,合法的
验证b:
C的父级为B,F(B)= C
B的父亲-Class是A,F(A)= B
一个没有父亲的阶级是根
只要验证并通过了以上步骤,该集合是合法的
只有通过这种方式,该血统链才能合理。如果血型链的时间越长,验证计算的步骤越多,并且在每个元素的验证过程中将出现重复步骤。如上面的绿色步骤所示,如果血型链长并且分支,则会发生以下情况:
a是根,f和g是子节点;d和e有一个共同的父母。这两个血统是合法的。最常见的解决方案是根据上述示例步骤验证,这些元素验证的顺序尚不确定,即,随机顺序,很明显,在这种情况下,验证步骤的变化发生了变化。在这种情况下,验证步骤的变化发生了变化,有很大的成功。为了确保每个元素都是合法的,包括所有验证步骤。重复的步骤是无数的。
步:
一个。验证血统ABCDF
验证b:
B的父亲-Class是A,F(A)= B
一个没有父亲的阶级是根
验证a:
A没有父亲级别,它是根源,合法的
验证f:
F的父级为d,f(d)= f
d的父级为c,f(c)= d
C的父级为B,F(B)= C
B的父亲-Class是A,F(A)= B
一个没有父亲的阶级是根
验证d:
d的父级为c,f(c)= d
C的父级为B,F(B)= C
B的父亲-Class是A,F(A)= B
一个没有父亲的阶级是根
验证c:
C的父级为B,F(B)= C
B的父亲-Class是A,F(A)= B
一个没有父亲的阶级是根
二人录取专辑abceg
验证e:
E的父亲-Class是C,F(c)= E
C的父级为B,F(B)= C
B的父亲-Class是A,F(A)= B
一个没有父亲的阶级是根
验证G:
G的父级是e,f(e)= g
E的父亲-Class是C,F(c)= E
C的父级为B,F(B)= C
B的父亲-Class是A,F(A)= B
一个没有父亲的阶级是根
从上面可以看出,这两个血型链的验证步骤总共有24个步骤,并且步骤的绿色部分重复两次或更多。现在,这只是7个元素的集合。每增加一个元素验证,计算步骤将成为增长指数。如果此元素集不是7个,而是超过数千万。如果关系函数f(x)复杂,并且重复了元素收集中的血统链,并且血统链的长度很长,那么将有无数的重复步骤来验证验证之间关系的关系父母和儿子。就像上面提到的绿色步骤。因此如何优化这些重复的计算步骤?这次是解决问题的问题。
实际上,上述绿色部分的步骤只能在不重复计算的情况下计算一次。计算结果在哈希集中。它仍然是上述数据作为示例。验证过程中的中间数据应使用标签缓存。主题集的特征不重复,自动变重,并找到所有数据结构中最快的性能。如果在验证过程中将每个步骤中计算的中间数据放置在验证过程中的每个步骤中,则可以检查已验证的中间数据从随后的验证步骤中的标签开始,可以大大减少重复验证的步骤。那么应该计算什么?
每个元素验证的流程图如下:
例如,对C元素的验证,验证过程被转换如下,绿色部分是内存算法,并且计算出的中间数据放在哈希集集中。图1:图1:
因此,验证血统收集之间关系的步骤变得简单。如下所示,无论验证元素的顺序如何,可以维护的节点只能计算一次,并且所有重复的计算步骤均直接删除。
一个稳定验证血统ABCDF
验证a:
a是根节点,合法,
放在哈希集中
验证b:
B的父级元素是A,F(a)= b。
在哈希集中找到A,B是合法的。
并将B放入哈希集中。
验证c:
C的父级元素是b,f(b)= c
查找b在哈希集中,c是合法的。
并将C放入哈希集中。
验证d:
d的父级元素是c,f(c)= d
查找C在哈希集中,D是合法的。
并将D放在哈希集中。
验证f:
F的父级元素是d,f(d)= f
查找D在哈希集中,F是合法的。
并将f放在标签中。
二。验证血统ABCEG
验证e:
E的父级元素是c,f(c)= e
查找C处于哈希群中,E是合法的。
并将E放入哈希集中。
验证G:
G的父元素是e,f(e)= g
发现E处于哈希群中,G是合法的。
并将g放在哈希集中。
只要验证并通过了上述步骤,collection {a,b,c,d,e,f,g}严格遵循父亲的关系。传统算法需要24个步骤,但是有了内存算法,验证步骤一次下降到13个。计算的近一半计算数量,并且随着收集元素的增加,记忆算法的有效性。元素。
回到图1,每次您验证元素时,都会根据父亲和儿子的关系通过哈希集的关系保存已经计算出的元素,这可以减少后续计算的重复步骤。您只需要查询一次即可确定其合法性。在任何血链之间没有共同部分,平均血链长度为m:
原始算法步骤r和元素n的数量之间的关系是:r =(1+m)(m)(m)(m)(n / m) / 2
内存算法r和元素n的步骤之间的关系n为:r =(m + 2 m-1)(n/m)
如果收集包含100个元素,则任何血链之间都没有共同的部分,而平均血链长度为5。
使用原始算法(包括重复步骤)来计算,有多达6520 /2 = 300来验证步骤
使用内存算法,最验证的步骤是(5+25-1)20 = 280
减少内存算法的步骤为300-280 = 20
内存算法将计算减少20/300 = 6%
血链长度为20
使用原始算法(包括重复的步骤)进行计算,需要验证的步骤多达21205/2 = 1050
使用内存算法,最验证的步骤是(20+220-1)5 = 295
减少内存算法的步骤为1050-295 = 755
内存算法减少了减少755/1050 = 71%的计算时间
如果一个收集包含1,000个元素,则任何血链之间都没有共同的部分,而平均血液链长度为5
使用原始算法(包括重复的步骤)进行计算,有多达65200/2 = 3000个步骤要验证
使用内存算法,最验证的步骤是(5+25-1)200 = 2800
减少内存算法的步骤为3000-2800 = 200
内存算法加速200/3000 = 6%
血链长度为20
使用原始算法(包括重复的步骤)进行计算,需要总共需要验证的步骤多达212050/2 = 10500
使用内存算法,最有效的步骤是(20+220-1)50 = 2950
减少内存算法的步骤为10500-2950 = 7550
内存算法将计算减少了7550/10500 = 71%
血链长度为200
使用原始算法(包括重复步骤)来计算,有多达2012005/2 = 100500可以验证
使用内存算法,最验证的步骤是(200+2200-1)5 = 2995
减少内存算法的步骤是100500-2995 = 97505
内存算法将计算减少了97505/100500 = 97%
可以看出,集合中的元素越多,血链的平均长度越长,记忆算法的计算效率就越明显。
第一个替代方案,不使用hashset,使用hashmap,使用hashmap的键来存储元素,使用值存储其他计算所需的复杂数据,从而大大增强了此内存算法的可扩展性,也就是说,存储的数据可以更易用Morediversity不仅可以存储此元素本身。
使用分布式缓存或本地文件存储这些经过验证的元素的第二个替代方案,但是您需要重新实现集合以确保本地文件和分布式缓存中的元素是唯一的。ESSENCEALSO实现一组有效的查询算法。Quickly Quickly检查此元素是否已经存在于本地文档中或分布式缓存中。
第三个选择是,它不使用内存算法将集合中的每个元素转换为要处理的对象。在验证每个验证后,它在此元素上标记,表明此元素是否是法律元素。
分布式一致性
Lucene查询原理分析
不安全的魔术应用实施例(locksupport)
数据构建实践(2)-DATA治理数据质量
Zheng Caiyun技术团队(零)是一个充满激情,创造力和执行的团队,基地在风景如画的杭州。该团队目前拥有300多个研发合作伙伴,包括来自Ali,Huawei和Netease的“老”士兵,以及NetEase,以及以及郑安格大学,中央科学技术大学,杭州电力和其他学校的新移民。在日常业务发展外,该团队还在云本地,区块链,人工智能,低 - 低 - 低 - 低 - 低 -代码平台,中间件,大数据,材料系统,工程平台,性能经验,可视化和其他领域,促进了促销促销系列内部技术产品,以继续探索技术的新界限。此外,该团队已加入社区建设。目前,这已经是对许多出色的开源社区的贡献您想开始扔;如果您想更改警告,则需要有更多的想法,但是您不能打破游戏。如果您想更改,您有能力取得结果,但您不需要您;如果您想改变自己想做的事情,则需要一个团队来支持它,但是没有地方可以带人。如果您想改变原始的理解,但始终对窗纸的模糊……如果您相信相信的力量,我相信普通人可以实现非凡的事物,并相信他们可以遇到更好的自我。您想参与推动业务的过程,促进技术团队的增长过程,并具有深入的业务理解,完美的技术系统,技术创建和有影响力的技术团队,我认为我们应该在任何时候进行交谈。 等待您写点东西,将其发送到ZCY-TC@CAI-FOUND
该文章同时发布,公共帐户
原始:https://juejin.cn/post/7103682267465121806