精华内容
下载资源
问答
  • Apriori算法和FP-Tree算法简介 本节主要描述了基于 Apriori 算法的关联分析方法为了克服 Apriori 算法在复杂度和效率方面的缺陷本节还进一步的介绍了基于 FP-Tree 的频繁模式挖掘方法 Apriori关联分析算法 Apriori ...
  • Boosting算法简介

    2018-07-27 18:15:07
    Boosting算法简介笔记 Boosting算法简介笔记 Boosting算法简介笔记
  • 常用算法简介 算法

    2012-05-08 21:21:44
    常用算法简介 算法,这个介绍了许多基本的算法
  • 蒙特卡罗算法简介 蒙特卡罗算法简介 蒙特卡罗算法简介
  • STL常用算法简介

    2017-11-14 14:13:12
    STL常用算法简介 STL常用算法简介 STL常用算法简介 STL常用算法简介 STL常用算法简介
  • 国密算法(国家商用密码算法简介).pdf
  • 机器学习算法简介

    2018-07-05 15:00:22
    机器学习算法简介,大概有10种常见算法 机器学习算法简介,大概有10种常见算法
  • 国密算法(国家商用密码算法简介)
  • PnP 算法简介 代码解析本期公开课将详细讲述常见的PnP求解算法。PnP求解算法是指通过多对3D与2D匹配点,在已知或者未知相机内参的情况下,利用最小化重投影误差来求解相机外参的算法。PnP求解算法是SLAM前端位姿跟踪...
  • 模拟退火算法算法简介及程序 模拟退火算法算法简介及程序 模拟退火算法算法简介及程序 模拟退火算法算法简介及程序 模拟退火算法算法简介及程序 模拟退火算法算法简介及程序 模拟退火算法算法简介及程序
  • EM算法简介

    2012-12-02 15:52:41
    EM算法简介 以及在HMM中的应用 以及EM算法的证明过程
  • 二分图匹配-匈牙利算法和KM算法简介.pptx
  • SM2算法和RSA算法简介

    千次阅读 2019-06-17 10:09:00
    国家密码管理局于2010年12月17日发布了SM2算法,并要求现有的基于RSA算法的电子认证系统、密钥管理系统、应用系统进升级改造,使用SM2算法。 SM2算法和RSA算法简介 RSA公钥加密算法是美国计算机学家R...

      SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能、速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法。国家密码管理局于2010年12月17日发布了SM2算法,并要求现有的基于RSA算法的电子认证系统、密钥管理系统、应用系统进升级改造,使用SM2算法。
      
      SM2算法和RSA算法简介
      
      RSA公钥加密算法是美国计算机学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,是最早的公钥加密算法之一,在全球范围被广泛使用。随着密码技术和计算机技术的发展,目前1024位RSA算法已经被证实存在被攻击的风险,美国NIST(国家标准技术研究院)在2010年要求全面禁用1024位RSA算法,升级到2048位RSA算法。此外,斯诺登事件爆发后,其泄露出的机密文档显示,RSA算法中可能存在NSA的预置后门,对RSA算法的安全性产生巨大影响。
      
      SM2算法由国家密码管理局于2010年12月17日发布,是我国自主设计的公钥密码算法,基于更加安全先进的椭圆曲线密码机制,在国际标准的ECC椭圆曲线密码理论基础上进行自主研发设计,具备ECC算法的性能特点并实现优化改进。
      
      SM2算法和RSA算法性能对比
      
      SM2算法和RSA算法都属于公钥加密算法,但两者分别基于不同的数学理论基础。与RSA算法相比,SM2算法具有抗攻击性强、CPU 占用少、内容使用少、网络消耗低、加密速度快等特点。
      
      (1)SM2算法与RSA算法安全性能对比
      
      RSA算法是基于大整数因子分解数学难题(IFP)设计的,其数学原理相对简单,在工程应用中比较易于实现,但它的单位安全强度相对较低。对大整数做因子分解的难度决定了RSA算法的可靠性,随着计算机运算速度的提高和分布式计算的发展,加上因子分解方法的改进,对低位数的密钥攻击已成为可能。
      
      ECC(EllipticCurves Cryptography,椭圆曲线密码编码学)是由Koblitz和Miller两人于1985年提出,其数学基础是基于椭圆曲线上离散对数计算难题(ECDLP)。ECC算法的数学理论非常深奥和复杂,在工程应用中比较难以实现,但它的单位安全强度相对较高。用国际上公认的针对ECC算法最有效的攻击方法——Pollard rho方法去破译和攻击ECC算法,它的破译或求解难度基本上是指数级的。
      
      因此,ECC算法的单位安全强度远高于RSA算法,可以用较少的计算能力提供比RSA算法更高的安全强度,而所需的密钥长度却远比RSA算法低。目前,基于ECC的SM2证书普遍采用256位密钥长度,加密强度等同于3072位RSA证书,远高于业界普遍采用的2048位RSA证书。
      
      此外,为了提高安全强度必须不断增加密钥长度,ECC算法密钥长度增长速度较慢(例如:224-256-384),而RSA算法密钥长度则需呈倍数增长(例如:1024-2048-4096)。
      
      (2)SM2算法与RSA算法速度性能对比
      
      在TLS握手过程中,更长的密钥意味着必须来回发送更多的数据以验证连接,产生更大的性能损耗和时间延迟。因此,ECC算法能够以较小的密钥和较少的数据传递建立HTTPS连接,在确保相同安全强度的前提下提升连接速度。经国外有关权威机构测试,在Apache和IIS服务器采用ECC算法,Web服务器响应时间比RSA算法快十几倍。
      
      SM2算法的优化和先进性
      
      SM2算法是我国基于ECC椭圆曲线密码理论自主研发设计,由国家密码管理局于2010年12月17日发布,在密码行业标准GMT 0003.1-2012 SM2 总则中推荐了一条256位曲线作为标准曲线,数字签名算法、密钥交换协议以及公钥加密算法都根据SM2总则选取的有限域和椭圆曲线生成密钥对;在数字签名、密钥交换方面区别于ECDSA、ECDH等国际算法,而是采取了更为安全的机制,提高了计算量和复杂性;在数字签名和验证、消息认证码的生成与验证以及随机数的生成等方面,使用国家密管理局批准的SM3密码杂凑算法和随机数生成器。SM3杂凑算法是我国自主设计的密码杂凑算法,安全性要高于MD5算法(128位)和SHA-1算法(160位),SM3算法的压缩函数与SHA-256具有相似结构,但设计更加复杂;SM4分组密码算法是我国自主设计的分组对称密码算法,与AES算法具有相同的密钥长度128位,在安全性上高于3DES算法,在实际应用中能够抵抗针对分组密码算法的各种攻击方法。
      
      SM2算法的应用推广
      
      密码算法的安全性是信息安全保障的核心,通过自主可控的国产密码技术保护重要数据的安全,是有效提升我国信息安全保障水平的重要举措。我国大力推动SM2国产密码算法替换目前所采用的RSA算法,一方面规避RSA算法存在的脆弱性和“预置后门”等安全风险,另一方面确保密码算法这一关键环节的自主可控,保障我国信息安全基础设施的安全可信。中办2018年36号文件《金融和重要领域密码应用与创新发展工作规划(2018-2022年)》以及相关法规文件均要求我国金融和重要领域密码应用采用SM2国产密码算法体系。
      
      然而,由于国密算法尚未实现广泛兼容,在主流浏览器、操作系统等终端环境中不受信任,面向互联网的产品应用中采用国产密码算法将无法满足可用性、易用性和全球通用性的需求,在实际应用中很难真正落地实施。
      
      const response = {
      
      settings: {
      
      nullValue: null,
      
      height: 400,
      
      animationDuration: 0,
      
      headerText: '',
      
      showSplashScreen: false
      
      }
      
      };
      
      const undefinedValue = response.settings?.undefinedValue ?? 'some other default'; // result: 'some other default'
      
      const nullValue = response.settings?.nullValue ?? 'some other default'; // result: 'some other default'
      
      const headerText = response.settings?.headerText ?? 'Hello, world!'; // result: ''
      
      const animationDuration = response.settings?.animationDuration ?? 300; // result: 0
      
      const showSplashScreen = response.settings?.showSplashScreen ?? true; // result: false
      
      0 || 1 的结果是 1,因为 0 判定为 false,而 || 在前面的变量为 false 型才继续执行,而我们想要的是 “前面的对象不存在时才使用后面的值”。?? 则代表了 “前面的对象不存在” 这个含义,即便值为 0 也会认为这个值是存在的。
      
      Optional chaining 也可以用在方法上:
      
      iterator.return?.()
      
      或者试图调用某些未被实现的方法:
      
      if (myForm.checkValidity?.() === false) { // skip the test in older web browsers
      
      // form validation fails
      
      return;
      
      }
      
      比如某个旧版本浏览器不支持 myForm.checkValidity 方法,则不会报错,而是返回 false。
      
      已有实现调研
      
      Optional chaining 在 C#、Swift、CoffeeScript、Kotlin、Dart、Ruby、Groovy 已经实现了,且实现方式均有差异,可以看到每个语言在实现语法时都是有取舍的,但是大方向基本是相同的。
      
      想了解其他语言是如何实现 Optional chaining 的读者可以 点击阅读原文。
      
      这些语言实现 Optional chaining 的差异基本在 语法、支持范围、边界情况处理 等不同,所以如果你每天要在不同语言之间切换工作,看似相同的语法,但不同的细节可能把你绕晕(所以会的语言多,只会让你变成一个速记字典,满脑子都是哪些语言在哪些语法讨论倾向哪一边,选择了哪些特性这些毫无意义的结论,如果不想记这些,基础语法都没有掌握怎么好意思说会这门语言呢?所以学 JS 就够了)。
      
      语法
      
      Optional Chaining 的语法有三种使用场景:
      
      obj?.prop // optional static property access
      
      obj?.[expr] // optional dynamic property access
      
      func?.(...args) // optional function or method call
      
      也就是将 . 替换为 .?,但要注意第二行与第三行稍稍有点反直觉,比如在函数调用时,需要将 func(...args) 写为 func?.(...args)。至于为什么语法不是 func?(...args) 这种简洁一点的表达方式,在 FAQ 中有提到这个例子:
      
      obj?[expr].filter(fun):0 引擎难以判断 obj?[expr] 是 Optional Chaning,亦或这是一个普通的三元运算语句。
      
      可见,要支持 .? 这个看似简单的语法,在整个 JS 语法体系中要考虑的边界情况很多。
      
      即便是 .? 这样完整的用法,也需要注意 foo?.3:0 这种情况,不能将 foo?. 解析为 Optional chanining,而要将其解析为 foo? .3 : 0,这需要解析引擎支持 lookahead 特性。
      
      语义
      
      当 .? 前面的变量值为 null 或 undefined 时,.? 返回的结果为 undefined。
      
      a?.b // undefined if `a` is null/undefined, `a.b` otherwise.
      
      a == null ? undefined : a.b
      
      a?.[x] // undefined if `a` is null/undefined, `a[x]` otherwise.
      
      a == null ? undefined : a[x]
      
      a?.b() // undefined if `a` is null/undefined
      
      a == null ? undefined : a.b(www.chenhaopt.cn) // throws a TypeError if `a.b` is not a function
      
      // otherwise, evaluates to `a.b()`
      
      a?.() // undefined if `a` is null/undefined
      
      a == null ? undefined : a(www.yifayuLed.cn) // throws a TypeError if `a` is neither null/undefined, nor a function
      
      // invokes the function `a` otherwise
      
      短路
      
      所谓短路,就是指引入了 Optional chaining 后,某些看似一定会执行的语句在特定情况下会短路(终止执行),比如:
      
      a?.[++x] // `x` is incremented if and only if `www.sengshiyuLe.cn` is not null/undefined
      
      a == null ? undefined : a[++x]
      
      第一个例子,如果 a 时 null/undefined,就不会执行 ++x。
      
      原因是这段代码部分等价于 a == null ? undefined : a[++x],如果 a == null 为真,自然不会执行 a[++x] 这个语句。但由于 Optional chaining 使这个语句变得 “简洁了”,虽然带来了便利,但也可能导致看不清完整的执行逻辑,引发误判。
      
      所以看到 ?. 语句时,一定要反射性的思考一下,这个语句会触发 “短路”。
      
      长“短路”
      
      Optional chaining 在 JS 的规范中,作用域仅限于调用处。看下面的例子:
      
      a?.b.c(++x).d // if `a` is null/undefined, evaluates to undefined. Variable `x` is not incremented.
      
      // otherwise, evaluates to `a.b.c(++x).d`.
      
      a == null ? undefined : a.b.c(++x).d
      
      可以看到 ?. 仅在 a?. 这一层生效,而不是对后续的 b.c、c(++x).d 继续生效。而对于 C+ 与 CoffeeScript,这个语法是对后续所有 get 生效的(这里再次提醒,不要用 CoffeeScript 了,因为对于相同语法,语义都发生了变化,对你与你的同事都是巨大的理解负担,或者说没有人愿意注意,为什么代码在 CoffeeScript 里不报错,而转移到 JS 就报错了,是因为 Optional chaining 语义不一致造成的。)。
      
      正因为 Optional chaining 在 JS 语法中仅对当前位置起保护作用,因此一个调用语句中允许出现多个 .? 调用:
      
      a?.b[3].c?.(x).d
      
      a == null ? undefined : a.b[www.csyLdL.com].c == null ? undefined : a.b[3].c(x).d
      
      // (as always, except that `a` and `a.b[3].c` are evaluated only once)
      
      上面这段代码,对 a.?b、c?.(www.chaoyuL.com) 的访问与调用是安全的,而对于 b[3]、 b[3].c、c?.(x).d 的调用是不安全的。
      
      在 FAQ 环节也提到了,为什么不学习 C# 与 CoffeeScript 的语义,将安全保护从 a?. 之后就一路 “贯穿” 下去?
      
      原因是 JS 对 Optional chaining 的理解不同导致的。Optional chaining 仅仅是安全访问保护,不代表 try catch,也就是它不会捕获异常,举一个例子:
      
      a?.b()
      
      这个调用,在 a.b 不是一个函数时依然会报错,原因就是 Optional chaining 仅提供了对属性访问的安全保护,不代表对整个执行过程进行安全保护,该抛出异常还是会抛出异常,因此 Optional chaining 没有必要对后面的属性访问安全性负责。
      
      笔者认为 TC39 对这个属性的理解是合理的,否则用 try catch 就能代替 Optional chaining 了。让一个特性仅实现分内的功能,是每个前端从业者都要具备的思维能力。
      
      PS:笔者再多提一句,在任何技术设计领域,这个概念都适用。想想你设计的功能,写过的函数,如果为了图方便,扩大了其功能,终究会带来整体设计的混乱,适得其反。
      
      边界情况 - 分组
      
      我们知道,JS 代码可以通过括号的方式进行分组,分组内的代码拥有更高的执行优先级。那么在 Optional chaining 场景下考虑这个情况:
      
      (a?.b).c
      
      (a == null ? undefined : a.b).c
      
      与不带括号的进行对比:
      
      a?.b.c
      
      a == null ? undefined : a.b.c
      
      我们会发现,由于括号提高了优先级,导致在 a 为 null/undefined 时,解析出了 undefined.c 这个必定报错的荒谬语法。因此我们不要试图为 Optional chaining 进行括号分组,这样会打破逻辑顺序,使安全保护不但不生效,反而导致报错。
      
      Optional delete

    转载于:https://www.cnblogs.com/qwangxiao/p/11038238.html

    展开全文
  • PSO算法详细资料,算法简介PSO算法详细资料,算法简介PSO算法详细资料,算法简介PSO算法详细资料,算法简介PSO算法详细资料,算法简介PSO算法详细资料,算法简介PSO算法详细资料,算法简介PSO算法详细资料,算法简介PSO算法...
  • ElGamal加密算法简介

    千次阅读 2020-12-28 17:07:42
    上一篇介绍了非对称加密算法中的RSARSA算法简介,这次看一下ElGamal算法。 首先它是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。它在1985年由塔希尔·盖莫尔提出。它可以定义在任何循环群G上。它的安全性取决于G...

    简介

    上一篇介绍了非对称加密算法中的RSARSA算法简介,这次看一下ElGamal算法。
    首先它是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。它在1985年由塔希尔·盖莫尔提出。它可以定义在任何循环群G上。它的安全性取决于G上的离散对数难题。(RSA基于大数的因数分解)

    在介绍算法原理之前先熟悉几个概念:

    设n>1,a和n互质,则必有一个x (1≤x ≤n-1)使得: ax ≡ 1 (mod n )
    满足ax ≡ 1 (mod n ) 的最小整数x , 称为a模n的阶。符号表示为Ordn(a)

    观察方程 ax ≡1(modn) 根据欧拉定理,显然我们可以知道φ(n) 是方程的一个解,但它未必是最小的,所以不一定是阶,而当φ(n) 是a模n的阶时,我们称a为n的一个本原元。

    本原元

    当a模n的阶为φ(n),也就是说当且仅当x是φ(n)的倍数,使得ax ≡1(mod n)成立,此时称a为n的本原元。
    举个例子:
    在这里插入图片描述
    这些余数构成了一个模7的完全剩余系1,2,3,4,5,6,也就是对于任意a,都可以找到x0使得:
    5x0 ≡a (mod 7)。

    本原元求解Python:

    # 用辗转相除求最大公因子
    def gcd(a, b):
        r = a % b
        while r != 0:
            a = b
            b = r
            r = a % b
        return b
    
    
    # 欧拉函数
    def euler(a):
        cnt = 0
        for i in range(1, a):
            if gcd(a, i) == 1:
                cnt += 1
        return cnt
    
    
    # 阶
    def order(a, n, b):
        #   输出b在mod(a)中的阶
        #   n是mod(a)群的阶
        p = 1
        while p <= n and b ** p % a != 1:
            p += 1
        if p <= n:
            return p
        else:
            return -1
    
    
    # 求本原元
    def primitive_root(a):
        n = euler(a)
        for b in range(2, a):
            if order(a, n, b) == n:
                return b
    
    print(primitive_root(37))
    # 可以看到,是2
    

    算法流程

    在这里插入图片描述
    同样是通过一个案例来介绍,还是Alice欲使用ElGamal加密算法向 Bob 发送信息。。

    1.密钥生成

    1. 对于Bob,首先要随机选择一个大素数p,且要求p-1有大素数因子。再选择一个模p的本原元α。将p和α公开。我们为了方便计算取p = 37,则Z37的一个本原元α = 2.

    2. 随机选择一个整数d作为密钥,2≤d≤p-2 。我们选择d = 5,

    3. 计算β=αd mod p,β=25 mod 37 = 32

    2.加密

    假设Alice 想发送消息 x = 29

    1. 首先选取随机数k , 假设k = 7
      则: y1 = αk mod p = 27 mod 37 = 17
      y2 = x βk mod p = 29×327 mod 37 = 33
    2. 将密文y = (17,33)发送给Bob

    3.解密

    Bob收到密文y = (17,33) 后恢复明文如下:
    x = y2 (y1d) -1 mod p
    = 33 (175) -1 mod 37
    = 33×2 mod 37
    = 29

    展开全文
  • BLAST算法 简介

    2010-03-19 21:43:32
    BLAST算法简介,生物信息,序列处理,基因,蛋白质序列的处理算法
  • Dijkstra算法简介

    千次阅读 2018-06-01 11:48:15
    Github-blog CSDN 本文将介绍域间路由中...Dijkstra算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法。算法解决的是有向...

    Github-blog
    CSDN

    本文将介绍域间路由中使用Dijkstra算法进行求解最短路径。本文将从算法介绍,算法实现,代码解析三个方面进行展开。完整代码在bitbucket上。

    Dijkstra算法简介

    Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法。算法解决的是有向图中单个源点到其他顶点的最短路径问题,其主要特点是每次迭代时选择的下一个顶点是标记点之外距离源点最近的顶点。

    Dijkstra算法实现

    本文的域间路由最短路径算法通过修改Dijkstra算法的路径权重进行实现,其算法时间复杂度为O(n2),具体过程如下:
    (1)创建两个空集合openSet和closeSet,将源自治系统编号添加到closeSet,将其他所有的自治系统编号添加到openSet中;
    (2)针对每个自治系统创建一个数据结构,包括前一跳自治系统编号,以及达到源自治系统的路径权重(初始值为无穷),源自治系统前一跳为自身,路径权重为0;
    (3)针对openSet中的每个自治系统,寻找到达closeSet中最短的链路,并更新openSet中自治系统的权值和前一跳自治系统编号,将更新后的路径权重最小的记作minW,对应的自治系统编号记作minAS;
    (4)若minW非无穷,将minAS从openSet中删除,并添加到closeSet中;
    (5)若openSet非空且存在openSet到达closeSet的链路,跳到第3步;否则进入第6步;
    (6)通过各自治系统的前一跳信息,找到源自治系统到达所有其他自治系统的最优路径,结束。

    Dijkstra算法代码实现

    数据结构

    在介绍具体实现函数之前,我们先对主要的数据结构进行简单介绍:

    Link:相邻节点间的链路信息;
    Map<Integer,Map<Integer,Link>>NIB: <源节点,<目的节点,源目的间Link>>存放网络拓扑信息;
    Set<Integer> ASNodeNumList: 所有节点的集合;
    Map<Integer, Integer> perviousNode:记录节点的前驱节点,用来串成源到目的的完整路径;
    ASPath:记录源到目的的路由路径;
    Map<Integer,Map<Integer,ASPath>> RIBFromlocal:记录源到所有目的的路由路径。

    MultiPathInit主要初始化了各个节点间的原始距离。

    核心函数实现

    此处主要介绍三个函数,MultiPathInitshortestNode,以及calculatePath
    完整代码在bitbucket上。
    MultiPathInit: 初始化各节点到达源节点的距离;
    shortestNode:选取open集合中达到close集合距离最近的节点;
    calculatePath:计算所有节点的前驱节点。

    /**
     * Init the MultiPath data.
     * @param ASNumSrc
     * @param NIB
     * @param ASnodeList
     * @param ASNodeNumList
     * @author xftony
     */
    public void MultiPathInit(Integer ASNumSrc, Map<Integer,Map<Integer,Link>>NIB, Set<Integer> ASNodeNumList){
        if(NIB==null){
            System.out.printf("!!!!!!!!!!!!!NIB is null!!!!!!!!!");
            return ;
        }
    
        this.open = new HashSet<Integer>();
        this.close = new HashSet<Integer>();
        this.WeightMap = new HashMap<Integer, Attribute>(); //ASnodeDestNum, val; 
        this.perviousNode = new HashMap<Integer, Integer>(); //ASnodeDestNum, previousNodeNum;  
    
        for(Integer ASNodeNum : ASNodeNumList){
            Attribute tmpAttri = new Attribute();
            if(!ASNodeNum.equals(ASNumSrc))
                open.add(ASNodeNum);
            else 
                close.add(ASNumSrc);
            if(NIB.containsKey(ASNumSrc) && NIB.get(ASNumSrc).containsKey(ASNodeNum) 
                    && NIB.get(ASNumSrc).get(ASNodeNum).started){
                tmpAttri.bandwidth   = NIB.get(ASNumSrc).get(ASNodeNum).bandWidth;
                tmpAttri.brokenTimes = NIB.get(ASNumSrc).get(ASNodeNum).failed - NIB.get(ASNumSrc).get(ASNodeNum).failedOld;
                tmpAttri.latency     = 1;
                tmpAttri.weight      = 1;
                WeightMap.put(ASNodeNum, tmpAttri);
                perviousNode.put(ASNodeNum, ASNumSrc);  
            }
            else if(ASNumSrc.equals(ASNodeNum)){
                tmpAttri.bandwidth = Integer.MAX_VALUE;
                tmpAttri.latency   = 0;
                tmpAttri.weight    = 0;
                WeightMap.put(ASNodeNum, tmpAttri);
                perviousNode.put(ASNodeNum, ASNumSrc);
            }
            else {
                WeightMap.put(ASNodeNum, tmpAttri);
                perviousNode.put(ASNodeNum, unKnowASnum);       
            }
        }
    
    }
    
    /**
     * get the shorest node(the hole path's Weight is min) from openNodes to ASnumInClose
     * @param NIB
     * @param ASnumInClose
     * @return
     * @author xftony
     */
    public ASSection shortestNode(Map<Integer,Map<Integer,Link>>NIB){
        if(close.isEmpty()||open.isEmpty()) 
            return null;
        boolean flag = false;
        int NodeNumInClose = 0;
        int NodeNumInOpen = 0;
        int minValue = Integer.MAX_VALUE;
        Attribute tmpAttribute = new Attribute();
        int tmpWeight = Integer.MAX_VALUE;
        int tmpLatency = 0;
        int tmpBandwidth = Integer.MAX_VALUE;
        ASSection section = new ASSection();
        for(Integer nodeOpen : open){           
            for(Integer nodeClose :close){
                if(NIB.containsKey(nodeClose) && NIB.get(nodeClose).containsKey(nodeOpen) 
                        && NIB.get(nodeClose).get(nodeOpen).started
                        && NIB.get(nodeClose).get(nodeOpen).getBandwidth()> minBandWidth){          
                    tmpBandwidth = WeightMap.get(nodeClose).bandwidth < NIB.get(nodeClose).get(nodeOpen).getBandwidth()?
                            WeightMap.get(nodeClose).bandwidth : NIB.get(nodeClose).get(nodeOpen).getBandwidth();
                    if(tmpBandwidth < minBandWidth)
                        continue;
                    tmpWeight = pathValue(WeightMap.get(nodeClose).weight, NIB.get(nodeClose).get(nodeOpen).failed - NIB.get(nodeClose).get(nodeOpen).failedOld ); //src to dest
                    tmpLatency   = this.WeightMap.get(nodeClose).latency + 1;
                    if(minValue > tmpWeight){
                        minValue = tmpWeight;
                        tmpAttribute.bandwidth = tmpBandwidth;
                        tmpAttribute.latency   = tmpLatency;
                        tmpAttribute.weight    = tmpWeight;
                        tmpAttribute.linkID    = NIB.get(nodeClose).get(nodeOpen).linkID;
                        NodeNumInClose = nodeClose;
                        NodeNumInOpen  = nodeOpen;
                    }
                    flag = true;
                }
            }
        }
        if(!flag || tmpAttribute.bandwidth < minBandWidth) //there is no link between open and close, double check the bandwidth
            return null;
        section.ASNumSrc  = NodeNumInClose;
        section.ASNumDest = NodeNumInOpen;
        section.attribute = tmpAttribute;
        return section;
    }
    
    /**
     * calculate the shortest Path for the topo, the path is store in perviousNode
     * @param ASnumInClose
     * @param NIB
     * @author xftony
     */
    public void calculatePath(Map<Integer,Map<Integer,Link>>NIB){
        if(NIB.isEmpty())
            return;
        ASSection newSection = shortestNode(NIB);
        if(newSection != null){
            close.add(newSection.ASNumDest);
            open.remove(newSection.ASNumDest);
            int tmpDealyPre = this.WeightMap.get(newSection.ASNumDest).weight;
            int tmpDealyCur = newSection.attribute.weight;
    
            if(tmpDealyPre > tmpDealyCur){      
                this.WeightMap.put(newSection.ASNumDest, newSection.attribute);
                this.perviousNode.put(newSection.ASNumDest, newSection.ASNumSrc);
            }
            calculatePath(NIB);
        }
    }
    

    以上~

    展开全文
  • TLD算法简介

    千次阅读 2017-11-25 17:46:22
    TLD算法简介TLD(Tracking-Learning-Detection)是 Zdenek Kalal 等人于 2009 至2012 年期间提出的单目标、长时间图像跟踪算法。与传统的单一跟踪算法相比,TLD 跟踪算法融合了跟踪器、检测器和学习模块三个部分,既...
    1. TLD算法简介

      TLD(Tracking-Learning-Detection)是 Zdenek Kalal 等人于 2009 至2012 年期间提出的单目标、长时间图像跟踪算法。与传统的单一跟踪算法相比,TLD 跟踪算法融合了跟踪器、检测器和学习模块三个部分,既能够对连续运动目标进行跟踪,又能够对遮挡再现目标重新检测跟踪,抗遮挡性能优越。在整个跟踪过程中,学习模块对检测器进行实时更新,既能保持检测器的先进性,又能保证模板不发生漂移,是一种具有完善结构的图像跟踪算法。

    TLD 算法框架图
    TLD 算法主要由检测模块、跟踪模块、学习模块和整合器构成。检测模块采用级联分类器的形式进行检测,首先,对再现目标进行方差过滤,滤除环境中方差比较小的图像块,比如环境中天空背景、墙壁等;其次,对剩余的图像块进行随机蕨分类,随机蕨分类器采用半监督学习的方式进行训练跟踪,随时使用最先进的分类参数进行分类;最后,对剩余的一小部分图像块进行最近邻分类,选择与目标模型中相似度最大的图像块,作为最终的检测结果。跟踪模块采用中值光流法,先在跟踪框中随机均匀撒点,然后对特征点进行光流场估计,跟踪获得下一帧中特征点的位置,然后判断前向-后向误差,根据此误差判断跟踪是否失败。学习模块包括目标模型和对检测器、目标模型更新的法则。学习模块根据 P-N 约束来进行正负模板的更新,将最近邻分类器分类错误的图像块添加至正负模板集中。此正负模板作为目标模型的构成,在检测器进行最近邻分类时作为分类依据。同时,学习模块还不断更新随机蕨检测器的后验概率值,保持了随机蕨能够实时适应跟踪目标和环境的变化。

    展开全文
  • LSTM原理及算法简介

    2018-07-11 15:50:07
    网上收集整理的关于LSTM循环神经网络的原理及算法简介
  • 商用密码算法简介

    千次阅读 2020-08-15 19:22:51
    商用密码算法简介商密算法概述对称密码算法对称算法概述序列密码和分组密钥的区别分组密码的工作模式公钥密码算法公钥密码算法模型SM2公钥算法SM9公钥算法对比杂凑算法概述密码杂凑算法的应用对比 商密算法概述 现代...
  • Pid控制算法-模糊算法简介

    万次阅读 多人点赞 2017-04-19 16:15:29
    九 模糊算法简介 在PID控制算法的C++语言实现中,文章已经对模糊PID的实质做了一个简要说明。基本概念和思路进行一下说明,相信有C++语言基础的朋友可以通过这些介绍性的文字自行实现。这篇文章主要说明一下模糊...
  • 机器学习算法之em算法简介及代码

    热门讨论 2011-03-08 02:57:36
    em算法简介及代码。EM算法是机器学习中一个很重要的算法,即期望最大化算法,主要包括以下两个步骤: E步骤:estimate the expected values M步骤:re-estimate parameters 迭代使用EM步骤,直至收敛。
  • CLRS算法Python实现 算法简介-教科书中所有主要算法的Python实现以及艾伯塔大学算法课程204和304涵盖的其他算法。 -罗伯特
  • DL之BP:神经网络算法简介之BP算法简介(链式法则/计算图解释)、案例应用之详细攻略 相关文章:DL之DNN之BP:神经网络算法简介之BP算法/GD算法之不需要额外任何文字,只需要八张图讲清楚BP类神经网络的工作原理 ...
  • 路径规划算法简介

    千次阅读 2019-09-24 01:50:29
    路径规划算法简介 1.涉及问题: 这里的路径规划是指如何寻找一条从给定起点到终点的路径,使机器人沿该路径移动的过程中不与障碍物发生碰撞且路程最短或移动代价最小。 2.简要介绍的算法: 1.遗传算法; 2.模拟退火...
  • Online Learning 算法简介

    2015-05-18 18:35:58
    Online Learning 算法简介,希望可以对理解Online Learning 算法有所帮助!
  • SIFT算法简介

    千次阅读 2017-11-27 11:30:54
    SIFT算法简介  SIFT算子是一种图像的局部描述子,具有尺度、旋转、平移的不变性,而且对光照变化、仿射变换和3维投影变换具有一定的鲁棒性。在Mikolajczyk(在参考文献中有个下载链接,包括了这些论文,0积分)...
  • 贪心算法是一个比较常用的算法…… 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。  贪心算法不是对所有问题都...
  • 第12讲 智能优化算法自学 智能优化算法简介 遗传算法简介 基本遗传算法 改进的遗传算法 遗传算法软件计算 智能优化算法简介 一 传统优化算法的步骤及局限性 1 步骤 1选择一个初始解 2向改进方向移动判断停止准则是否...
  • 亚马逊推荐算法简介

    万次阅读 2016-05-02 23:04:28
    亚马逊推荐算法简介 众所周知,传统的推荐算法大致分为3类: 协同过滤(Collaborative Filtering) 聚类模型(Cluster Model) 基于搜索的推荐

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,313
精华内容 92,925
关键字:

算法简介