Tag: 复杂性 理论

计算O((n + s)log n)中的圆交点

我试图弄清楚如何设计一个能够用O((n + s)log n)复杂度完成这项任务的算法。 是交叉点的数量。 我试过在网上搜索,却找不到东西。 无论如何,我意识到拥有一个好的数据结构是关键。 我在java:TreeMap中使用Red Black Tree实现。 我还使用着名的(?)扫描线算法来帮助我处理我的问题。 让我先解释一下我的设置。 我有一个调度程序。 这是一个PriorityQueue,我的圈子根据最左边的坐标排序(升序)。 scheduler.next()基本上轮询PriorityQueue,返回下一个最左边的圆圈。 public Circle next() { return this.pq.poll(); } 我这里也有一个包含4n个事件点的数组。 授予每个圆圈有2个事件点:大多数左x和最右x。 调度程序有一个方法sweepline()来获取下一个事件点。 public Double sweepline() { return this.schedule[pointer++]; } 我也有状态。 扫描线状态更加精确。 根据该理论,状态包含有资格相互比较的圆圈。 在整个故事中拥有扫描线的关键在于你能够排除很多候选人,因为他们根本不在当前圈子的半径范围内。 我使用TreeMap实现了Status。 Double是circle.getMostLeftCoord(). 此TreeMap保证O(log n)用于插入/删除/查找。 算法本身的实现方式如下: Double sweepLine = scheduler.sweepline(); Circle c = null; while (notDone){ while((!scheduler.isEmpty()) && (c = […]

背包问题的可能组合和?

好快速概述 我调查了背包问题 http://en.wikipedia.org/wiki/Knapsack_problem 我知道这是我的项目所需要的,但我项目的复杂部分是我需要在一个主要的麻袋里放多个麻袋。 拿着所有“袋子”的大背包只能携带x个“袋”(例如,为了举例说明9个)。 每个包都有不同的价值; 重量 成本 尺寸 容量 依此类推,所有这些值都是整数。 让我们假设0-100。 内袋也将被分配一种类型,并且在外袋中只能有一种类型,尽管程序输入将被赋予多个相同类型。 我需要指定主包可以容纳的最大重量,小包的所有其他属性需要按加权值分组。 例 外袋: 可容纳9个小包 重量不超过98 [任何一方给予或取5] 必须保持每种类型中的一种,一次只能容纳一种类型。 内袋: 成本,加权100% 尺寸,加权为67% 容量,加权44% 该程序将提供多个袋子的输入,然后必须计算出更小的袋子的组合进入更大的袋子,根据输入将有多种解决方案,并且程序将为我输出最佳解决方案。 我想知道你们认为对我来说最好的办法是什么。 我将用Java或C#编程。 我很乐意用PHP编程,但我担心这种算法对于Web服务器效率非常低。 谢谢你提供的所有帮助 -Zack

Java Collections Framework中常见方法(大小)的意外复杂性?

最近,我对一些Java集合没有方法size()的常量时间操作感到惊讶。 虽然我了解到集合的并发实现作为并发增益(在ConcurrentLinkedQueue,ConcurrentSkipListSet,LinkedTransferQueue等中的大小为O(n))的折衷作出了一些妥协,但好消息是这在API文档中有适当的记录。 关注我的是一些集合的方法返回的视图的方法大小的性能。 例如, TreeSet.tailSet返回其元素大于或等于fromElement的支持集部分的视图。 令我惊讶的是,返回的SortedSet上的调用大小在时间上是线性的,即O(n)。 至少这是我设法从OpenJDK的源代码中挖掘出来的:在TreeSet中实现为TreeMap的包装器,在TreeMap中,有一个EntrySetView类,其size方法如下: abstract class EntrySetView extends AbstractSet<Map.Entry> { private transient int size = -1, sizeModCount; public int size() { if (fromStart && toEnd) return m.size(); if (size == -1 || sizeModCount != m.modCount) { sizeModCount = m.modCount; size = 0; Iterator i = iterator(); while (i.hasNext()) { size++; i.next(); } […]

具有多个出口点的代码片段中的Cyclomatic Complexity

我有这个validation密码的方法: /** * Checks if the given password is valid. * * @param password The password to validate. * @return {@code true} if the password is valid, {@code false} otherwise. */ public static boolean validatePassword(String password) { int len = password.length(); if (len 20) return false; boolean hasLetters = false; boolean hasDigits = false; for […]

OSGi可以帮助降低复杂性吗?

我看到很多关于OSGi的演讲,我认为这对于实施更好的模块化听起来很有希望。 显然,“热部署”和“并行运行不同版本的x”也是市长的卖点。 我想知道OSGi承诺解决的问题是否是一个问题……? 它让我想起OO的早期时代,类似的声称是女仆: 当OO是新的时,最重要的论点是可重用性。 人们普遍声称,当使用面向对象时,人们只需要“一次写入”,然后就可以“随处使用”。 在实践中,我只看到这适用于一些非常低级的例子。 我认为这样做的原因是编写可重用的代码很难。 从技术上讲,但从界面设计的角度来看。 您必须预测未来客户将如何使用您的课程并预先做出正确的选择。 根据定义,这很困难,因此潜在的可重用性益处通常无法实现。 有了OSGi ,我怀疑在这里我们可能会再次承诺,我们没有真正拥有的问题的潜在解决方案。 或者如果我们拥有它们,我们没有足够大的数量和严重程度来certificate购买OSGi的帮助。 “Hotdeployment”作为模块子集的例子绝对是一个好主意,但它经常有效吗? 多久没有,因为事实certificate你对特定问题的模块化是错误的? 如何在多个模块之间共享模型实体? 这些模块都必须同时更换吗? 或者,您是否将对象展平为基元并仅使用模块间通信中的对象,以便能够保持接口契约? 应用OSGi时最困难的问题是,我认为, 使模块化“正确” 。 类似于在OO中使用OSGi获取类的接口,问题保持不变,这次是更大规模,包甚至服务级别。 您可能已经猜到了,我目前正在尝试评估OSGi以用于项目。 我们遇到的主要问题是随着代码库的增长而增加复杂性,并且我希望在具有越来越多定义的交互的较小模块中打破系统。 鉴于没有任何框架可以帮助决定模块化,OSGi是否为您付出了代价? 在团队合作时,它是否让您的生活更轻松? 它有助于减少错误数量吗? 你有没有成功地“热部署”主要组件? OSGi是否有助于降低复杂性? OSGi是否遵守承诺? 它符合你的期望吗? 谢谢!

以下算法的时间复杂度是多少?

谁能告诉我这个算法的时间复杂度是多少? 请记住:第二种方法(findMax) – 基于它获得的索引在数组上运行,意味着方法(findMax)不会每次都在所有数组上运行。 我认为这个算法的时间复杂度是O(n),但也许我错了。 public class Q2 { public static int[] replace(int []a) { for(int i = 0; i < a.length; i++ ){ if(i == a.length-1){ a[i] = 0; } int maxSubArry = findMax(a,i); swap (a, i, maxSubArry); } return a; } public static int findMax (int[]a, int i) { // i = i […]

Java 7的BigInteger操作有多复杂?

目前BigInteger中的方法有多大的复杂性, divide和pow ? 没有提到文档中的计算复杂性(也没有提到其他任何地方)。

Java CharAt()和deleteCharAt()性能

我一直想知道java中String / StringBuilder / StringBuffer的charAt函数的实现是什么的复杂性? 那么StringBuffer / StringBuilder中的deleteCharAt()呢?