Tag: 算法

用于文件比较的Java编程方法

将两个hex文件签名相互比较以获得相似性的最佳方法是什么。 更具体地说,我想要做的是采用.exe文件的hex表示forms,并将其与一系列病毒签名进行比较。 对于这种方法,我计划将文件(exe)hex表示分成N个字符的单个组(即10个hex字符),并对病毒签名执行相同操作。 我的目标是执行某种启发式方法,因此统计检查此exe文件是否与已知病毒签名具有X%的相似性。 我想到这样做的最简单和可能非常错误的方法是,将exe [n,n-1]与病毒[n,n-1]进行比较,其中数组中的每个元素都是一个子数组,因此exe1 [0, 9]针对病毒1 [0,9]。 每个子集将进行统计分级。 你可以意识到会有大量的比较,因此非常慢。 所以我想问一下你们是否可以考虑采用更好的方法进行这种比较,例如一起实现不同的数据结构。 这是我正在为我的BSc做的一个项目,我正在尝试开发一种算法来检测多态恶意软件,这只是整个系统的一部分,另一个是基于遗传算法来演化静态病毒签名。 任何建议,意见或资源等一般信息都是非常受欢迎的。 定义 :多态恶意软件(病毒,蠕虫,……)与“原始”版本保持相同的function和有效负载,同时具有明显不同的结构(变体)。 他们通过代码混淆实现了这一点,从而改变了他们的hex签名。 用于多态的一些技术是; 格式更改(插入删除空格),变量重命名,语句重新排列,垃圾代码添加,语句替换(x = 1更改为x = y / 5,其中y = 5),交换控制语句。 非常像流感病毒变异,因此疫苗接种无效,多态恶意软件会发生变异以避免检测。 更新:建议之后,你们给了我关于阅读的内容; 我做到了,但它让我更加困惑。 我找到了几种可以应用于我的问题的距离算法,例如; 最常见的子序列 Levenshtein算法 Needleman-Wunsch算法 Smith-Waterman算法 Boyer Moore算法 Aho Corasick算法 但现在我不知道使用哪个,他们似乎都以不同的方式做同样的事情。 我将继续做研究,以便我能更好地理解每一个; 但同时你可以给我你的意见, which might be more suitable以便我可以在研究期间优先考虑并深入研究。 更新2:我最终使用了LCSubsequence,LCSubstring和Levenshtein Distance的合并。 谢谢大家的建议。 在GitHub上有一份完成的纸张

更快实现总和(用于Codility测试)

以下简单的sum实现如何更快? private long sum( int [] a, int begin, int end ) { if( a == null ) { return 0; } long r = 0; for( int i = begin ; i < end ; i++ ) { r+= a[i]; } return r; } 编辑 背景是有序的。 阅读关于编码恐怖的最新条目,我来到这个网站: http : //codility.com ,它有这个有趣的编程测试。 无论如何,我在提交中得到60分中的60分,基本上(我认为)是因为这个实现总和,因为那些我失败的部分是性能部分。 我得到TIME_OUT_ERROR了 所以,我想知道算法中的优化是否可行。 […]

Java图形布局算法

在我的Java应用程序中,我需要某种布局算法。 第一种方法如下: 需要安装Graphviz包 创建一个点文件 从java应用程序调用graphviz并解析输出(布局) 使用graphviz(属性点)的布局显示图形 但是此解决方案需要在运行的计算机上安装graphviz软件包。 我想摆脱这种依赖,我正在寻找足够的替代品。 输入:具有宽度和高度的节点/从节点到节点的边缘,具有线的粗细 输出:周围的边界框大小,节点和边的位置 你能推荐一些优秀而简单的java布局算法吗? 你有经验吗? 谢谢

智能方式生成排列和String的组合

String database[] = {‘a’, ‘b’, ‘c’}; 我想基于给定的database生成以下字符串序列。 a b c aa ab ac ba bb bc ca cb cc aaa … 我只能想到一个非常“虚拟”的解决方案。 public class JavaApplication21 { /** * @param args the command line arguments */ public static void main(String[] args) { char[] database = {‘a’, ‘b’, ‘c’}; String query = “a”; StringBuilder query_sb = new […]

是否有任何双向搜索Dijkstra算法的实现?

我正在寻找Java中Dijkstra(或任何其他源到目的地最短路径算法)的双向搜索(也称为“中间相遇”算法)的实现。 由于双向搜索处理比它看起来更棘手( 图算法,第26页 ),我想在重新发明轮子之前考虑现有的实现! PS:我说的是双向搜索 ,不要与双向图混淆) 这是一个棘手的图表示例:

Java 2D加权数据插值

我正在尝试找到一些Java lib,代码示例(或起点)来帮助我弄清楚如何用权重插入2d点列表以生成带有水平曲线的插值。 谷歌搜索我发现有几种算法可以做到这一点,我找到了一些有趣内容的解释 。 我想尝试的第一个算法是反距离加权插值。 但有了这些信息,我有一些基本的疑虑: 要生成如下图所示的一张图片,我必须做一个像素矩阵(带有权重),插入数据,将像素组合在一起(按颜色范围)然后连接点确实绘制曲线并将参考文本值设置为这样 ? 如果我需要做这个像素矩阵,对于一个巨大的插值来说它会非常昂贵,那么我可以做更少的点并使用样条曲线来加入然后创建颜色级别吗? 示例数据: +——————-+ | X | Y | WEIGHT| +——————-+ | 2 | 5 | 30 | | 7 | 3 | 25 | | 1 | 1 | 10 | | 5 | 6 | 45 | | 7 | 9 | 15 | +——————-+ 示例规则: […]

Arrays.stream(array_name).sum()比迭代方法慢吗?

我编写了一个leetcode问题: https ://ooj.leetcode.com/problems/gas-station/使用Java 8。 当我使用Arrays.stream(integer_array).sum()来计算求和时,我的解决方案得到了TLE,同时使用迭代来接受相同的解决方案来计算数组中元素的总和。 这个问题的最佳时间复杂度是O(n),当我使用Java 8中的流API时,我很惊讶得到TLE。我只在O(n)中实现了解决方案。 import java.util.Arrays; public class GasStation { public int canCompleteCircuit(int[] gas, int[] cost) { int start = 0, i = 0, runningCost = 0, totalGas = 0, totalCost = 0; totalGas = Arrays.stream(gas).sum(); totalCost = Arrays.stream(cost).sum(); // for (int item : gas) totalGas += item; // for (int item […]

有效的算法来比较数字集之间的相似性?

我有很多套数字。 每组包含10个数字,我需要删除与任何其他集合具有5个或更多数字(无序)匹配的所有集合。 例如: set 1: {12,14,222,998,1,89,43,22,7654,23} set 2: {44,23,64,76,987,3,2345,443,431,88} set 3: {998,22,7654,345,112,32,89,9842,31,23} 鉴于集合1以上的3组10个数字和集合3将被认为是重复的,因为它们具有5个匹配的数字。 所以,在这种情况下,我会删除第3组(因为它被认为类似于第1组)。 我有超过10000套比较,我想非常有效地做到这一点。 我一直在讨论这个问题,我只是想不出一种有效的方法来进行这种比较(在一次通过中这样做会很棒)。 有任何想法吗? 谢谢! 麦克风

将数字从Base B1转换为Base B2,而不使用任何中间基数

有没有办法在不使用任何中间基础的情况下将数字从Base B1转换为Base B2。 例如: 214从基数5到基数16,不先将其转换为十进制,然后将十进制转换为hex。 – 谢谢 Alok Kr。

了解超快速模糊算法

我试图理解超快速模糊算法背后的算法 。 下面是java的端口,它与android一起作为测试。 看起来这个版本做了一些我不太了解的优化,也没有任何评论。 void fastblur(Bitmap img, int radius){ if (radius<1){ return; } int w= img.getWidth(); int h=img.getHeight(); int wm=w-1; int hm=h-1; int wh=w*h; int div=radius+radius+1; int r[]=new int[wh]; int g[]=new int[wh]; int b[]=new int[wh]; int rsum,gsum,bsum,x,y,i,p,p1,p2,yp,yi,yw; int vmin[] = new int[Math.max(w,h)]; int vmax[] = new int[Math.max(w,h)]; int[] pix= new int[w*h]; img.getPixels(pix, 0, w, 0,0,w, […]