Tag: algorithm

Haskell中的Bentley-Ottmannalgorithm?

所以我一直在Haskell中编写一个计算几何库,因为我在Hackage上找不到一个,我认为这样做会很有趣。 然而,我在一个特定的algorithm上被困了近一个星期,我似乎无法进入一个很好的“类似于haskell”的表单。 该algorithm是用于在一组线段中find交点的Bentley-Ottmannalgorithm。 如果你熟悉algorithm,你可以跳到最后一段为我的求助:) 我select实现这个function的方式是把一个线段列表作为一个函数,并返回一个点列表,以及在那个点上相交的线段。 这让我们可以处理多个线段在相同点处相交的情况。 bentleyOttmann :: [Segment] -> [(Point, [Segment])] 该algorithm是一个扫描线algorithm。 我们想象一条线扫过飞机,在不同的地方做algorithm工作。 Bentley-Ottmannalgorithm中的事件点是: 线段的起始端点。 线段的结束端点。 一堆细分的交点。 请注意,事件点可以以多种方式与多个线段关联。 为了跟踪哪些段对应于哪个端点,我使用容器包中的映射。 这张地图的关键是点,这些值是分段的列表,标记是从那一点开始,在那一点结束还是在那一点相交。 扫描线决定点的顺序。 想象一下,一条垂直线扫过飞机,在事件点停下来做工。 事件点先按x值sorting,小点先处理。 一般来说,这是我们所需要的。 在退化情况下,事件点可能具有相同的x坐标。 我们还通过它们的y坐标来sorting,如果存在x坐标系,那么首先处理具有较小y坐标的事件点。 所以我使用的结构自然是一个优先队列。 我使用的是来自Hackage的堆包。 我们在每个活动点上所做的工作是什么? 那么,首先我们检查哪些段与事件点相关联。 如果有多个,那就是一个交点。 我们可以将它添加到我们迄今为止发现的十字路口列表中。 棘手的部分来了。 当我们扫过飞机时,我们会跟踪一组相对于扫掠线相交点的线段 。 当我们处理事件点时,我们首先删除在该事件点结束的所有段。 然后,在该点相交的所有分段按顺序颠倒 。 最后,我们将从该事件点开始的段添加到有序集。 请注意,由于这些分段都在事件点相交,所以必须相对于稍前扰动的扫掠线进行sorting。 在每个事件点,我们必须添加任何新事件点,新发生的交点。 因为我们跟踪与扫掠线相交的线段的相对顺序,我们做两件事之一: 如果我们交换了两个分段或添加了一个新的分段,我们find最下面的(相对于扫掠线)修改的分段,最上面的修改分段,并testing它们与它们的直接未修改的邻居的交集。 如果我们没有交换或添加新的细分市场,那么我们至less会删除一个细分市场,从而使其前邻居现在相邻。 我们testing这些新邻居的交集。 这是Bentley-Ottmannalgorithm的关键,当我们横扫飞机时,我们只用邻居来testing新的候选片段。 这意味着当交叉口相对较less时,我们击败了天真的O(n ^ 2)algorithm。 我的问题(最后,我很抱歉,这是如此冗长)是这样的:我不知道如何实现这个顺序逻辑。 我无法使用Data.Set,因为在我们扫描时sorting发生了变化。 我试图实现我自己的数据结构来跟踪信息,但它是蹩脚的,越野车,可能是低效的,也是丑陋的! 我讨厌丑陋的代码。 我知道Haskell是关于漂亮的代码。 […]

为什么贪婪的硬币更换algorithm不适用于某些硬币套装?

我知道如何贪婪algorithm的硬币更换问题(支付一定的金额尽可能less的硬币)的作品 – 它总是select最大的面额硬币不超过剩余的总和 – 它总是find正确的解决scheme具体的硬币套。 但是对于一些硬币组,有贪婪algorithm失败的总和。 例如,对于集合{1, 15, 25}和总和30,贪婪algorithm首先select25,剩余5,然后5个1,总共六个硬币。 但最小数量的硬币的解决scheme是select15次两次。 一组硬币必须满足什么条件才能使贪婪algorithmfind所有和数的最小解?

find3x3 holepunch的所有组合

我在嘉年华会,在每个地点他们用特别的打孔器来标记你的节目。 打孔器是一个3×3的格子。 在每个空间里,都有一个钉住你的纸或没有。 这让我想知道你可以使用这个工具有多less种不同的模式。 我的第一个想法是:2 ^ 9 = 512,但是所有9个空格都不是真正的一拳,所以真的:511。 那么复杂性打击了我。 特别是因为工作人员在打纸时不是很小心,所以这些都是理所当然的: x.. .x. … etc. .xx. .x. … … ..x 问题: 如何编写testing来解释轮换和移位? 目前的努力和想法: 二进制感觉是这个等式的一个显而易见的部分 当find一个唯一的模式,将其存储在内存中,以便将来的模式可以被testing 有4种旋转的可能性。 编辑:我的意思是“旋转”,你可以采取任何形状,把它转过90度。 考虑左上angular的点阵模式。 你可以转动/旋转90度,并得到在右上angular的点。 再次这样做,它在右下angular。 再次,它在左下angular。 使用纯粹的2 ^ 9计算,这些是4种不同的组合。 但是,对于这个问题,这些正是我试图去除的重复。 对于每次旋转,有25种方法可以使3×3网格重叠: 重叠: / = the spaces in the new one to test \ = the spaces in a verified unique […]

代码高尔夫:倒计数游戏

挑战 英国着名电视游戏节目“ 倒计时”的启发,这是一项任务。 即使没有任何关于游戏的知识,挑战应该是非常清楚的,但是可以随时要求澄清。 如果你想看看这个游戏的剪辑,看看这个YouTube剪辑 。 它在1997年以奇妙的理查德·怀特利为特色。 给你6个数字,从集合{1,2,3,4,5,6,8,9,10,25,50,75,100}中随机select,以及100和999之间的随机目标数字。其目的是使用六个给定的数字和四个常用的算术运算(加,减,乘,除;全部有理数)来生成目标 – 或尽可能接近两侧。 每个数字最多只能使用一次,而每个算术运算符可以使用任意次数(包括零)。请注意,使用多less个数字并不重要。 编写一个采用目标编号和6个数字组(可以表示为list / collection / array / sequence)的函数,并以任何标准数字符号(例如中缀,前缀,后缀)返回解。 该function必须始终将最接近可能的结果返回给目标 ,并且必须在标准PC上最多运行1分钟。 请注意,在存在多个解决scheme的情况下,任何单个解决scheme都是足够的。 例子: {50,100,4,2,2,4},目标203 例如100 * 2 + 2 +(4/4) (确切) 例如(100 + 50)* 4 * 2 /(4 + 2) (确切的) {25,4,9,2,3,10},目标465 例如(25 + 10 – 4)*(9 * 2 – 3) (确切) {9,8,10,5,9,7},目标241 例如((10 + 9)* […]

实现简单的Trie来实现高效的Levenshtein距离计算 – Java

更新3 完成。 以下是最终通过我所有的testing代码。 再次,这是仿照Murilo Vasconcelo的修改后的史蒂夫·哈诺夫的algorithm。 感谢所有帮助! /** * Computes the minimum Levenshtein Distance between the given word (represented as an array of Characters) and the * words stored in theTrie. This algorithm is modeled after Steve Hanov's blog article "Fast and Easy Levenshtein * distance using a Trie" and Murilo Vasconcelo's revised version in C++. […]

如何实现基于最小堆的优先级队列的O(logn)减less键操作?

我正在开发一个演示Djikstraalgorithm的应用程序,为了使用它,我需要在元素值减less时恢复堆属性。 关于复杂性的问题是, 当algorithm改变元素的值时,用于优先级队列的内部结构(在这种情况下为堆)中的该元素的索引 是未知的 。 因此,我现在需要做一个O(n)的search,以便恢复索引,然后才能对其执行实际的减键 。 而且,我并不完全确定操作所需的实际代码。 我在这里使用D堆作为我的优先级队列。 伪代码将有所帮助,但我更喜欢Java中的一个例子,如何做到这一点。

如何在Android中使用加速计计算精确的脚步数?

我正在使用algorithmhttps://code.google.com/p/pedometer/开发一些像Runtastic计步器这样的应用程序,但是我没有得到结果之间的任何相似性。 我的代码如下: public void onSensorChanged(SensorEvent event) { Sensor sensor = event.sensor; synchronized (this) { if (sensor.getType() == Sensor.TYPE_ORIENTATION) {} else { int j = (sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0; if (j == 1) { float vSum = 0; for (int i=0 ; i<3 ; i++) { final float v = mYOffset + event.values[i] […]

你有没有在实际应用中使用遗传algorithm?

我想知道在商业代码中find遗传algorithm的方法有多普遍。 在我看来,某些types的调度器可以从GA引擎中受益,作为主algorithm的补充。

timsort和quicksort的比较

为什么当timsort(根据维基百科)似乎performance更好时,我主要听说quicksort是最快的整体sortingalgorithm? 谷歌似乎没有任何比较。

什么algorithm可以用来识别图像是“相同”还是相似,不pipe大小?

TinEye ,“反向图像search引擎”,允许你上传/链接到一个图像,它能够search它爬过的亿图像,它会返回到它发现的图像是相同的图像的链接。 但是,这不是一个天真的校验和或任何有关的。 通常能够find比您提供的原始图像更高分辨率和更低分辨率以及更大和更小尺寸的图像。 这是一个很好的使用服务,因为我经常发现一个图像,并希望它的最高分辨率的版本。 不仅如此,我还find了相同图像集的图像,图像中的人物处于不同的位置,但背景基本保持不变。 TinEye可以使用什么types的algorithm来比较一个图像和其他不同大小和压缩比的图像,但是仍然准确地发现它们是“相同的”图像或集合?