算法

迪杰斯特拉算法理解

你离开我真会死。 提交于 2020-02-22 12:34:01
算法简介 迪杰斯特拉算法解决了从某个源点到其余各个顶点的最短路径问题,它最主要的特点是从起始点开始,采用贪心的策略,每次遍历到起始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 算法描述 1、令 arcs 表示弧上的权值,若弧不存在,则设为无穷大; S 为已找到的从 v 出发的终点的集合,初始状态为空集。那么,从 v 出发到图上其余各顶点 vi 可能达到的长度的初值为 D = arcs[Locate Vex(G, vi)], vi ∈V ; 2、选择 vj ,使得 D [ j ] = Min{ D | vi ∈ V - S } ; 3、修改从 v 出发的到集合 V - S 中任一顶点 vk 的最短路径长度。 其他 用直白不严谨的话来说就是: 从起点 v0 出发,找到距离起点 最近 的点 vk ,进而根据 vk 到 vk 的邻接点的距离,更新(取最小值,例如:v0—>v1权值为1,v0—>v2权值为4,v1—>v2权值为2,那么v0—>v1—>v2权值为3,小于v0—>v2的权值,所以更新v0到v2的距离)起点 v0 到 vk 的这些邻接点的距离;再在这些距离中找到最近的点,依次循环,直到到达终点。 来源: CSDN 作者: ThetaQing 链接: https://blog.csdn.net/Thera_qing/article/details/104439573

限免 | 10000+人期待的联邦学习课程来了!0基础快速入门上手FATE

混江龙づ霸主 提交于 2020-02-22 05:41:59
随着用户数据安全和隐私保护相关政策相继出台,企业在给用户提供更好的创新服务时也面临着数据安全和用户隐私的问题。而联邦学习则能够帮助企业在符合数据安全和政策法规的前提下,持续更好地输出创新服务,提升服务质量。 目前,联邦学习技术已在金融风控、医疗健康、智能城市、智慧零售及云服务等多个行业、领域实现了应用落地,未来应用范围势必将更为广泛。因此,了解这门技术,将有助于开发者在逐步规范化的大数据环境下,更好地实现数据应用。项目GitHub:https://github.com/FederatedAI/FATE 而如果你要接触联邦学习,就一定绕不开一个开源框架—— FATE (Federated AI Technology Enabler) ,作为联邦学习全球首个工业级开源框架,FATE支持联邦学习架构体系,为机器学习、深度学习、迁移学习提供了高性能联邦学习机制,FATE本身还支持多种多方安全计算协议,如同态加密、秘密共享、哈希散列等,具有友好的跨域交互信息管理方案。 无论你是想入门这个经典的框架,还是已经在使用FATE了,这些问题或许都会在现在或将来出现: FATE的基本架构是怎样的?有何优势? 如何使用FATE集群部署完成环境搭建? FATE算法如何进行开发实战? 为了解答这些问题,让对机器学习、联邦学习感兴趣或正在研究应用的你能更深入掌握这一经典框架及其用法,官方团队特别推出了**

Learn&Fuzz:Machine Learning for Input Fuzzing

守給你的承諾、 提交于 2020-02-22 04:58:54
摘要 使用基于神经网络的机器学习技术自动生成符合语法的模糊测试输入 我们讨论(并实验比对)learning和fuzz目标之间的冲突关系:learing想要捕获合语法的输入输出的结构,而fuzz想要打破这种结构,以便覆盖新路径和发现bug。 提出了一种新的learning和fuzz挑战算法,该算法使用学习的输入概率分布来智能地指导fuzz输入的什么位置。 1. 简介 分析程序输入的语法的过程费时费力,而且容易出错。 但基于语法的fuzz是目前已知的最有效的模糊化技术。 与以往的工作相比,本文首次尝试使用基于神经网络的统计学习技术来解决这一问题。具体地说,我们使用RNN来学习同样具有生成性的统计输入模型:它可以用于根据学习模型的概率分布生成新的输入。我们使用无监督学习,全自动,不需要自定义任何特定格式。 讨论了learn&fuzz的挑战:如何学习并生成各种格式良好的输入,以便最大化fuzz解析器代码覆盖率,同时仍然注入足够的格式畸形的输入,以便执行意外的代码路径和错误处理代码。 我们还提出了一种新的学习和fuzz算法,该算法使用学习的输入概率分布来智能地指导fuzz(统计良好)输入的位置。实验结果表明,该算法的性能优于其他基于学习的随机fuzz算法。 2. Object Contents的统计机器学习 用统计学习方法来学习PDF对象的生成模型。主要思想是学习一个生成语言模型

浅谈负载均衡算法与实现

和自甴很熟 提交于 2020-02-22 04:54:03
浅谈负载均衡算法与实现 记得,我刚工作的时候,同事说了一个故事:在他刚工作的时候,他同事有一天兴冲冲的跑到公司说,你们知道吗,公司请了个大牛。大牛?对,那人会写AJAX!哇,真是大牛啊,跟着他,可以学不少东西啊。我听了笑了,但有点难以理解,因为现在几乎只要是一个开发,都会写AJAX,怎么写个AJAX就算大牛呢?后来我明白了,三年前高深莫测的技术到现在变得普普通通,不足为奇,就像我们今天要讲的负载均衡,在几何时,负载均衡只有大牛才能玩转起来,但是到今天,一个小开发都可以聊上几句。现在,就让我们简单的看看负载均衡把。 从负载均衡设备的角度来看,分为硬件负载均衡和软件负载均衡: 硬件负载均衡:比如最常见的F5,还有Array等,这些负载均衡是商业的负载均衡器,性能比较好,毕竟他们的就是为了负载均衡而生的,背后也有非常成熟的团队,可以提供各种解决方案,但是价格比较昂贵,所以没有充足的理由,充足的软妹币是不会考虑的。 软件负载均衡:包括我们耳熟能详的Nginx,LVS,Tengine(阿里对Nginx进行的改造)等。优点就是成本比较低,但是也需要有比较专业的团队去维护,要自己去踩坑,去DIY。 从负载均衡的技术来看,分为服务端负载均衡和客户端负载均衡: 服务端负载均衡:当我们访问一个服务,请求会先到另外一台服务器,然后这台服务器会把请求分发到提供这个服务的服务器,当然如果只有一台服务器

字符串模式匹配KMP算法

拥有回忆 提交于 2020-02-21 17:02:10
字符串模式匹配指的是,找出特定的模式串在一个较长的字符串中出现的位置。 朴素的模式匹配算法 很直观的可以写出下面的代码,来找出模式串在一个长字符串中出现的位置。 1: /* 2: 朴素的模式匹配算法 3: 功能:字符串的模式匹配 4: 参数: 5: s:目标串 6: p:模式串 7: pos:开发匹配的位置 8: 返回值: 9: 匹配成功,返回模式串在目标串的其实位置 10: 匹配不成功,返回-1 11: */ 12: int match(const char * s ,const char * p,int pos){ 13: int i = pos ; 14: int j= 0 ; 15: while(s[i] != '\0' && p[j] != '\0') { 16: if(s[i] == p[j]) { 17: i ++ ; 18: j ++ ; 19: }else { 20: i = i - j + 1; 21: j = 0 ; 22: } 23: } 24: 25: if(p[j] == '\0') 26: return i - j ; 27: else 28: return -1 ; 29: } 上面的代码,s就是目标串,p是模式串,pos指定从s的什么位置开始匹配p。其实现思想也很简单: 当s[i] == p[j]时,目标串和模式串的指针都向后移动一位,进行匹配

[置顶] Effective STL 学习笔记

久未见 提交于 2020-02-21 11:39:33
看Effective STL 作的一些笔记,希望对各位有帮助。 以下是50条条款及相关解释。 容器 1. 慎重选择容器类型,根据需要选择高效的容器类型。 2. 不要试图编写独立于容器类型的代码。 3. 确定容器中的对象拷贝正确而高效。也就是防止在存在继承关系时发生剥离。 4. 调用empty而不是检查size()是否为0来判断容器是否为空。 原因是调用empty比检查size()更加高效。 5. 尽量使用区间成员,而不是多次使用与之对应的单元素成员函数,原因是这样更加高效。 如尽量使用vector的 assign 或 insert 成员函数,而不是一直使用 push_back 。 6. 小心C++编译器最烦人的分析机制 。如 下面的代码中的第二句被C++解释成为了函数声明,这很奇怪但又符合标准。 ifstream dataFile ("ints.dat") list <int> data( istream_iterator<int>(dataFile), istream_iterator<int>() ); // 被解释成为函数声明 正确的写法是这样的,注意第一参数两边的括号: list <int> data( ( istream_iterator<int>(dataFile) ) , istream_iterator<int>() ); 这是因为C+

关于不使用选择结构建立由随机数组成但彼此不重复的数组的一个方法

烂漫一生 提交于 2020-02-21 11:19:11
本文核心:Knuth-Shuffle 洗牌算法 如果看到这里你心中已经明白这个算法是什么,那么你可以选择不接着往下看,尝试您心中所想。 正文如下: · 首先你需要知道Knuth-Shuffle 算法是个什么样的算法。 这是由 高纳德 提出的一个随机算法,算法如下: for ( int i = n - 1 ; i >= 0 ; i -- ) swap ( array [ i ] , array [ rand ( ) % ( i + 1 ) ] ; 这个算法在数学的概率上,做到了近乎公平的程度,其详细拓展在这不多做赘述。 到这里您应该明白我们会做什么。 首先我们需要建立一个数组,数组的长度取决于您所需要的数列的大小。 例如我们现在需要做一个30的数字内取5个不相等的随机数字,那么就可以建立一个 int x[30];的母数组。 是的,我知道您会说这是一个笨方法,当这个数字足够大,例如一亿的时候,它就会变得很鸡肋。 我承认,是这个道理。 甚至不需要到一亿的概念,哪怕只是到达一万,或者一千,我都不建议您这样做,使用随机(Random)+ 选择结构的方式不是更快吗? 不过呢,我认为在实际的程序设计中,很难接触到较大的数字。我在这里也只是提供一个思路。 回归正题。 建立完一个母数组之后,我们可以利用上面提到的算法,将这个数组进行“打乱”,然后,将前 x 个数字导出即可。此处的 x

五分钟自学编程:怎样才能学好笔试面试最爱考察的算法

两盒软妹~` 提交于 2020-02-21 02:59:47
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是算法 上回我们有一篇文章,讲述了作为一个新人程序员,如何学习数据结构这门课程,其实呢,数据结构和算法是息息相关的,为什么这么说呢,因为数据结构本身只是一个载体,而在数据结构之上产生作用和输出价值的东西其实是算法。 比如数据结构里的数组,看似非常简单的数据结构,却可以支持很多复杂的算法,比如动态规划,比如DFS和BFS,再比如字符串算法、二叉树算法等等。那么算法到底是什么东西呢,不妨让我们来看看官方的介绍。 根据百度百科的介绍,算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 其实,算法的本质就是给你一组输入,运算之后给你一组输出,因此,算法帮人们解决很多问题把抽象的问题具体化,把一个问题转化成另外一个问题。 认识算法的N个阶段 我第一次遇到算法题,还是在我考研复习数据结构的时候,那个时候我看到的算法题其实都是很基础的题目,比如把数组中的两个元素置换,把两个链表合并成一个,但对于我来说已经是很有难度的事情了,那时候我连伪代码是什么都还不懂。 第二次认识算法,还是在研究生期间找实习工作的时候

设计模式总篇-策略模式

会有一股神秘感。 提交于 2020-02-20 17:37:52
/* @作者:莫忘输赢 @时间: 2020/2/10 12:46 @版本:v1 @策略模式 @作用 定义算法家族,分别封装起来,让它们相互替换,让算法变化不会影响到用户 @优点 每个算法都有自己的类,算法经常变动,简化单元测试,解决的事经常变动的算法 @缺点 客户端要做出判断 */ #include <iostream> //#include<vld.h> //策略基类 class COperation { public: int fst; int sst; public: virtual double GetRst() { int dResult = 0; return 0; } }; //策略方法类 class AddOperation : public COperation { public: AddOperation(int a, int b){ fst = a; sst = b; } virtual double GetRst() { return fst + sst; } }; //上下文 class Context { private: COperation *_op; public: Context(char cType) { switch (cType) { case'+': _op = new AddOperation(3,8); break; default:

计算机图形学——直线扫描转换(基本光栅图形算法)

假装没事ソ 提交于 2020-02-20 04:43:53
一、直线生成基本思路 图形图像是由屏幕上不同亮度不同颜色的光点(像素)组成。在光栅显示器的荧光屏上生成一个对象,实质上是往帧缓存寄存器的相应单元中填入数据。 所以:对直线进行光栅化的时候,只能在显示器所给定的有限个像素组成的点阵中确定最佳逼近于该直线的一组像素,用这些像素表示该直线。 所以:生成直线的主要工作是:快速找出距离直线最近的网格点,用这些网格点对应的像素表示该直线。 如果我们使用斜截式方程来表示直线,会用到一次乘法和一次 加法,在计算机底层乘法是费时的,那么有什么方法可以改进? 变乘法为加法! 直线是象素集合,生成算法的最终目的,就是为了寻找能更准确逼近直线的象素点。 所以,要确定直线上每个点,那么,如:m<1时,从起始点xs,xs+1, xs+2, xs+3 ……到xe的每个点(xi,yi) ,需要确定其对应的象素值。 所以,每一个(xi,yi)即准确值,都要寻找对应其的象素值(xi,yi,r),即,最接近其准确值的整数值,最简单-取整 。 假设(xi,yi)已经确定了它的对应整数象素点,则下面就要找个规则确定下一个点即(xi+1, yi+1)的对应象素点。 对应于上述情况,即m<1的情况, xi+1=xi+1,即yi+1需要确定,即需要确定上述说的准则,即给定一个判定式,由判定式来确定yi+1的选择。 而判定式为了计算方便也可以有更简便的方式来计算