Tag: 算法

Java内存使用 – 原语

从Algorithms第4版引用以下内容 “例如,如果你的计算机上有1GB的内存(10亿字节),你一次就不能在内存中容纳超过3200万个int值或1600万个double值。” int – 4个字节 3200万x 4 = 1.28亿字节 帮助我理解,为什么我们不能适应32万个int值,上面的128万字节大约是1GB或10亿字节的总内存消耗的1/10。

从Java Array获得前四大值

我试图从整数数组输入中找到前4个最大值。 例如,对于给定的输入数组{1232,-1221,0,345,78,99}将返回{1232,345,99,78}作为前4个最大值。 我用下面的方法解决了这个问题。 但我仍然不满足于它的时间效率。 当输入变大时,是否有机会更多地优化方法? 任何线索都非常感谢。 谢谢。 public int[] findTopFourMax(int[] input) { int[] topFourList = { Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE }; for (int current : input) { if (current > topFourList[0]) { topFourList[3] = topFourList[2]; topFourList[2] = topFourList[1]; topFourList[1] = topFourList[0]; topFourList[0] = current; } else if (current > topFourList[1]) { topFourList[3] = topFourList[2]; topFourList[2] […]

用于纠正FishEye镜头的桶形失真校正算法 – 无法用Java实现

我用鱼眼镜头拍摄了大量照片。 因为我想对照片进行一些图像处理(例如边缘检测),我想要去除桶形失真,这会严重影响我的结果。 经过一些研究和大量阅读文章,我找到了这个页面 :他们描述了一个算法(和一些公式)来解决这个问题。 M = a * rcorr ^ 3 + b * rcorr ^ 2 + c * rcorr + d rsrc =(a * rcorr ^ 3 + b * rcorr ^ 2 + c * rcorr + d)* rcorr rsrc =像素距源图像中心的距离 rcorr =校正图像中像素距中心的距离 a,b,c =图像失真d =图像的线性缩放 我使用这些公式并尝试在Java应用程序中实现它。 不幸的是它不起作用,我没能使它工作。 “修正”图像看起来与原始照片完全不同,而是在中间显示一些神秘的圆圈。 看这里: http://sofzh.miximages.com/java// (这曾经是蓝色墙前的白牛的照片) […]

使用Chudnovsky算法计算pi时出错 – Java

我一直在尝试使用Chudnovsky算法编写一个简单的程序来计算pi,但是我一直得到错误的值输出。 我写的最新代码如下,输出: 9.642715619298075837448823278218780086541162343253084414940204168864066834806498471622628399332216456e11 谁能告诉我哪里出错了。 正如彼得·德·里瓦兹指出我正在抛弃b的值,而现在的输出为:-1.76779979383639157654764981441635890608880847407921749358841620214761790018058 3600120191582474909093e-2 Apfloat sum = new Apfloat(0); for(int k = 0; k < n; k++) { int thrk= 3*k; Apfloat a = ApintMath.factorial(6*k); //(6k)! * (-1)^k a = a.multiply(ApintMath.pow(new Apint(-1),k)); Apfloat b = new Apfloat(545140134); b = b.multiply(new Apfloat(k)); b = b.add(new Apfloat(13591409)); // 13591409 + 545140134k Apfloat c = ApintMath.factorial(thrk); […]

C中的埃及分数

古埃及人只使用1/nforms的分数,因此任何其他分数必须表示为这些单位分数的总和,而且,所有单位分数都不同! 在C或java中使任何分数成为埃及分数(越少越好)的好方法是什么,可以使用什么算法,分支和绑定,a *? 例如: 3/4 = 1/2 + 1/4 6/7 = 1/2 + 1/3 + 1/42

平衡二叉搜索树

好吧,我想要一个二元搜索树来平衡,我知道为什么它不起作用,但我不知道如何解决它。 这就是我的平衡方法。 public void balance(){ if(isEmpty()){ System.out.println(“Empty Tree”); return; } if(!isEmpty()){ values = new Object[count()]; index = 0; createAscendingArray(root); clear(); balanceRecursive(0, index); values = null; } } private void createAscendingArray(TreeNode current){ if(current == null) return; if(current.getLeftNode() != null) createAscendingArray(current.getLeftNode()); else if(current.getRightNode() != null) createAscendingArray(current.getRightNode()); values[index] = current.getData(); index++; } private void balanceRecursive(int low, int high){ […]

数组列表算法 – 访谈

我今天在接受采访时被问到这个问题。 我尝试过一个解决方案,但想知道是否有更好的解决方法: 问题 :我有一个arraylist说500,000个元素,使得arraylist的每个元素的值与索引相同。 例如:list.get(0)= 0; list.get(1)= 1 …等。 但只有一个元素与此排序不同步[即list.get(i)!= i]。 你怎么找到这个元素。 我的答案 :使用多个线程迭代列表,每个线程在每次比较list.get(i)和i时处理arraylist的某个拼接。 找到元素后,设置一些布尔变量以向其他线程指示已找到该元素。 有没有办法解决这个问题而不迭代列表? 还是更好的方法?

比较java中的字符串并删除它们相同的字符串部分

我和我有两个字符串: s1=”MICROSOFT” s2=”APPLESOFT” 我需要比较字符串并从第二个字符串中删除重复部分(总是朝向末尾)。 所以我应该把“MICROSOFT”和“APPLE”作为输出。 我已逐字符地比较了两个字符串。 String s1 = “MICROSOFT”; String s2 = “APPLESOFT”; for(int j=0; j<s1.length(); j++) { char c1 = s1.charAt(j); char c2 = s2.charAt(j); if(c1==c2) System.out.println("Match found!!!"); else System.out.println("No match found!"); } 它应检查字符串,如果两个字符串在字符串结尾之前具有相同的字符,那么我需要从第二个字符串中删除该冗余部分,在这种情况下为SOFT。 但我想不出如何从这里开始。 可能会有更多重复……但我们只能删除那些不断相同的重复项。 如果我有APPWWSOFT和APPLESOFT,我应该在第二个字符串中再次获得APPLE,因为我们得到的LE与WW之间不同 你能帮帮我吗?

Java && || 在RETURN语句中?

我正在看一些Java算法示例,我在递归方法中遇到了这个代码片段: boolean subTree(TreeNode t1, TreeNode t2) { if (t1 == null) { return false; } if (t1.value == t2.value) { if (treeMatch(t1, t2)) return true;; } return (subTree(t1.left, t2) || subTree(t1.right, t2)); } 不知道(也从未见过)|| 在之前的返回语句中使用,更不用说递归语句了,真让我感到困惑。 我将代码复制到Eclipse中以查看它是否有效。 然后我替换了|| 用&&​​和Eclipse似乎并没有被它打扰。 从逻辑上讲,我理解这个递归代码应该继续沿着TreeNode t1的左右子树,但我正在寻找关于这种Java语法如何工作的更多理论解释。 有人可以解释||背后的含义 和Java的返回声明中的&&? 在递归方面它意味着什么? 它与递归一起使用时才有意义吗?

所有可能的话

我想用az创建所有可能的5个字母单词。请建议任何好的和快速的算法。 我试过创建一个,它看起来像这样…… byte[] allchar=new byte[] {‘a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’,’k’,’l’,’m’,’n’,’o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’,’w’,’x’,’y’,’z’}; int lengthOfAllChar=allchar.length; System.out.println(lengthOfAllChar); for (int i = 0; i < lengthOfAllChar; i++){ for(int j = 0; i < lengthOfAllChar; j++){ StringBuffer finalWordBuffer = new StringBuffer(); finalWordBuffer.append((char)allchar[i]); finalWordBuffer.append((char)allchar[j]); } }