Tag: algorithm

如何find两个最远的点?

这是我前段时间在面试时被问到的一个问题。 而我仍然无法弄清楚明智的答案。 问题是: 你有一组点(x,y)。 find2个最远的点。 彼此遥远。 例如,对于点(0,0),(1,1),(-8,5) – 最远的是:(1,1)和(-8,5),因为它们之间的距离大于(0,0) – (1,1)和(0,0) – ( – 8,5)。 显而易见的方法是计算所有点之间的所有距离,并find最大值。 问题在于它是O(n ^ 2),这对于大型数据集来说过于昂贵。 对边界上的第一个跟踪点有一个方法,然后计算它们的距离,前提是边界上的点比“内部”要less,但是它仍然很昂贵,在最坏的情况下会失败。 试图searchnetworking,但没有find明智的答案 – 虽然这可能只是我缺乏search技能。

生成所有5张牌扑克牌

这个问题乍一看听起来很简单,但是看起来比现在复杂得多。 这让我难以忍受。 有52c5 = 2,598,960种方式从52张牌组中select5张牌。 然而,由于套装在扑克中是可以互换的,其中许多是等价的 – 手牌2H 2C 3H 3S 4D相当于2D 2S 3D 3C 4H – 简单地交换套装。 根据维基百科 ,一旦你考虑可能的西装颜色,有134459个不同的5张牌。 问题是,我们如何有效地产生所有这些可能的手? 我不希望产生所有的手,然后消除重复,因为我想将问题应用到更大数量的牌上,并且手的数量要评估快速螺旋失控。 我目前的尝试主要集中在深度优先生成和跟踪当前生成的卡片上,以确定下一张卡片或宽度优先的卡片和行列是否有效,生成所有可能的下一张卡片,然后通过转换每个卡片来删除重复通过重新着色来达到“规范”版本。 以下是我在Python中的广度优先解决scheme的尝试: # A card is represented by an integer. The low 2 bits represent the suit, while # the remainder represent the rank. suits = 'CDHS' ranks = '23456789TJQKA' def make_canonical(hand): suit_map […]

5个sorting数组的中值

我试图find5个sorting数组的中位数的解决scheme。 这是一个面试问题。 我能想到的解决scheme是合并5个数组,然后find中位数[O(1 + m + n + o + p)]。 我知道,对于2个相同大小的sorting数组,我们可以在log(2n)中完成。 [通过比较两个数组的中位数,然后抛出每个数组的一半并重复该过程]。 寻找中位数可以是在sorting数组中的常量时间..所以我认为这不是log(n)? ..这是什么时间的复杂性? 1]是否有一个类似的解决scheme5arrays。 如果arrays的大小相同,那么是否有更好的解决scheme呢? 2]我假设,因为这是要求5,会有一些解决scheme的Nsorting数组? 感谢任何指针。 我向面试官提出了一些澄清/问题: 是相同长度的数组 =>没有 我想在数组的值会有重叠 =>是的 作为一个练习,我认为2数组的逻辑不扩展。 这里是一个尝试: 应用上面的2个数组的逻辑来说3个数组:[3,7,9] [4,8,15] [2,3,9] …中值7,8,3 投掷元素[3,7,9] [4,8] [3,9] ..中值7,6,6 投掷元素[3,7] [8] [9] ..中型5,8,9 … 投掷元素[7] [8] [9] ..中位数= 8 …这似乎不正确? sorting元素的合并=> [2,3,4,7,8,9,15] =>预期中值= 7

如何以编程方式实现二维装箱?

在stackoverflow上有一些类似的问题,但是没有一个似乎提供了一个实际的答案,即对NP-hard问题和algorithm没有深入理解的人能够理解。 如何执行矩形对象的二维装箱? 在我的情况下,我试图将几个图像组装成一个单一的图像,用作一个spritesheet,使用最小的空间。 每个图像可能具有非常不同的边界,但是没有限定容器的边界。 我希望有一位了解bin包装algorithm的人可以解释如何以编程方式实现这一点,而不是提供bin包装方法的一般概述。

数组中xor最大的两个元素

给定一个整数数组,你必须find两个XOR最大的元素。 有一种天真的做法 – 只要挑选每个元素,然后与其他元素进行比较,然后比较结果来find这对。 除此之外,是否有任何有效的algorithm?

类布尔到布尔可满足性

我有一些理论/实践问题,我现在还不知道如何pipe理,这里是: 我创build了一个SAT求解器 ,当存在一个SAT求解器时,它可以find一个模型,并且在使用遗传algorithm的情况下,在C中CNF问题不是这样的情况下certificate矛盾。 SAT问题看起来基本上像这样的问题: 我的目标是使用这个求解器在很多不同的NP完成问题中find解决scheme。 基本上,我将不同的问题转化为SAT,用我的求解器解决SAT,然后将解决scheme转化为原始问题可以接受的解决scheme。 我已经成功的N * N数独和N皇后问题,但这里是我的新目标:为了减less课程排课问题,但我不知道如何forms化类调度问题,以便于转换它在SAT之后。 目标显然是在几个月内产生一个这样的时间表的图片: 我发现这个源代码谁能够解决课程安排,但没有任何削减SAT遗憾:/ 我还发现一些关于一般规划的文章(例如http://www.cs.rochester.edu/users/faculty/kautz/papers/kautz-satplan06.pdf )。 但是这篇文章中使用的规划域定义语言对于我来说似乎是相当普遍的,代表了一个类调度问题。 :/ 是否有人有一个想法,如何有效地forms化类调度,以减less到SAT和之后,将SAT解决scheme(如果存在^^)转换为课程表? 我基本上对任何build议都是开放的,现在我不知道如何expression,如何减less问题,如何将SAT解决scheme转换成时间表。 在此先感谢每一位将在我的问题上花费一些时间的人,最好的问候, 后续问题 : 类调度到布尔可满足性[多项式时间减less]第2部分

查找大于目标的sorting数组中的第一个元素

在一般的二分search中,我们正在寻找出现在数组中的值。 然而有时候,我们需要find第一个大于或小于目标的元素。 这是我的丑陋,不完整的解决scheme: // Assume all elements are positive, ie, greater than zero int bs (int[] a, int t) { int s = 0, e = a.length; int firstlarge = 1 << 30; int firstlargeindex = -1; while (s < e) { int m = (s + e) / 2; if (a[m] > t) { […]

如何find最长的回文序列?

这是来自algorithm书(Vazirani)的问题(6.7 ch6 ),与寻找最长回文的经典问题略有不同。 我怎么解决这个问题 ? 如果从左到右或从右到左读取相同的子序列是回文的。 例如,序列 A,C,G,T,G,T,C,A,A,A,A,T,C,G 有许多回文子序列,包括A,C,G,C,A和A,A,A,A (另一方面,子序列A,C,T不是回文)。 devise一个采用序列x[1 …n]并返回最长回文子序列(的长度)的algorithm。 运行时间应该是O(n^2)

代码高尔夫:生成帕斯卡的三angular形

生成一个列表(或打印,我不介意)一个大小为N的Pascal三angular形 ,代码行数最less! 这里是我的尝试( Python 2.6中的 118个字符使用技巧 ): c,z,k=locals,[0],'_[1]' p=lambda n:[len(c()[k])and map(sum,zip(z+c()[k][-1],c()[k][-1]+z))or[1]for _ in range(n)] 说明: 列表理解的第一个元素(当长度为0时)是[1] 接下来的元素是通过以下方式获得的: 采取以前的名单,并作出两个名单,一个填充0开头和另一端。 例如,对于第二步,我们取[1]并使[0,1]和[1,0] 按元素对两个新列表进行求和 例如,我们创build一个新的列表[(0,1),(1,0)]并与总和进行映射。 重复n次,就这些了。 用法(用漂亮的打印,实际上不用代码 – 高尔夫xD): result = p(10) lines = [" ".join(map(str, x)) for x in result] for i in lines: print i.center(max(map(len, lines))) 输出: 1 1 1 1 2 1 1 3 3 1 […]

查找最长的递增序列

给定一个数字序列,你需要从给定的input中find一个最长的子序列(不是必须的)。 我发现这个链接( 维基百科上最长的子序列 ),但需要更多的解释。 如果有人能帮我理解O(n log n)的实现,那真的很有帮助。 如果你能用一个例子来解释algorithm,那将会非常感激。 我也看到了其他的post,我不明白的是:对于i = 1,2,…,n,L = 0:对于最大的正数j≤L进行二元search,使得X [M [j]] <X [i](或设置j = 0,如果没有这样的值存在)上面的语句,从哪里开始二分search? 如何初始化M [],X []?