- 博客(15)
- 收藏
- 关注
原创 2 如何用ASM进行插桩
假如我们现在有这样一个文件,代码如下:public class Hello { public String name = "hello"; public static void main(String[] args){ System.out.println("Hello, world"); }}我们想要知道它的哪些指令被执行了,因此我们需要对其编译过后的class文件中的指令进行插桩。下面讲解具体做法。首先,我们需要读取要被插桩的文件:InputStre
2021-04-01 21:56:13 803
原创 1 用ASM生成一个class文件
1 简介ASM是一个可以用来生成、转换和分析以字节数组表示的已编译 Java 类的工具。ASM 库提供了两个用于生成和转换已编译类的 API,一个是核心 API,以基于事件的形式来表示类,另一个是树 API,以基于对象的形式来表示类。基于事件就是每个把方法声明、字段、指令看成事件,这些事件有必须遵循的发生顺序。基于对象就是把方法声明、字段、指令看成看成对象,每个对象都有一些引用,指向表示其组成部分的对象。下面介绍如何使用ASM来生成一个类,并让它能够输出"Hello, world!"。2 实
2021-04-01 11:49:30 390
原创 对抗搜索-2 α-β剪枝
α-β剪枝运用剪枝的思想去除部分分支,使得我们无需遍历博弈树的每一个结点即可得到极大极小值。这种方法被称为α-β剪枝。这种方法的关键在于剪掉那些不会影响最终决策的分支之后,仍然能够返回和极小极大算法同样的结果。下面以实际例子来说明:现有一颗博弈树,正方形为MAX,菱形为MIN,终止状态的效益函数的值在最底部,如下图:MAX从左往右进行拓展:第一个终止状态值为5,所以MIN(结点1)MIN(结点1)MIN(结点1)的值最多为5,因为MIN(5,x,y)≤5MIN(5,x,y)\le 5MI
2020-07-16 11:01:41 568
原创 对抗搜索-1 极小极大算法
极小极大算法在竞争环境中,不同的agent的目标是有冲突的,这就引出了对抗搜索问题,也就是博弈问题。首先考虑最简单的两人参与的游戏:MAX和MIN。MAX先行,两人轮流行动,直至游戏结束。游戏由以下部分组成:S0:初始状态。PLAYERS(S):定义此时该谁行动。ACTIONS(S):此状态下的合法移动的集合。RESULT(S,A):转移模型,定义行动的结果。TERMINAL-TEST(S):终止测试,判断游戏是否结束。游戏结束的状态为终止状态。UTILITY(S,P):效用函数,定义游戏
2020-07-15 20:24:50 682
原创 动态规划-2 背包问题
背包问题背包问题是常见的动态规划问题,它的题目通常是给定一些有一定重量和价值的物品,一个已知承重量的背包,和一些限制条件,然后求能够放进背包的物品的最大价值。背包问题有多个类型,下面一一介绍。1 01背包01背包问题指的是:有n件物品和一个容量为W的背包。第i件物品的重量是w[i],价值为v[i],求解将哪些物品装入背包可 使这些物品的费用总和不超过背包容量,且价值总和最大。每个物品只能放入1次。它的子问题为opt(i,w)opt(i,w)opt(i,w),指的是前i件物品,背包容量为w时,能够放
2020-07-14 21:07:03 502
原创 动态规划-1 概述
动态规划概述1 使用动态规划的情况动态规划问题通常用来解决最优化问题,以得到最大或最小值。事实上,只要有最优子结构就可以使用动态规划。但是一般而言,动态规划时间复杂度较高,所以一般而言,只有在问题还具有子问题重叠的性质时,动态规划才有一定优势。总而言之,当我们发现问题具有最优子结构和子问题重叠的时候,我们就可以尝试用动态规划的方式来解决问题。2 具体步骤一般有如下几个步骤:定义最优子结构。定义状态。定义状态转移方程。其中,要得到状态转移方程,我们需要分析原问题和子问题的关系。又因为有多
2020-07-14 17:48:01 2447 1
原创 分治法-4 Fast Fourier Transform
快速傅里叶变换1 简介对于信号而言,它的一些特征需要在频域当中才能体现,因此我们需要通过某种方式将信号从时域转换到频域,而傅里叶变换就是其中之一。在计算机当中,我们常用的是离散傅里叶变换。而快速傅里叶变换(FFT)是为了加快傅里叶变换而提出的一种算法。2 离散傅里叶变换首先来看傅里叶变换:X(w)=∫−∞∞x(w)e−iwtdtX(w)=\int_{-\infty}^{\infty}x(w)e^{-iwt}dtX(w)=∫−∞∞x(w)e−iwtdt下面来看离散傅里叶变换。对x(t)以周期
2020-07-14 11:15:52 223
原创 分治法-3 closest pair
最邻近点对1 一维最邻近点对实例代码:struct point { long long x[3];};bool cmp_x(point a, point b) { return a.x[0] < b.x[0];}pair<point, point> one_d(point *set) { sort(set, set + n, cmp_x); int index1 = 0; int index2 = 1; if (n &g
2020-07-10 21:28:29 715
原创 分治法-2 sort
归并排序和快速排序1 简介一般来说,使用分治思想的排序算法有归并排序和快速排序,在理想情况下,它们的时间复杂度都为O(nlogn)O(nlog_n)O(nlogn),递归式均为:T(n)=2T(n/2)+O(n)T(n)=2T(n/2)+O(n)T(n)=2T(n/2)+O(n)基本思路均如下图,只是各自的分解、排序和合并的方式有所不同:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hjmWs1iJ-1594349682224)(D:\CS-Recorder\
2020-07-10 10:55:18 122
原创 分治法-1 概述
Divide and Conquer分治法是常见的算法设计思路之一,它的核心在于将原问题拆分为数个子问题,子问题与原问题类似,但规模更小,因此更容易解决,最后将子问题合并,即可得到原问题的答案。一般步骤如下:分解:将原问题分解为k个子问题。解决子问题:递归地处理子问题,直到问题规模足够小。合并:将子问题的解组合成原问题的解。通过这个方式,我们可以得到关于原问题的递归式,递归式对于求解该算法的时间复杂度很有帮助,其形式通常如下:T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f
2020-07-10 09:25:18 517
原创 贪心算法-5 Minimum Spanning Tree
Minimum Spanning Tree1 简介假设有n个节点,m条带非负权值的无向路径,我们想要在它们之间建立一张连接网络,使得任意两个节点之间都存在一条路径,且总权值最小。这样的问题被称为最小生成树,下面证明当花费最小时,该网络为一棵树:根据定义,该网络是连通的。假设网络G中存在一个环,环中包含a,b。因为G中的路径是无向的,且a,b在一个环中,那么a-b有两条路径,删去其中一条路径的一条边e’,得到G‘。G’同样是连通的,且cost(G‘)=cost(G)-cost(e’) <= co
2020-07-09 20:33:03 304
原创 贪心算法-4 Shortest path
Shortest path1 简介给定有向带权图G=(V,E),E中的每条边权值为非负实数。给定一点s,求s到其它点的最短路径。对于这类问题,我们常用Dijkstra算法。所谓Dijkstra算法,即开始时,集合S为空,集合Q为所有点以及它们到s的距离。之后,如果Q不为空,那选取Q中与s距离最短的点u,将该点加入S,之后更新u的所有临近点v,如果dsv>dsu+duvd_{sv}>d_{su}+d_{uv}dsv>dsu+duv,那么dsv=dsu+duvd_{sv}=d_{
2020-07-09 19:10:44 204
原创 贪心算法-3 Huffman code
哈夫曼编码(Huffman code)1 简介在计算机中,数据都是以二进制的形式存在,所以我们有必要对字符进行编码。编码方式通常分为两种:定长编码和变长编码。其中,变长编码通常有更好的利用率。下面介绍的哈夫曼编码就属于变长编码中的前缀码。所谓前缀码,指的是没有码字是其它码字的前缀。对于不同的前缀码编码树T,我们用如下公式来衡量其代价:B(T)=∑c∈Cc.freq∗dT(c)B(T)=\sum_{c\in C}c.freq * d_{T}(c)B(T)=c∈C∑c.freq∗dT(c)其中,
2020-07-09 10:43:00 240
原创 贪心算法-2 optimal cache
最优缓存管理(Optimal Caching)1 简介生活当中,常常发生这样的事,在做研究或者学习时,你列出了一些书来做参考。然而,你的书桌最多只能放k本书,但是你需要的书的数量大于k。因此,当你需要某本书,但它又不在桌上时,你需要前往图书馆去换书,而前往图书馆需要耗费大量的时间。那么,问题来了,如何对你的书桌进行管理才能让换书的次数最少?类似的,计算机的缓存存取速度很快,但是容量有限,所以很多数据存放在硬盘当中。而从硬盘当中读取数据十分耗时,所以我们需要通过某种方式来对缓存进行管理以减少这样的耗时。
2020-07-09 10:36:51 1134
原创 贪心算法-1 概述
1 贪心算法概论文章目录1 贪心算法概论1.1 算法简介1.2 算法设计1.3 算法优化1.1 算法简介“Greed . . . is good. Greed is right. Greed works.” ——Michael Douglas, Wall Street对于一些问题,虽然动态规划能够解决,但是如果使用贪心算法,算法的复杂度将会大大降低。如果我们想要使用贪心算法,那么问题需要满足贪心选择和最优子结构这两个条件。最优子结构:最优
2020-07-05 16:03:40 184
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人