Tag: 算法

最大和的连续子arrays(访谈问题)

可能重复: 在实数列表中查找最大间隔总和。 我今天在Adobe面试中被问到以下问题,担任软件工程师的职位。 问题给定一个数组arr[1..n]的整数。 编写一个算法来查找数组中具有最大总和的连续子arrays的总和。 如果所有数字都是负数,则返回0。 例 给定数组arr[1..6] = [ 12, 14, 0, -4, 61, -39 ] 回答 83由[ 12, 14, 0, -4, 61 ] 。 我可以想出一个在O(n logn)运行的解决方案,但我认为它不是非常有效。 面试官要我写一个O(n)算法。 我无法想出来。 有关如何为此问题编写O(n)解决方案的任何想法? 用C / C ++ / Java实现的算法。 提前致谢

将自相交Path2D分成几个非自相交路径的算法?

我需要摆脱形状中的自相交。 形状由点arrays构成,因此该形状的所有段都是线。 ( 只有线条,没有曲线和弧线) 以前,我尝试从那些点创建Path2D,从中构造一个Area,然后使用它的PathIterator我创建了几个Path2D,它们不知何故是前一个路径的子路径,因此自相交消失了。 但这对某些路径不起作用 – 自我交叉仍然存在。 所以你能指点我能在哪些地方找到做类似事情的好算法吗? 编辑:我在任何地方都找不到任何有用的东西,所以我编写了自己的算法。 看到答案。

如何在Kadane的算法中返回最大子数组?

public class Kadane { double maxSubarray(double[] a) { double max_so_far = 0; double max_ending_here = 0; for(int i = 0; i < a.length; i++) { max_ending_here = Math.max(0, max_ending_here + a[i]); max_so_far = Math.max(max_so_far, max_ending_here); } return max_so_far; } } 上面的代码返回最大子数组的总和。 我怎样才能返回具有最大总和的子数组?

使用动态编程找到子集和的解决方案

我想做的事 我想找到一个与目标T相加的数组的子集。 我还想使用动态编程方法(以及自下而上的解决方案)来做到这一点。 我现在有什么 目前我只找到一种方法来查看是否在所有大小为N子集中,是否存在至少一个具有所需总和的子集。 见下面的代码。 public boolean solve(int[] numbers, int target) { //Safeguard against invalid parameters if ((target < 0) || (sum(numbers) < target)){ return false; } boolean [][] table = new boolean [target + 1] [numbers.length + 1] ; for (int i = 0; i <= numbers.length; ++i) { table[0][i] = true; } […]

带路径压缩算法的加权Quick-Union

有一个“加权快速联合路径压缩”算法。 代码: public class WeightedQU { private int[] id; private int[] iz; public WeightedQU(int N) { id = new int[N]; iz = new int[N]; for(int i = 0; i < id.length; i++) { iz[i] = i; id[i] = i; } } public int root(int i) { while(i != id[i]) { id[i] = id[id[i]]; // this […]

Java 2d游戏中的路径查找?

基本上它是我正在研究的pacman克隆游戏。 我有一个Enemy类,并且创建了这个类的4个实例,它们代表了游戏中的4个幽灵。 所有幽灵都在屏幕的随机区域启动,然后他们必须朝着pacman角色前进。 当玩家控制pacman,移动它时,他们应该跟随它并采取最接近他的方式。 没有迷宫/障碍物(尚未)因此整个地图(400×400像素)都是开放的。 对于播放器和每个Ghost,我可以检索X,Y,图像宽度和高度属性。 此外,我已经有了一个碰撞检测算法,所以不用担心,只是鬼魂找到了通往pacman的方式。

有效搜索已排序的数值

我有一个int[]数组,其中包含具有以下属性的值: 他们排序 它们是独一无二的 (没有重复) 它们在已知范围内 [0..MAX] MAX通常比arrays的长度大很多(例如10-100x) 有时数字在整个范围内均匀分布,但在其他时间有很长的连续数字序列。 我估计这两种情况之间约为50/50。 鉴于此列表,我想有效地找到数组中特定值的索引(或者如果该值不存在,则找到下一个更高的值)。 我已经实现了一个带间隔二分的直接二分搜索 ,它运行得相当好,但我怀疑数据的性质/分布可以被利用来更快地收敛到解决方案。 我对优化平均案例搜索时间感兴趣,但重要的是最坏的情况永远不会比O(log n)差,因为数组有时非常大。 问题:在普通情况下,有可能比纯二进制搜索做得更好吗? 编辑 (澄清其他问题/意见) O(log n)中的常数绝对重要。 事实上,假设比O(log n)更好的算法复杂度是不可能的,常量可能是唯一重要的….. 它通常是一次性搜索,因此虽然预处理是可能的,但它可能不值得。

新的主题哈希openssl算法不同

从Java Framework管理openssl证书时遇到了一个问题。 openssl x509 -subject_hash … 输出与Java框架在调用X509_NAME_hash()时返回的输出不同,请参见下文。 原因是openssl改变了计算SHA1的方式。 现在,不是像在MD5中那样将哈希基于主题的ASN.1 DER表示,而是首先计算CANONICAL表示,然后根据它计算ASN.1 DER,然后将其用作SHA1算法的输入。 NativeCrypto.java : // — X509_NAME ———————————————————– public static int X509_NAME_hash(X500Principal principal) { return X509_NAME_hash(principal, “SHA1”); } private static int X509_NAME_hash(X500Principal principal, String algorithm) { try { byte[] digest = MessageDigest.getInstance(algorithm).digest(principal.getEncoded()); return Memory.peekInt(digest, 0, ByteOrder.LITTLE_ENDIAN); } catch (NoSuchAlgorithmException e) { throw new AssertionError(e); } } […]

如何确定GPS坐标是否位于矩形区域内?

我在Stackoverflow和其他网站上经历了许多类似的问题,我的解决方案基于这些答案,但我仍然无法让它工作…… 我的问题:我想确定某个GPS位置P位于由四个给定的GPS坐标A , B , C , D界定的矩形区域内。 目前我正在计算三角形ABP , BCP , CDP和DAP的面积。 如果这些区域中的任何一个大于零(不要沮丧,数学家),那么这个点就在我的矩形之外。 码: private static double triangleArea(Location a, Location b, Location c) { // (Cx*By-Bx*Cy)-(Cx*Ay-Ax*Cy)+(Bx*Ay-Ax*By) double result = (c.getLongitude()*b.getLatitude()-b.getLongitude()*c.getLatitude())-(c.getLongitude()*a.getLatitude()-a.getLongitude()*c.getLatitude())+(b.getLongitude()*a.getLatitude()-a.getLongitude()*b.getLatitude()); return result; } public static boolean isInsideSquare(Location a, Location b, Location c, Location d, Location p) { if (triangleArea(a,b,p)>0 || triangleArea(b,c,p)>0 || triangleArea(c,d,p)>0 || […]

Java中DCT和IDCT算法的问题

这里我的DCT算法类有“applyDCT”和“applyIDCT”方法。 从技术上讲,在0到255之间的2×2随机整数表上进行正向DCT(离散余弦变换),然后立即对这些数字进行反向DCT,我们应该回到我们首先得到的原始整数。 就我而言,情况并非如此。 我在这做错了什么? public class DCT { private static final int N = 2; private double[] c = new double[N]; public DCT() { this.initializeCoefficients(); } private void initializeCoefficients() { for (int i=1;i<N;i++) { c[i]=1; } c[0]=1/Math.sqrt(2.0); } public double[][] applyDCT(double[][] f) { double[][] F = new double[N][N]; for (int u=0;u<N;u++) { for (int v=0;v<N;v++) […]