缓冲区溢出
例如:把10个字节的数据存入到只分配了8个字节的空间缓冲区
原理:
简单地说,缓冲区溢出就是向一个有限空间的缓冲区拷贝了过长的字符串,覆盖相邻的存储单元,这将会引起程序运行失败。
因为变量保存在堆栈当中,当发生缓冲区溢出的时候,存储在堆栈中的函数返回地址也会被覆盖,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
一个程序在内存中通常分为程序段,数据段和堆栈段3部分。动态数据则通过堆栈来存放。
当程序中发生函数调用时,计算机做如下操作:
首先把参数压入堆栈;
然后保存指令寄存器(IP)中的内容作为返回地址(RET);
第三个放入堆栈的是基址寄存器(BP):然后把当前的栈指针(SP)拷贝到BP,作为新的基地址;
最后为本地变量留出一定空间,把SP减去适当的数值。
BP RET被多余的str覆盖,而覆盖之处恰好就是想要执行程序的入口!
利用空指针加快猜中的可能性
BF 算法
最原始的比较算法,一个一个的比
KMP 算法
原理
KMP(D.E. Knuth, J.H.Morris, and V.R.Pratt )主要是基于对BF算法的改进:BF算法只是简单的每次移动一个字符位置,并没有考虑已匹配成功部分的信息。其实这些信息是可以利用的,此即所谓的“前缀模式”----模式中不同部分存在的相同子串。根据前缀模式可以使模式向前推进若干字符位置(依前缀模式长度而定),而不只是一个字符,避免了重复比较,同时也实现了无回朔。
假定试探第j个位置时,匹配失败发生在模式字符x[i]=a ,文本字符 y[i+j]=b;
当转移的时候,模式集的V能够与文本中的u的一些后缀相匹配,最长的V我们定义为u的边界标记(tagged border )。kmpNext[i] 定义为x[0 .. i-1] 的最长边界, kmpNext[0] 定义为-1 。
算法:
构建KMPNEXT表:
kmpNext[0]= -1 任何串的第一个字符的kmpNext规定为-1。
kmpNext[j]= -1 模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不等(或者相等但T[k]==T[j] (1≤k<j))。
如:T=”abCabCad” 则 kmpNext[6]=-1kmpNext[j]=k 模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。 即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1] 且T[j] != T[k].(1≤k<j);
如:T=”abCabhad” ,则 kmpNext[5]=2kmpNext[j]=0 意义:除(1)(2)(3)的其他情况。
移动:
i - KMPNEXT[i] 的位移
i代表模式串匹配失败的下标,从0开始
BM 算法
原理
BM算法的关键是找出不必要的比较。进行比较时从字符串的右端而不是左端开始比较,当比较不匹配时,可直接向右移若干个位置;当被比较的字符相等时,则继续比较其前面的字符。如果成功次数等于模式串长度,则匹配成功。
AC 算法
转向函数
失效函数
输出函数
转向函数
比较好建立,直接画树
失效函数+输出函数
划分深度d0=0, d1=d3=1, d2=d6=d4=2...
-
建立失效函数。首先,令所有深度为1的状态s的函数值为f(s) = 0。假设所有深度小于d的状态的f值都已经被算出了,那么深度为d的状态的失效函数值将根据深度小于d的状态的失效函数值来计算。
state = f(r)
记f(s) = g(state, a), g(r, a) = s
在同时根据f也会输出新的输出集合
比如: f(5) = 2. 把2的输出集合同样也输出到5的输出集合中了。
双数组 AC 算法
普通转向函数占用内存太大。用三个数组解决。
Next 表 —— 下标是位置的偏移量,输出时状态值
Base 表 —— 下标是状态值,输出时Base值
Check 表 —— 下标是状态值,输出时下标状态的父状态的值
一层一层走
Base: 一点一点偏移。。相对前一个状态的偏移-现在的ASCII码=现在状态的Base值
GST 算法
后序按照字典排列
LCT最长公共子序列
m*n数组初始化为0
s1[m] = s2[n], L[m,n]= L[m-1,n-1]+1
s1[m] != s2[n],L[m,n]= max{L[m,n-1], L[m-1,n]}. 回朔时谁大谁回朔到谁,相等走一个
KD 树
KD树
kd树是做多维数据索引时候用到的一种数据结构:k-d树是二叉检索树的扩展,k-d树的每一层将空间分成两个。树的顶层结点按某一维进行划分,递归,每次划分均选择合适的维进行划分,各个维循环往复。划分要使得在每次划分后,大约一半的点落入一侧,而另一半落入另一侧。当一个结点中的点数少于给定的最大点数时,划分结束。
分散开的划分,方差。或者其他更加科学的做法。
检索效率O(lgn)
高度不超过log2n
k-means 算法
在该算法中,每个簇用该簇中对象的平均值来表示
给定簇个数,随便找簇个数个值(一般最小原则),然后其他点,和簇中的值比较,最近的,归类。取平均值得到新簇。
直到不变
k-medoids算法
在该算法中,每个簇用接近聚类中心的一个对象来表示。
中心点的选取:从当前分类中选取这样一个点——它到其他所有(当前分类中的)点的距离之和最小——作为中心点。
再用这个点分别与所有点(最近)
DBSCAN算法
DBSCAN是一种利用样本密度进行测量比较的聚类算法。算法认为若样本点在以它为圆心Eps距离为半径的区域内的少数类样本数大于阈值MinPts,那么该样本点即为核心点。核心点与其Eps范围内的邻居形成簇。如果簇间存在重合,则这些簇需要合并。
给定半径,给定距离
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。