算法

数据结构算法

天大地大妈咪最大 提交于 2020-03-12 05:03:53
数据结构 KMP算法 KMP算法 用途:主要是避免字符串进行重复遍历 视频 : 来源: CSDN 作者: qq_21197023 链接: https://blog.csdn.net/qq_21197023/article/details/104803216

机器学习复习8-SVM

若如初见. 提交于 2020-03-12 04:10:07
SVM 请先阅读前一篇文章 机器学习复习7-拉格朗日对偶性(为SVM做准备) 不然这篇文章很难看懂。 1.明确目标 所以目标明确了。 2.使用拉格朗日对偶性 上图其实就是原始优化问题 p p p 那么我们引入拉格朗日函数的极小极大问题来等效原始优化问题 p p p 。 当 α i ≥ 0 α_i ≥ 0 α i ​ ≥ 0 且 C i ( x ) ≤ 0 C_i(x) ≤ 0 C i ​ ( x ) ≤ 0 时,才能构造这样的拉格朗日函数。 然后我们取拉格朗日函数的极小极大问题来等效 p p p : 利用对偶性,可转化为: 但是 这个等效是需要满足2个条件,外加KKT条件约束最优解 ,得到的才是最优解。这里不作过多解释,具体解释上一篇文章已经描述的很详细了。 所以 接下来的任务就是求解上图的公式 。 很多人以为是把4.13,4.14代入3.7中,其实不是的,我们代入的是对偶问题中的最小值问题中。再把4.15放到4.12的对偶问题中,同时考虑KKT条件的约束,也就是说我们既满足2个条件,又要满足KKT条件。 接下来我们又可以得到: 现在我们其实已经可以解这个问题了,一个完全的凸二次规划问题,理论上你用任何一个解决凸二次规划的软件包都可以解决,但是这样通常来说很慢,大数据情况下尤其不实际。 所以我们一般引入 SMO算法 。 3.SMO算法 先介绍下坐标上升算法

用户密码到底要怎么加密存储?

隐身守侯 提交于 2020-03-12 04:07:37
作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密或者加密方式比较弱,导致黑客可以还原出原始的用户密码。 目前已经曝光的信息泄露事件至少上百起,其中包括多家一线互联网公司,泄露总数据超过10亿条。 要完全防止信息泄露是非常困难的事情,除了防止黑客外,还要防止内部人员泄密。但如果采用合适的算法去加密用户密码,即使信息泄露出去,黑客也无法还原出原始的密码(或者还原的代价非常大)。 也就是说我们可以将工作重点从防止泄露转换到防止黑客还原出数据。下面我们将分别介绍用户密码的加密方式以及主要的破解方法。 一、用户密码加密 用户密码保存到数据库时,常见的加密方式有哪些,我们该采用什么方式来保护用户的密码呢?以下几种方式是常见的密码保存方式: 1、直接明文保存,比如用户设置的密码是“123456”,直接将“123456”保存在数据库中,这种是最简单的保存方式,也是最不安全的方式。但实际上不少互联网公司,都可能采取的是这种方式。 2、使用对称加密算法来保存,比如3DES、AES等算法,使用这种方式加密是可以通过解密来还原出原始密码的,当然前提条件是需要获取到密钥。不过既然大量的用户信息已经泄露了,密钥很可能也会泄露,当然可以将一般数据和密钥分开存储、分开管理,但要完全保护好密钥也是一件非常复杂的事情

几种限流算法

99封情书 提交于 2020-03-12 02:13:28
漏桶算法 思路很简单,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快,则会直接溢出,也就是拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。 该算法很好的解决了时间边界处理不够平滑的问题,因为在每次请求进桶前都将执行“漏水”的操作,再无边界问题。 但是对于很多场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。 令牌桶算法 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 来源: CSDN 作者: 茴香豆的茴有六种写法 链接: https://blog.csdn.net/reed1991/article/details/104805942

数组移动算法

帅比萌擦擦* 提交于 2020-03-12 01:50:57
ASH前段时间贴出了一个问题: 对于有K个元素的数组 int a[K]={....};写一个高效算法将数组内容循环左移m位 比如: int a[6] ={1,2,3,4,5,6} ,循环左移3位得到结果{456123}, 要求: 1不允许另外申请数组空间,但可以申请少许变量 2不允许采用每次左移 这是一个有趣的问题,当时ASH给出了一个很简单的解法: 1、将整个数组倒排; 2、将前k-m个元素和剩下的m个元素分别倒排。 这个算法需要对每个数组元素做两次写操作,所以我当时在考虑,有没有一种方法,只对数组元素进行一次写操作就完成移动? 最直观的想法,就是从第一个元素开始,把它一步移动到最终的目的位置,而该位置原有的元素的值取出,移动到它的新位置。递归进行这个步骤。 首先,我们在数学上很容易理解,这是一个一一对应的映射,绝不会在一个位置上出现两次移动。所以不会出现移动的递归过程中途指向了已经移动过的元素。 那么,这个递归过程唯一的终止条件就是,当前移动的元素,目的位置是移动过程的起始位置。 有兴趣的朋友不妨在纸上推演一下这个过程,并不复杂。多试验几种组合,细心的朋友也许会发现,这个递归过程有时候可以遍历整个数组,有时候则会跳过若干元素。这其中有没有什么规律? 如果按照元素的索引下标标示元素,0到k-1中的任意元素i,会移动到什么位置? 如果i小于m,它会移动到k-m+i,否则

js数据结构与算法存储结构

孤街醉人 提交于 2020-03-12 01:50:30
数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合。 传统上,我们把数据结构分为逻辑结构和物理结构。 逻辑结构: 是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题。 物理结构: 是指数据的逻辑结构在计算机中的存储形式。 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash) 栈(stack):运算只在表的一端进行;队列(Queue):运算只在表的两端进行。 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表。 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。 四大结构 集合结构 线性结构 树形结构 图形结构 顺序存储和链式存储 数据元素的存储结构形式有两种:顺序存储和链式存储。 例如我们编程语言的数组结构就是这样滴。 链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。 链式存储结构 线性表 线性表:就好像是排队一样,具有线一样性质的结构,它是由零个或多个数据元素组成的有限序列。 若元素存在多个

python数据结构与算法基础名词积累

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-12 01:47:23
记录: 算法,很早之前,我就知道是特别重要一环;但是,今天,看到一个简单例子,第一次被震撼了。 算法: 算法是独立存在的一种解决问题的方法和思想。 算法五大特性: 输入: 算法具有0个或多个输入 输出: 算法至少有1个或多个输出 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 确定性:算法中的每一步都有确定的含义,不会出现二义性 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成 大O记法: 对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n)<=c*g(n),就说函数g是f的一个渐近函数(忽略常数),记为f(n)=O(g(n))。也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。 时间复杂度: 假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐近时间复杂度,简称时间复杂度,记为T(n)。 时间复杂度排序: 最优时间复杂度: 算法完成工作最少需要多少基本操作。 最坏时间复杂度: 算法完成工作最多需要多少基本操作。 平均时间复杂度: 算法完成工作平均需要多少基本操作。 时间复杂度的几条基本计算规则: 1.基本操作,即只有常数项,认为其时间复杂度为O(1)。 2.顺序结构

JavaScript GC简书

风流意气都作罢 提交于 2020-03-11 18:47:10
1.垃圾回收算法 垃圾:无法再被访问的对象或内存空间 延迟:指平均每次垃圾回收开始到结束需要的时间。 吞吐量:指平均一定时间内能回收多少内存,内存多少这个概念非常广泛,可以指多少个对象,也可以指多少字节的空间,具体的应该看指标应需求而异。 根节点:如全局变量上的对对象的引用、栈上对对象的引用等用户一定能够访问到的地址,是寻找活对象的入口。 下面简单地介绍引用计数、Mark-Sweep、Mark-Copy、Mark-Compact四种垃圾回收算法 1.1 引用计数 这是最初级的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。我们可以为每个对象都增加一个计数器,来记录对这个对象的引用数量,当引用计数归零时,这个对象变成了垃圾 引用计数的优点如下: (1)内存释放及时,当一个对象死亡时其占用的内存马上被释放 (2)延迟低,内存释放的时间均匀地分布在各个时间段 缺点如下: (1)每个对象需要附带一个计数字段的空间 (2)引用复制和销毁时需要对改变计数字段,这可能涉及到相对昂贵的原子操作 (3)无法处理循环引用,比如两个对象互相引用对方的情况 进阶话题:当一个大对象的引用归零时,常常会导致一大批的对象引用归零,这种成批释放的情况非常常见

RMQ问题 Page 41 ST算法

时光怂恿深爱的人放手 提交于 2020-03-11 14:43:02
RMQ问题 Page 41 ST算法 http://www.51nod.com/Challenge/Problem.html#!#problemId=1174 第一次写博客 这是51nod上一个简单的基础题。 大致题意:给一组数组 让你判断T个 [ l , r ] [l,r] [ l , r ] 区间里的最大值(或最小值)。 分析 :暴力肯定会TLE。 根据倍增思想,需要引入2的整数次幂用来简化时间和空间,那么具体该怎么做呢? 先取数组 d p [ i ] [ j ] dp[i][j] d p [ i ] [ j ] ,表示从 i i i 开始的 2 j 2^j 2 j 个数中的最大值,即区间 [ i , i + 2 j − 1 ] [i,i+2^j-1] [ i , i + 2 j − 1 ] 。 接下来很容易理解的转移方程, 从 i i i 开始的 2 j 2^j 2 j 个数中的最大值肯定是其左半段和右半段的最大值 ,这个左半段和右半段完美契合2的整数次幂思想,只需要把幂次-1即可! dp [ i ] [ j ] = max ( dp [ i ] [ j - 1 ] , dp [ i + 1 << ( j - 1 ) ] [ j - 1 ] ) ; 预处理代码如下: void ST ( ) { for ( int i = 1 ; i <= n ; i ++ ) dp [ i

2、GoF的23种设计模式

让人想犯罪 __ 提交于 2020-03-11 13:59:02
GoF 的 23 种设计模式的分类和功能 设计模式 有两种分类方法,即根据模式的目的来分和根据模式的作用的范围来分。 1. 根据目的来分 根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。 2. 根据作用范围来分 根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。 3.