精华内容
下载资源
问答
  • 差分算法

    千次阅读 2020-08-01 18:21:03
    b就称作a数组的差分, a就是b的前缀和数组。 我们就可以通过将b相加起来得到a, 如果要对a数组[l, r]区间内的所有的数都加1, 因为a数组是b数组的前缀和,因此只用将bl + 1 就可以了,所有的a,当下标i > l, ...
    	该算法是前缀和算法的逆运算,可以快速的对数组的某一个区间进行计算。
    	具体过程如下
    
    1. 构造数组b
      构造过程
      b就称作a数组的差分, a就是b的前缀和数组。
      我们就可以通过将b相加起来得到a,
      如果要对a数组[l, r]区间内的所有的数都加1, 因为a数组是b数组的前缀和,因此只用将bl + 1
      就可以了,所有的a,当下标i > l, 数组就都会 + 1, 同理也可以进行减 - 1操作。效果类似
    2. 对区间进行操作

    在这里插入图片描述

    展开全文
  • 在对绝对差分算法和绝对差分平方算法在抛物线插值情况下的测量误差进行了理论分析比较的基础上, 利用实际采集的太阳米粒图像对这两种算法进行了实验验证。分析和实验结果表明, 太阳米粒图像绝对差分平方算法所得到的...
  • 差分算法ppt

    2013-10-10 15:42:30
    差分算法最近的方向介绍!这是一个简介,帮助了解一些进化算法的方向
  • bsdiff差分算法最新版,能够实现在下位机中差分升级的开源算法,在git上也能下载到。
  • 一套完整可运行的绝对差分算法,包括重心法对比、相关矩阵计算、抛物线插值与高斯插值得到亚像素精度计算。
  • 差分算法M文件

    2018-10-01 16:19:33
    使用MATLAB写出的 差分算法M文件,是一种最优化搜索算法
  • 差分算法与粒子群算法进行结合,并用罚函数进行约束处理,对目标函数进行优化
  • 差分算法求解函数最值问题,适合差分算法的初学者。能够很好地读懂与学习和应用等
  • 差分算法和粒子群算法属于智能随机优化算法,作者将差分算法一粒子群算法相结合,得到一种混合优化算法,并编写了matlab源程序,供广大学着研究学习。
  • matlab背景差分算法

    2015-03-20 17:09:30
    运用背景差分算法,实现对视频车辆的检测与跟踪。
  • SaDE差分算法

    2018-12-12 14:45:08
    差分进化算法,适合研究生学习使用,群智能算法的一种经典类型
  • 差分算法数据包

    2013-06-04 11:10:21
    一个很好差分进化算法程序代码,对初学者很实用~
  • 一种广义时域有限差分算法,详述了FDTD算法的实现
  • 提出一种视频运动目标分割的改进算法, 该算法综合帧间差分算法及背景减算法获得的信息分割运动物体, 利用对称差分算法获得中间帧运动目标的轮廓信息, 以该轮廓的外接矩形为分界, 再对其外部进行动态背景更新处理, 并...
  • 代码包含基于差分算法的多聚焦图像融合算法的源代码以及不同图像块清晰度判定方法的源代码。有空间频率,边缘检测,灰度差等方法。
  • 差分算法的实现, java

    2011-03-09 06:04:18
    这是差分算法用java的实现,可能有一点差异,因为这个写的时候是和其他程序结合在一起实现的,仅供参考
  • 差分算法ADI的VC实现

    2008-01-11 14:13:02
    用VC写的差分算法ADI。
  • matlab的差分算法实现以及粒子群优化算法介绍
  • 背景差分算法

    热门讨论 2013-03-13 20:59:31
    利用matlab实现背景差分,将第一个图片设置为背景图片,简单明了
  • 该算法在标准差分算法的基础上,通过融入基因编辑操作提高标准差分算法在解决该问题时的计算效率与求解精度。并将该算法分别应用于10机组和40机组的多燃料电力系统的算例进行仿真分析。此外,将仿真结果与多种算法...
  • 进化差分算法DE C语言

    2013-10-01 13:06:14
    实现的是基本差分进化算法,输入种群大小,进化代数,交叉因子,缩放因子,就可输出结果
  • DFOTA差分算法

    千次阅读 2018-01-15 20:54:10
    固件升级使用FOTA(Firmware Over-The-Air)方式时,可以采用传输差分包的形式来减小升级包的大小,能够带来空口传输时间减小、降低终端功耗等优势。目前比较常见的算法有...Vcdiff采用差分文件包含:ADD、COPY、RUN[、N
    固件升级使用FOTA(Firmware Over-The-Air) 方式时,可以采用传输差分包的形式来减小升级包的大小,能够带来空口传输时间减小、降低终端功耗等优势。目前比较常见的算法有xdelta 使用的Vcdiff Bsdiff 等。
    Vcdiff
    Vcdiff 可以实现文件的差分并压缩的功能,当原文件为空时,则相当于对新的文件直接压缩。Vcdiff 采用差分文件包含:ADD COPY RUN[ NOOP( )] 等操作方式。生成差分文件前,需要首先进行Vcdiff decoding ,具体采用128 进制来重新编码,带来的好处: 一是在不同的系统中统一采用8 比特的字节编码方式,二是对于小数字则可以节省存储空间;在RF3284 给出的示例将123456789 ,经过编码后表示为MSB+58,MSB+111,MSB+26,0+21 ,二进制值为10111010 11101111 10011010 0010101 ,最高位MSB 用来表示数据是否完成,1 时表示下个字节仍属于同一数据块,即123456789 = 128*(128*(58 * 128 + 111) + 26) + 21 。编码完成后的文件生成差分格式包,也可进行压缩后再进行传输。差分包执行过程示例如下, 旧的文件内容为a b c d e f g h i j k l m n o p ,差分包包含指令COPY 4, 0 ADD 4, w x y z COPY 4, 4 COPY 12, 24 RUN 4, z COPY 指令带有两个参数,第一个为长度,第二个为地址;ADD 指令带有长度和,相应插入的符号信息;RUN 指令将某字符重复多次。

    在生成差分文件时需要进行字符串比较,有后缀树及hash 等方式,Vdelta 中使用快速字符串比较算法(a fast string matching algorithm 可以使用相对其他算法较少的内存空间,hash 表索引?) Vdelta 的过程就是压缩的过程,生成差分包的过程,可以理解为原始包和新的包级联,然后进行压缩,只输出新包部分的信息即为差分包。理解生成差分包过程如下,采用最低3 个字节匹配( 需要使用合适前缀匹配,简单理解当匹配字符串太长时,匹配成功可能性低,较短如一个字符比较时,索引开销可能比存储Index 还大)

    虽然Vcdiff 本身压缩能够覆盖大部分使用,在Vcdiff 中还支持二次压缩以达到更好的效果,也就是对生成的信息再一次压缩,压缩方式可以在文件头信息中携带。另外在考虑资源消耗方面,Vcdiff 支持分成多块(window) ,这样可以减少过程中内存等资源的需求,Vcdiff 差分包格式主要信息格式Header Info+Window1 Info + Window2…
    Bsdiff
    Bsdiff 采用差分文件信息包含三个部分: 一是ADD INSERT 的控制信息;一部分是包含概率匹配中不同字节差异文件(difference) ;最后一部分是不属于概率匹配内容的额外信息(extra 文件) Bsdiff 算法使用的的前提条件,一是文件直接修改引起的变化相当稀疏,二是数据和代码倾向于成块进行移动,导致大部分不同地址调整了相同的大小。ADD 指令操作对象包含源文件中信息的偏移、长度以及需要添加的值;INSERT 包含需要添加的长度以及需要添加的信息。区别于Vcdiff Bsdiff 只是差分文件生成的作用,而生成的文件并不会比源文件小,但其具有高度可压缩性,使得压缩后的差分文件比较小,参考文献中使用bzip2 的压缩方法。生成差分包的时候,首先对旧文件进行后缀排序( 使用faster string matching 算法) ,然后使用二分查找的方法将新文件中的字符串和旧文件字符串进行比较生成相应的diff 文件。而差分包与旧有的文件生成新文件时会简单些,直接利用差分信息进行处理,无需排序等操作。
    如下为排序过程,首先按照字符值直接排序,第一次排序完成后,13 6 5 的字符顺序即可确定,由于这些字符唯一,而其他出现重叠的字符需要根据其后续字符再次排序,如index3 e index12 e ,需要使用其后续的第一个字符o $ 比较再次排序,依次类推,直至将所有的元素排序完成。

    字符串查找方式如下,采用二分法,示例需要找到”obeo” 字符串,先找到I index ( 0 + 13 ) / 2 的位置6 ,对应原来字符串的index 10 进行字符串比较,obeo > obe$ 因此再到( 6 + 13 ) / 2 的位置即index 9 对应元字符串的index 7 ,以此类推。通过字符串的查找和比较,从新文件头字符串开始,依次到旧文件排序信息中查找字符串位置进行对比,得到旧文件的位置和匹配长度信息等。

    Bsdiff 生成的差分包由几个部分组成,Header 文件头、控制信息、diff 部分的信息,其中头文件包含目标文件大小、控制信息长度等,以及extra 部分信息。通过两种操作ADD INSERT 进行合并。控制信息用三元组表示,由add 长度,insert 长度以及从旧文件忽略长度三部分表示。执行方式如下

    参考文档
    RFC3284 the VCDIFF Generic Differencing and Compression Data Format
    naive differences of executable code
    FASTER SUFFIX SORTING
    Delta Algorithms_ An Empirical Analysis, ACM Trans
    An Empirical Study of Delta Algorithms

    展开全文
  • 强化学习经典算法笔记——时间差分算法 强化学习经典算法笔记(零):贝尔曼方程的推导 强化学习经典算法笔记(一):价值迭代算法Value Iteration 强化学习经典算法笔记(二):策略迭代算法Policy Iteration 强化...

    强化学习经典算法笔记——时间差分算法之 Q-Learning

    强化学习经典算法笔记(零):贝尔曼方程的推导
    强化学习经典算法笔记(一):价值迭代算法Value Iteration
    强化学习经典算法笔记(二):策略迭代算法Policy Iteration
    强化学习经典算法笔记(三):蒙特卡罗方法Monte Calo Method

    简介

      上一篇讲的是比较经典的model-free的算法——蒙特卡罗算法。这一篇讲另一个很经典的无模型算法——时间差分算法Temporal Difference。

      参考文献 https://blog.csdn.net/weixin_37895339/article/details/74937023

      时间差分算法(TD Algorithm)既有Monte Calo算法的优势,又有Dynamic Programming的优势。类似Monte Calo,TD算法可以直接从原始数据中学到策略,而不需要掌握环境的模型;而Monte Calo算法必须在一个episode结束后才能更新V值或Q值,如果一个episode持续很长时间,则Monte Calo算法效率不高。TD算法这一点上比较像DP算法,每个action都可以更新,效率大大提升。

      按照On-policy或Off-policy之分,TD算法有两个代表性例子:

    • Off-policy: Q Learning
    • On-policy: SARSA

      On-policy算法是指与环境进行交互的policy和实际更新迭代的policy是同一个policy的算法;Off-policy算法是指,与环境交互的policy和实际更新的policy不是同一个policy的算法。

      形象地说,我看着别人玩游戏,从别人玩游戏的经验中,我自己也学到了如何玩游戏,这就是Off-policy,别人玩游戏,就是与环境交互的policy,而我自己就是进行更新和学习的policy。如果我亲自玩游戏,在这个过程中,我的游戏水平提高了,就是On-policy算法,即交互和学习的policy是一个policy。

      TD算法基本思想就是用(前一个状态的价值和当前状态的价值之差)来更新前一个状态的V值或Q值,尽管当前状态的估计值也不准确,用一个不准确的值来更新另一个不准确的值,叫做自举(Bootstrapping)。
    V ( s ) = V ( s ) + α   [   r + γ V ( s ′ ) − V ( s )   ] V(s) = V(s) + \alpha\ [\ r+\gamma V(s')-V(s)\ ] V(s)=V(s)+α [ r+γV(s)V(s) ]

    Q-Learning算法

      Q-Learning算法的具体流程。下图来自Reinforcement Learning An Introduction
    在这里插入图片描述
      上面说Q-Learning算法是Off-policy的算法,是因为Q-learning算法在计算下一状态的预期收益时使用了max操作,直接选择最优动作,而当前policy并不一定能选择到最优动作,因此这里生成样本的policy和学习时的policy不同,为off-policy算法。

    编程实验

      这次选用的实验是Taxi-v2游戏,智能体在游戏中控制一辆出租车,游戏中有四个位置,出租车需要在一个位置接乘客,在另一个位置放下乘客,如果放下乘客的位置对了,得到+20分奖励,如果放错了,得-1分惩罚。如果接乘客和放乘客的操作都不合法,得-10分惩罚。
      R,G,Y,B代表不同位置和乘客,黄色方块代表出租车。

    在这里插入图片描述

      直接贴出全部代码,太简单了就不解释了。

    import random
    import gym
    import numpy as np
    import matplotlib.pyplot as plt
    import copy
    %matplotlib inline
    
    env = gym.make('Taxi-v2')
    
    # 学习率
    alpha = 0.4
    
    # 折扣率
    gamma = 0.999
    
    # 贪心算法参数
    epsilon = 0.017
    
    # Q是表格函数,对简单的有限状态任务有效,如果是连续空间,或者复杂离散空间,都没法用查表的方法得到某个状态的Q值,应该用神经网络
    q = {}
    
    # 初始化所有(状态-动作)对的价值为0
    for s in range(env.observation_space.n):
        for a in range(env.action_space.n):
            q[(s,a)] = 0
    
    def update_q_table(prev_state, action, reward, nextstate, alpha, gamma):
        '''
        更新(State-Action)Pair的Q值
        '''
        # t+1 状态的Q值用 t+1 状态下得分最高的动作所对应的Q值
        qa = max([q[(nextstate, a)] for a in range(env.action_space.n)])
        
        # 一步时间差分
        q[(prev_state,action)] += alpha * (reward + gamma * qa - q[(prev_state,action)])
    
    def epsilon_greedy_policy(state, epsilon):
        '''
    
        '''
        if random.uniform(0,1) < epsilon:
            # 在动作空间随机采样
            return env.action_space.sample()
        else:
            # 取当前状态下具有最高价值的动作
            return max(list(range(env.action_space.n)), key = lambda x: q[(state,x)])
    
    # 记录每个episode获得的总回报
    r_record = []
    # 记录Q值表的新旧之差
    error_qa = []
    # 保存Q-Table更新前后的两个table,注意一定要用深度拷贝!!!
    q_old = copy.deepcopy(q)
    
    for i in range(2000):
        r = 0
        prev_state = env.reset()
        while True:
    
            #env.render()
         
            # 每一个状态都用epsilon-贪心算法计算应执行的动作
            action = epsilon_greedy_policy(prev_state, epsilon)
            
            # 执行动作,转移到下一状态,得到reward
            nextstate, reward, done, _ = env.step(action)
            
            # 更新Q值函数        
            update_q_table(prev_state, action, reward, nextstate, alpha, gamma)
            
            # 新状态成为旧状态,进行下一轮迭代
            prev_state = nextstate
            # 记录每一步的得分
            r += reward
            # 游戏结束就跳出while循环
            if done:
                break
        # 一盘游戏结束,打印最终得分
        print("total reward: ", r)
        
        # 记录每轮游戏的reward
        r_record.append(r)
        
        # 计算Q-table的更新收敛情况
        error = 0
        for i in q:
            error = error + np.abs(q[i] - q_old[i])
        error_qa.append(error)
        q_old = copy.deepcopy(q) # 必须用深度拷贝,否则error恒为0
        
    # 关闭游戏界面
    env.close()
    
    # 画收敛曲线
    plt.figure(1,figsize=(10,10))
    plt.plot(list(range(2000)),r_record[:2000],linewidth=0.8)
    plt.title('Reword Convergence Curve',fontsize=15)
    plt.xlabel('Iteration',fontsize=15)
    plt.ylabel('Total Reword of one episode',fontsize=15)
    
    plt.figure(2,figsize=(10,10))
    plt.plot(list(range(2000)),error_qa[:2000],linewidth=0.8)
    plt.title('Q-table difference Convergence Curve',fontsize=15)
    plt.xlabel('Iteration',fontsize=15)
    plt.ylabel('Error between old and new Q-table',fontsize=15)
    
    # plt.savefig('2.pdf')
    

      最后画两个图,观察算法有没有收敛。

      第一个图是每个Episode总回报和训练代数(图中2000个Episode)的关系,一开始智能体完全不得要领,一局游戏玩下来扣600多分,随着训练进行,到最后平均一个Episode有+12分的total reward吧(个人感觉,没有经过统计)。图中看出收敛的趋势还是很明显的。

    在这里插入图片描述  第二个图是Q-table每次更新的时候,新旧Q-table之差的变化趋势。
    e r r o r = ∑ ( s , a ) ∈ S , A ∣ Q n e w ( s , a ) − Q o l d ( s , a ) ∣ error=\sum_{(s,a)\in \bm{S,A}} |Q_{new}(s,a)-Q_{old}(s,a)| error=(s,a)S,AQnew(s,a)Qold(s,a)
      图中显示,前250次迭代,Q-table的更新幅度较大,直到1000代左右逐渐收敛,新旧Q-table就基本不变了,这也可以表明算法的收敛性。

    在这里插入图片描述

    展开全文
  • 用于超声二维图像重建和坐标变化的算法 用于数据差分的最小二乘法算法
  • 今天介绍常用的三种差分算法,分别是Xdelta3 bsdiff Courgette。 Xdelta3 官网地址: http://xdelta.org 源码地址:https://github.com/jmacd/xdelta xdelta是delta编码的命令行程序,它生成两个文件之间的差异。 ...

    今天介绍常用的三种差分算法,分别是Xdelta3 bsdiff Courgette。

    Xdelta3

    官网地址: http://xdelta.org

    源码地址:https://github.com/jmacd/xdelta

    xdelta是delta编码的命令行程序,它生成两个文件之间的差异。 这与diff和patch类似,但它针对二进制文件 ,不会生成人类可读的输出。

    它于1997年首次发布。xdelta的开发人员是Joshua MacDonald,该程序目前由他维护。 xdelta1算法基于rsync算法,由Andrew Tridgell开发,使用比rsync更小的块大小。

    xdelta3可以生成标准化的VCDIFF格式,实现了支持VCDIFF格式的其他delta编码软件的兼容性。 它运行在类Unix操作系统和Microsoft Windows上 。 xdelta最多可处理2^64字节文件,适用于大型备份。

    下面关于VCDIFF算法的介绍摘自网络:原文

    Vcdiff可以实现文件的差分并压缩的功能,当原文件为空时,则相当于对新的文件直接压缩。Vcdiff采用差分文件包含:ADD、COPY、RUN[、NOOP(空)]等操作方式。生成差分文件前,需要首先进行Vcdiff decoding,具体采用128进制来重新编码,带来的好处:
    一是在不同的系统中统一采用8比特的字节编码方式,二是对于小数字则可以节省存储空间;在RF3284给出的示例将123456789,经过编码后表示为MSB+58,MSB+111,MSB+26,0+21,二进制值为10111010 11101111 10011010 0010101,最高位MSB用来表示数据是否完成,1时表示下个字节仍属于同一数据块,即123456789 = 128*(128*(58 * 128 + 111) + 26) + 21。编码完成后的文件生成差分格式包,也可进行压缩后再进行传输。差分包执行过程示例如下,旧的文件内容为a b c d e f g h i j k l m n o p,差分包包含指令COPY 4, 0;ADD 4, w x y z;COPY 4, 4;COPY 12, 24;RUN 4, z COPY指令带有两个参数,第一个为长度,第二个为地址;ADD指令带有长度和,相应插入的符号信息;RUN指令将某字符重复多次。

    在生成差分文件时需要进行字符串比较,有后缀树及hash等方式,Vdelta中使用快速字符串比较算法(a fast string matching algorithm 可以使用相对其他算法较少的内存空间,hash表索引)。Vdelta的过程就是压缩的过程,生成差分包的过程,可以理解为原始包和新的包级联,然后进行压缩,只输出新包部分的信息即为差分包。理解生成差分包过程如下,采用最低3个字节匹配(需要使用合适前缀匹配,简单理解当匹配字符串太长时,匹配成功可能性低,较短如一个字符比较时,索引开销可能比存储Index还大)。

    虽然Vcdiff本身压缩能够覆盖大部分使用,在Vcdiff中还支持二次压缩以达到更好的效果,也就是对生成的信息再一次压缩,压缩方式可以在文件头信息中携带。另外在考虑资源消耗方面,Vcdiff支持分成多块(window),这样可以减少过程中内存等资源的需求,Vcdiff差分包格式主要信息格式Header Info+Window1 Info + Window2…。

    bsdiff

    官网地址:http://www.daemonology.net/bsdiff/

    源码地址:http://www.daemonology.net/bsdiff/bsdiff-4.3.tar.gz

    官网描述:

    bsdiff routinely produces binary patches 50-80% smaller than those produced by Xdelta, and 15% smaller than those produced by .RTPatch (a $2750/seat commercial patch tool).

    bsdiff通常生成的二进制补丁比Xdelta生成的补丁少50-80%,比.RTPatch生成的二进制补丁小15%(2750 美元/套 的商业补丁工具)

    下面关于bsdiff算法的介绍摘自网络:原文

    Bsdiff采用差分文件信息包含三个部分:
    一是ADD和INSERT的控制信息;一部分是包含概率匹配中不同字节差异文件(difference);最后一部分是不属于概率匹配内容的额外信息(extra文件)。Bsdiff算法使用的的前提条件,一是文件直接修改引起的变化相当稀疏,二是数据和代码倾向于成块进行移动,导致大部分不同地址调整了相同的大小。ADD指令操作对象包含源文件中信息的偏移、长度以及需要添加的值;INSERT包含需要添加的长度以及需要添加的信息。区别于Vcdiff,Bsdiff只是差分文件生成的作用,而生成的文件并不会比源文件小,但其具有高度可压缩性,使得压缩后的差分文件比较小,参考文献中使用bzip2的压缩方法。生成差分包的时候,首先对旧文件进行后缀排序(使用faster string matching 算法),然后使用二分查找的方法将新文件中的字符串和旧文件字符串进行比较生成相应的diff文件。而差分包与旧有的文件生成新文件时会简单些,直接利用差分信息进行处理,无需排序等操作。
    如下为排序过程,首先按照字符值直接排序,第一次排序完成后,13、6、5的字符顺序即可确定,由于这些字符唯一,而其他出现重叠的字符需要根据其后续字符再次排序,如index3的e和index12的e,需要使用其后续的第一个字符o和$比较再次排序,依次类推,直至将所有的元素排序完成。

    字符串查找方式如下,采用二分法,示例需要找到”obeo”字符串,先找到I index为( 0 + 13 ) / 2的位置6,对应原来字符串的index 10进行字符串比较,obeo > obe$因此再到( 6 + 13 ) / 2的位置即index 9 对应元字符串的index 7,以此类推。通过字符串的查找和比较,从新文件头字符串开始,依次到旧文件排序信息中查找字符串位置进行对比,得到旧文件的位置和匹配长度信息等。

    Bsdiff生成的差分包由几个部分组成,Header文件头、控制信息、diff部分的信息,其中头文件包含目标文件大小、控制信息长度等,以及extra部分信息。通过两种操作ADD、INSERT进行合并。控制信息用三元组表示,由add长度,insert长度以及从旧文件忽略长度三部分表示。

    Courgette

    官网地址:http://www.chromium.org

    源码地址:https://chromium.googlesource.com/chromium/src/courgette/+/master/

    git clone https://chromium.googlesource.com/chromium/src/courgette
    

    效率对比

    根据chromium官网的介绍,他们尝试了几种二进制差异算法,到目前为止一直使用bsdiff 。

    我们是bsdiff的忠实拥趸——它比我们尝试过的其他任何东西都小而且工作得更好。
    但是bsdiff仍然在制作比我们觉得有必要更大的差异。所以我们编写了一个新的差异算法,它更多地了解我们正在推进的数据类型——包含已编译可执行文件的大文件。

    以下是chromium官方的差分效果对比,dev分支190.1-> 190.4更新的字节大小:

    更新方式文件大小
    Full update10,385,920
    bsdiff update704,512
    Courgette update78,848

    原理分析

    以下内容翻译自chromium官网,略有删改。而且因为翻译水平有限,错误在所难免,欢迎指正。

    编译应用程序的问题是,即使是小的源代码更改也会导致字节级别更改数量不成比例。例如,添加几行代码时,需要进行范围检查以防止缓冲区溢出,随后的所有代码都会移动以便为新指令腾出空间。编译后的代码充满了内部引用,其中某些指令或数据包含另一条指令或数据的地址(或偏移量)。在几乎所有这些内部指针具有不同的值之前,它只需要进行一些源代码更改。

    源代码没有这个问题,因为源代码中的所有实体都是符号的。在编译过程中,在汇编或链接过程中,函数不会被提交到特定的地址。如果我们可以稍微向后退一点,并再次使内部指针具有象征意义,我们是否可以获得更小的更新?

    courgette使用原始反汇编器来查找内部指针。反汇编器将程序分成三部分:内部指针的目标地址列表,所有其他字节,以及一个’指令’序列,它决定了普通字节和指针如何交错和调整以获取原始输入。我们称之为“汇编语言”,因为我们可以运行“汇编程序”来处理指令并发出一系列字节来恢复原始文件。

    非指针部分大约是原始程序大小的80%,并且由于它没有任何混合的指针,它往往表现良好,其差异大小与源代码中的更改一致。简单地将程序转换为汇编语言形式可以使bsdiff产生的差异缩小约30%。

    我们通过引入地址的“标签”来控制指针。地址存储在一个数组中,指针列表被数组索引列表替换。 该数组是一个基本的“符号表”,符号名称或“标签”是数组中的整数索引。我们从符号表中得到的是我们表达程序的自由度。只要我们对索引列表进行相应的更改,我们就可以在数组中移动地址。

    courgette与bsdiff流程对比

    比如原始文件叫original,新的文件叫update。

    bsdiff升级的方式:

    server:
            diff = bsdiff(original, update)
            transmit diff
    
    client:
            receive diff
            update = bspatch(original, diff)
    

    服务器将使用bsdiff预先计算差异,然后将差分包直接传输,客户端再使用bspatch合成新的包,然后使用新的包升级。

    courgette升级方式:

    server:
        asm_old = disassemble(original)
        asm_new = disassemble(update)
        asm_new_adjusted = adjust(asm_new, asm_old)
        asm_diff = bsdiff(asm_old, asm_new_adjusted)
        transmit asm_diff
    
    client:
        receive asm_diff
        asm_old = disassemble(original)
        asm_new_adjusted = bspatch(asm_old, asm_diff)
        update = assemble(asm_new_adjusted)
    
    生成patch:

    合成新文件:


    Courgette将程序转换为原始汇编语言,并在汇编级别进行差异化处理。

    其中最与众不同的地方是adjust步骤。Courgette移动asm_new符号表中的地址以最大限度地减小asm_diff的大小。两个符号表中的地址在它们的统计属性上匹配,这确保了索引列表具有许多长的公共子串。匹配不会根据周围的代码或调试信息使用任何启发式来对齐地址。

    More than one executable, less than an executable

    对于上面的工作,“汇编”和“反汇编”必须是严格反转,“original”和“update”必须是单一格式可执行文件。

    如果“original”和“update”可以包含多个可执行文件以及大量非编译文件(如JavaScript和PNG图像),则它更加有用。

    对于GoogleChrome,“original”和“update”是一个存档文件,其中包含安装和运行浏览器所需的所有文件。我们可以将差异更新视为一种预测,然后是一种猜谜游戏。在其最简单的形式(只是bsdiff/bspatch)中,客户端只有一个愚蠢的猜测,即“original”,所以服务器发送一个二进制比较来将“original”更正为所需的答案“update”。现在,如果服务器可以传递可用于产生更好猜测的提示,但我们不确定猜测是否会有用。我们可以通过将原始和猜测结合起来作为差异的基础来确保不会丢失信息:

    server:
            hint = make_hint(original, update)
            guess = make_guess(original, hint)
            diff = bsdiff(concat(original, guess), update)
            transmit hint, diff
    
    client
            receive hint, diff
            guess = make_guess(original, hint)
            update = bspatch(concat(original, guess), diff)
    

    这个系统有一些有趣的属性。如果猜测是空字符串,那么我们与普通的bsdiff具有相同的差异。 如果猜测是完美的,差异将很小,只是一个复制猜测的指令。

    在极端之间,猜测可能是“update”的完美子集。然后bsdiff会构造一个差异,主要是从完美预测和原始材料中构建更新。这就是Courgette如何处理包含可执行文件和其他文件的tar文件的输入。 提示是每个嵌入式可执行文件的位置以及asm_diff。

    一旦我们有了这个预测/修正方案,我们就可以用它来减少客户需要完成的工作量。 可执行文件通常具有不包含内部指针的较大区域,如资源部分通常包含字符串表和各种可视元素(如图标和位图)。反汇编程序生成一个汇编语言程序,几乎可以说“这是一大块常量数据”,其中的数据与原始文件相同。 bsdiff然后为常量数据生成一个diff。 我们可以通过从反汇编中省略无指针区域并让最终差异来完成工作来获得基本相同的效果。

    总结

    Courgette将输入转换为一种比直接二进制比较更有效的形式(assemble),在变换后的空间进行差分压缩,并将变换反转以获得原始格式的补丁输出。

    展开全文
  • 背景差分算法研究资源分享

    千次阅读 2011-12-04 16:49:36
    今天在搜集资料的时候惊异的发现这样一个网站:https://sites.google.com/site/backgroundsubtraction/overview,和我的想法不谋而合,此网站整理了几乎所有背景差分算法(Background Subtrac
  • 目前在做OTA差分算法研究,基于baidu.google, gayhub各种资料和途径,整理出来了三种OTA算法的安装步骤及使用方法。   1.bsdiff 我就不简介了,网上百度巴拉巴拉一大堆,我就把如何安装还有使用命令的教程给列...
  • OTA差分算法 1.bsdiff Bsdiff采用差分文件信息包含三个部分: 一是ADD和INSERT的控制信息;一部分是包含概率匹配中不同字节差异文件(difference);最后一部分是不属于概率匹配内容的额外信息(extra文件)。Bsdiff...
  • 无模型的强化学习方法-时间差分算法 在无模型的强化学习方法-蒙特卡罗算法中介绍了蒙特卡罗算法是利用经验平均估计状态值函数,存在一个问题是经验平均要到一次实验结束后才出现,学习速度慢,学习效率不高。重新看...
  • 背景差分算法/背景扣除 matlab实现 clear; clc; i1=imread('D:\Work\1.png'); i2=imread('D:\Work\2.png'); i1=rgb2gray(i1); i2=rgb2gray(i2); [m,n]=size(i1); im1=double(i1); im2=double(i2); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 259,344
精华内容 103,737
关键字:

差分算法