编程面试题

  • 是否有任何“技巧”可以加快对大型背包组合式问题的采样速度?

    它使用动态编程来解决您在示例中给出的相同问题。通过跟踪值的索引而不是值来更新重复值以处理重复值,并更正了忽略了一些解决方案的错误。 public class TurboAdder { private static final int[] data = new int[] { 5, 10, 20, 25, 40, 50 }; private static class Node {

  • 查找存储在k台计算机上的k个数组中的最大k个数字

    在每台机器上找到k个最大的数字。O(n * log(k)) 合并结果(在集中式服务器上,如果k不大,否则可以将其合并到整个服务器群集中的树层次结构中)。 更新:明确地说,合并步骤不是一种排序。您只需从结果中选择前k个数字。有很多方法可以有效地做到这一点。您可以使用堆,例如,推入每个列表的开头。然后,您可以从堆中删除头部,并从元素所属的列表中将其推入。这样做k次即可得到结

  • 重复的图像检测算法?

    SURF应该做好工作。 http:en.wikipedia.orgwikiSURF 它很快就很健壮,它在旋转和缩放以及模糊和对比度闪电方面不变(但不是那么强烈)。 有自动全景拼接的示例。

  • 算法挑战:为浮点数生成连续分数

    [因为您要求的是答案而不是评论。] 对于任何实数,其连续分数的收敛点p [k] q [k]始终是最佳有理逼近,但并非 全部都是 最佳有理逼近。要获得所有这些,您还必须采用半收敛中值- p[k]+n*p[k+1]q[k]+n*q[k+1]某个n≥1的整数的形式的分数。取n = a [k + 2]得出p [k + 2] q [k + 2

  • 具有最少受侵犯边数的循环图的拓扑排序

    Eades,Lin和Smyth提出了一种针对反馈弧集问题的快速有效的启发式方法。原始文章位于付费专区后面,但可以从a href="https:pdfs.semanticscholar.orgc7edd9acce96ca357876540e19664eb9d976637f.pdf"

  • 如何在python中创建优化的打包功能?

    您拥有身高,长度和宽度的事实比一个简单的背包问题要难得多。这是有关3D背包问题的有趣讨论。 这是同一个人a href="http:books.google.combooks?id=mhrOkx- xyJIClpg=PA

  • PHP中的平衡自动换行(最小的不整洁度)

    用C ++快速又脏 #include sstream #include iostream #include vector #include cstdlib #include memory.h using namespace std; int cac[1000][1000]; string res[1000][1000]; vect

  • 产生2的平方根的数字

    您可以尝试使用映射: ab - a+2ba+b从开始a= 1, b= 1。这收敛到sqrt(2)(实际上给出了它的连续分数表示)。 现在的关键是:这可以表示为矩阵乘法(类似于斐波那契) 如果a_n和b_n是步骤中的第n个数字,则 [1 2] [a_n b_n] T = [a_(n + 1)b_(n + 1

  • F#FSharpMap与字典性能

    我想知道F#不可变Map如何针对标准Dictionary执行。 请参见Visual F#2010 for Technical Computing第241-242页“优化:使用可变

  • C#:从字符串中删除常见的无效字符:改进此算法

    char[] BAD_CHARS = new char[] { '!', '@', '#', '$', '%', '_' }; simple example someString = string.ConcatsomeString.SplitBAD_CHARS,StringSplitOptions.RemoveEmptyEntries; 应该可以解决问题(对于手机上出现的语法错误,

  • 高效消除.NET表达式树中的常见子表达式

    您没错,这不是一个小问题。 编译器处理该问题的经典方法是该表达式的有向无a href="http:books.google.combooks?id=Pq7pHwG1_OkCpg=PA100lpg=PA100dq=compiler%20dag%20representationsource=blots=4Xb2Luc3qUsig=5sEUKcDmo7CiRHx5fq

  • 为什么选择排序可以稳定或不稳定

    基本上selection sort,在每个“回合”结束时发生的交换可以更改具有相同值的项目的相对顺序。 例如,假设您整理4 2 3 4 1与selection sort。 第一个“回合”将遍历每个元素以寻找最小元素。它会发现1是最小元素。然后它将1交换到第一个位置。这将导致第一个位置的4进入最后一个位置:1 2 3 4 4

  • O(1)空间和O(n)时间中的布尔数组重新排序

    boolean array[n]; The array int lastTrue = n; for int i = n-1; i = 0; --i { if array[i] { swaparray[--lastTrue], array[i]; } } 每次迭代之后lastTrue,所有元素都为真。没有交换任何两个true元素

  • 为什么不对所有内容使用哈希/哈希表?

    平均而言,哈希表在插入,检索和删除方面确实具有出色的时间复杂度。但: Big-O并不是全部。该 常数因子 也是非常重要的。您可以使用哈希表代替数组,并将数组索引用作哈希键。无论哪种情况,检索项目的时间复杂度均为O(1)。但常数因子是 方式 为哈希表更高,而不是阵列。 内存消耗可能更高。如果使用哈希表替换数组,则肯定是这样。(当

  • 0/1背包的重量取决于物品?

    最后,我设法用@Holt提出的B&B方法解决了这个问题。这是关键设置: (0)在运行B&B算法之前,对所有项目进行分组取决于其依赖性。一个分区中的所有项目都与同一组中的所有其他项目具有权重相关性,而与其他组中的项目则不具有权重相关性。 B&B的设置: (1)上限:假设当前项的权重 最小 ,即假设所有依赖项都存在。 (2)下限:假设当前项目具有

  • 究竟增加路径是什么?

    扩充路径是一条简单的路径-不包含循环的路径-仅使用从源到接收器具有正容量的边通过图形。 因此,以上说明很明显-如果找不到从源到汇的仅使用正容量边缘的路径,那么流量就不会增加。 顺便说一句,证明这种说法不是那么容易。

  • 给定整数作为输入,打印所有唯一整数分区

    我会这样处理: 首先,概括问题。您可以定义一个功能 printPartitionsint target, int maxValue, string suffix 规格: 打印目标的所有整数分区,后跟后缀,以使分区中的每个值最多为maxValue 请注意,始

  • 如何计算线性时间内的最小瓶颈生成树?

    得到V,| E |的权重的中位数 边缘。 找出所有边的值不超过V,并获得子图 如果子图已连接,V则是答案的上限,并减小V,重复步骤1、2。 如果未连接子图,则 让连接的组件成为一个节点 ,并增加

  • 从邻接表创建树的最有效方法

    将节点放入排序列表或字典中。 扫描该列表,拾取每个节点,在同一列表中找到其父节点(二进制搜索或字典查找),然后将其添加到父节点的Children集合中。 无需堆栈即可将其放入树中。

  • 当平方和为N时,如何找到四个变量的所有可能值?

    Wikipedia页面上有一些有趣的背景信息,但是Lagrange的四平方定理(或更准确地说,Bachet定理- Lagrange仅证明了这一点)并未真正详细地介绍如何找到所述平方。 正如我在评论中所说,解决方案将是不平凡的。a href="http:www.myreckonings.comDead_ReckoningOnlineMaterialsSum%20of%20Four%20Squares.

  • 如何部分比较两个图

    这是子图同构问题:http : en.wikipedia.orgwi

  • 提取-代码示例还是开源项目?

    Snowball stemmer(C和Java)我用过的是Python绑定,PyStemmer

  • 用给定的遍历遍历构造树

    这是预遍历算法: PreorderT if T is not null print T.label PreorderT.left PreorderT.right 让我们尝试寻找输入的算法NNLLNL。 显然,首先打印了根标签。因此,您知道根目录具有label Nco

  • 生成具有一定程度分布的图?

    如果要使用配置模型,则应在NetworkX中使用以下方法: import random import networkx as nx z=[intrandom.gammavariatealpha=9.0,beta=2.0 for i in range100] G=nx.configuration_modelz 您可能需要根据伽马分布中的参数调整序列z的平均值。

  • 检测未知来源的时间

    经验方法 这是一个有趣的问题。您问题的更一般形式是: 给定一个未知长度的重复序列,请确定信号的周期。 确定重复频率的过程称为傅里叶变换。在您的示例情况下,信号是干净且离散的,但是以下解决方案即使在连续嘈杂的

  • Python中的Hopcroft–Karp算法

    线 if self.pair[v] and self.dfsv: 应该 if self.pair[v] is None and self.dfsv: 按照Wikipedia页面上的伪代码。我看到的唯一另一个问题是,您将双端队列用作堆栈,并且希望将其用作队列。为了解决这个问题,您只需要向左弹出而不是

  • 从2D矩阵到1D矩阵的0/1背包动态优化编程

    在许多动态编程问题中,您将逐行构建一个2D表,其中每行仅取决于其紧前面的行。如果是01背包问题,则重复发生的次数(来自Wikipedia)如下: 如果w i w ,则m [i,w] = m [i-1,w] m [i,w] = max(m [i-1,w],m [i-1,w-w i ] + v i)否则 注意,当填充第i

  • 找到矩形瓷砖螺旋的第n个位置?

    这是JavaScript中的代码。它计算从中间(0,0)的数字1开始的2D矩阵的位置 13 12 11 10 25 14 3 2 9 24 15 4 1 8 23 16 5 6 7 22 17 18 19 20 21 ** * Finds coordinates position of the number * * @param {Numb

  • 对文本内容进行地理标记或地理标记的方法

    您正在寻找命名实体识别系统,或简称NER。有几个 a href="http:opennlp.sourceforge.netindex.ht

  • 范围最小查询 方法(从树到受限RMQ)

    这是我目前对让您感到困惑的事情的理解: 为了将RMQ减少为LCA,您需要将阵列转换为树,然后对该树进行Euler游览。 为了进行Euler游览,您需要存储树,使得每个节点都指向其子节点。 从RMQ到LCA列出的缩减每个节点都指向其父节点,而不是其子节点。 如果是这种情况,您的顾虑是完全合理的,但是有一种简单的方法可以解决此问题。

  • 广义二蛋拼图

    (1)考虑第一滴摔碎鸡蛋的情况。 然后,您可以确定且仅当它最多为f [d-1,e-1]时才能确定该活动区域。因此,您不能以高于f [d-1,e-1] + 1的价格开始(当然,也不应以更低的价格开始)。 (2)如果您的第一个液滴没有打碎鸡蛋, 则在f [d-1,e]的情况下 , 您仅从第一个液滴+ 1的底部开始,而

  • 按顺时针/逆时针顺序对一组3-D点进行排序

    没有轴和方向,“顺时针”或“逆时针”的概念定义不明确!(证明:例如,如果您从显示器屏幕的另一侧查看这些点或将它们翻转,该怎么办!) 您必须定义轴和方向,并将其指定为附加输入。指定它的方法包括: 一条线(1x=2y=3z),使用右手定则 A_x, A_y, A_z使用右手法则的(单位)向量;这是首选的方式

  • 找到两个缺失的数字

    可以使用O(1)内存来完成。 您只需要几个整数即可跟踪一些总和。整数不需要log n位(其中n是输入整数的数量),它们只需要2b + 1位,其中b是单个输入整数中的位数。 当您第一次阅读流时,将所有数字及其所有平方相加,即对于每个输入数字n,请执行以下操作: sum += n sq_sum += n*n 然

  • 如何计算a ^^ b mod m?

    需要明确的是,a ^^ b与a ^ b不同,它是指数塔a ^(a ^(a ^ … ^ a)),其中有b个a的副本,也称为四元数。令T(a,b)= a ^^ b,因此T(a,1)= a且T(a,b)= a ^ T(a,b-1)。 要计算T(a,b)mod m = a ^ T(a,b-1)mod m,我们要计算具有极大指数的mod m的幂。您可以使用的是模幂运算是周期前的,周期前长度最大为m的素数分解中质数的

  • 在未排序的数组中,将每个元素替换为右边的第一个较大的元素

    主要思想是以相反的顺序(从右到左)处理数组。我们进行一些观察: 如果我们当前正在处理索引 i , k j i_和A[k] ≤ A[j],则我们将元素 _k 称为不相关的,因为它永远不会是元素 1,2,…,k的 任何结果 __ 因此,索引 i 的相关元素权构成的单调严格增加的

  • 使某些整数的异或为零所需的最小和

    重述为有界整数线性规划问题 该问题可以作为下面的有界ILP(整数线性规划)问题来重述。 Let x1,...,xN be as in the original problem, i.e. the goal is to minimizea1+...+aN under the conditions x1+a1 XOR ... xN+aN = 0, a1,...,aN = 0.

  • 如何确定与另一个相似的字符串dna

    您正在寻找的是LCS算法(另请参见Levenshtein distance)。您也可以尝试a href="http:en.wikipedia.o

  • dbscan-设置最大群集范围限制

    实际上,DBSCAN不会对群集施加总大小限制。 最好将epsilon值解释为 分隔两个簇 (最多可能包含minpts-1个对象) 的间隙 的 大小 。 我相信,您实际上根本没有在寻找集群:集群是 发现数据结构 的任务。结构可以更简单(例如k均值)或复杂(例如通过层次聚类和k均值

  • 从最大堆中获取最小元素的时间复杂度

    我的问题是这个答案是否正确。 不,那是不正确的。您唯一的保证是, 每个节点都包含其下面子树的最大元素 。换句话说, 最小元素可以是 树中的 任何叶子 。

  • 仅使用三个乘法的复数乘积

    您对两个数字感兴趣:A=ac−bd和B=ad+bc。可计算三个实数乘法S1=ac,S2=bd和S3=a+bc+d。现在,您可以将结果计算为 A=S1−S2和B=S3−S1−S2。 此过程称为Karatsuba乘法,在算法分析中