编程面试题

  • nth_element实现的复杂性

    预期运行时间为O(N)对于大多数实现,最坏的情况下运行时间为O(N*N),因为大多数实现都使用QuickSelect,并且QuickSelect可能会运行到坏分区中。对于Microsoft VS2008,VS2010和VS2012来说确实如此。 现在有了新的ISO C ++ 2011标准,std :: sort的复杂性得到了加强-保证为O(N * log N),并且不会出现更糟的情况,因为使用了David

  • 训练时间最短的人脸检测算法

    OpenCV附带了一个称为 traincascade_的工具,用于训练LBP,Haar和HOG。他们专门针对人脸检测,甚至以_traincascade 所需的格式运送了3000张24x24像素人脸的图像数据集。 根据我的经验,在三种类型的_列车级联_支持中,LBP花费的时间最少,对于Haar而言,它花费的时间约为数小时而不是数天。 它的训练过程的快速概览是,对于给定的阶段数(一个不错的选择是2

  • 两张地图之间的差异

    我不确定执行此操作最绝对有效的方法是什么,但是以下几项可能有用: 问题文本对行为的基本期望是不可能的:如果a和b是b包含至少一个不存在的键的映射a,merge b sth则不能等于a。 如

  • 这个算法是线性的吗?

    这看起来像一个很整洁的想法,但可悲的是,我认为最坏的情况是O(n ^ 2)。 这是我的反例尝试。(我不是数学家,所以请原谅我使用Python而不是方程式来表达我的想法!) 考虑带有4K + 1符号的字符串 s = 'a'*K+'X'+'a'*3*K 这将有 borders[1:] = rangeK*2+

  • 符号数学Python?

    这是练习编程技能的好项目。但是,如果您想创建其他人将要使用的真实库,这是一个项目,那么您不想从头开始。 从哪里开始: 看看已经存在的解决方案,并考虑您想做些什么。您的项目与其他项目有何不同? 资源:SymPy是用于符号数学的Python库

  • 确定两个时间范围在任何一点是否重叠[重复]

    逻辑是正确的。您提供的$red(8-8:50pm)和$orange(1:30-3:30pm)时间戳 不重叠 。 给定正确的值(反映您的屏幕截图),实际上可以找到重叠部分: function show_date$value, $key { echo $key, ': ', date'r', $val

  • C#中的斐波那契,二进制或二项式堆?[关闭]

    我不知道任何本机框架实现。 我在f#中找到了两个二进制堆的实现(链接1,a href="http:weblogs.asp.netcumpsdarchive20050213371719.asp

  • 如何测试点是否位于3d形状内且其表面由点云定义?

    如果您计算了云的质心并将其坐标转换为以该质心为原点的极坐标系,该怎么办。 然后,将要检查的点转换为相同的坐标系。 假设该表面可以用Delaunay三角剖分表示,请确定与要检查的点之间的角度差最小的三个点。 将要检查的点投影到由这三个点确定的三角形上,然后查看投影点到质心的距离是否大于实际点的距离。 本质上,您正在构建凸包的三角形网格,但一次需要一个三角形。如果执行速度确实很重

  • 用于传递大量参数的C ++设计模式

    这称为“参数对象”模式,通常是一件好事。我不喜欢会员版本,特别是将其称为“ XGlobals”,并暗示它在所有地方都共享。相反,参数对象模式通常涉及创建参数对象的实例并将其作为参数传递给函数调用。

  • 贪婪的最佳第一搜索算法是否与最佳第一搜索算法不同?

    “最佳第一”可以允许 修改 决策,而在贪婪算法中,决策应该是最终决策,而不是修改决策。 例如,A *搜索是最佳优先搜索,但并非贪婪。 但是,请注意,这些术语并不总是与相同的定义一起使用。“贪婪”通常表示该决策永远不会修改,最终会因为运行时间的缩短而接受次优的解决方案。但是,我敢打赌,您会发现以下情况:“贪婪”用于“最佳第一+深度优先”的组合,如“尝试扩展最佳下一步直到遇到死胡同,然后返回上一步

  • 自动检测文件中CSV标头的存在

    正如其他人指出的那样,您无法做到100%可靠。在某些情况下,“基本正确”是很有用的- 例如,具有CSV导入功能的电子表格工具通常会尝试自行解决。以下是一些试探法,它们倾向于指示第一行 不是 标题: 第一行的列不是字符串或为空 第一行的列并不是唯一的 第一行似乎包含日期或其他常用数据格式(例如xx-xx-xx) u

  • 二进制搜索中的首次出现

    在找到 一个 匹配值,你基本上需要,直到你找到它的入口走了集合 不 匹配。 您可以通过获取刚好低于您要查找的键的索引,然后在两者之间进行二进制剁碎, 从而 使速度更快,但是我可能会选择更简单的版本,这可能“很有效”。足够”,除非您有大量相等的条目。

  • 数组中的最大绝对差

    是的,您的解决方案仍然ON^2是N - 1 + N - 2 + ... + 1 = N * N - 1 2。 我将展示如何解决线性时间中的一个更一般的问题:给出2D空间中的一个点列表(x [i],y [i]),找到两个最远的点(相对于曼哈顿距离)。 让我们找到以下几点:max(x [i] + y [i]),max(

  • 轴对齐的矩形交点

    求职面试可能会有些复杂,取决于哪种工作,这是一种几何计算算法, 答案可以在这里找到:http : a

  • C ++集合:计数小于值的元素

    您需要的是“订单统计树”。从本质上讲,它是一种增强的(二进制搜索)树,支持附加操作rankx,该操作可为您提供键数小于或等于element的元素数量x。第14章,科门,雷森,里维斯特,斯坦;“算法简介”应为您提供算法背景。 网上也有一些实现。

  • 您如何检测两个正则表达式在它们可以匹配的字符串中是否重叠?

    没有简单的方法。 只要您的正则表达式仅使用标准功能(我认为Perl允许您将任意代码嵌入匹配中),您就可以从每个代码中产生一个不确定的有限状态自动机(NFA),该a href="http:en.wikipedia.orgwikiNondeterministic_

  • 编写一个程序,将文本作为输入,并生成一个复制该文本的程序

    不幸的是,这样的程序不存在。 要了解为什么会这样,我们需要做一些数学运算。首先,让我们计算一下有多少个长度为n的二进制字符串。每个位可以是0或1,这给我们提供了每个这些位的两个选择之一。由于每位和n位有两个选择,因此总共有2 n个长度为n的二进制字符串。 现在,让我们假设我们要构建一种压缩算法,该算法始终将长度为n的位串压缩为长度小于n的位串。为了使它起作用,我们需要计算长度小于n的不同字符串的

  • Dijkstra算法中边缘的松弛

    这是对算法的很好描述,它也解释了松弛的概念。 “松弛”的概念来自对最短路径的估计与不为压缩而设计的螺旋拉伸弹簧的长度之间的类比。最初,最短路径的成本被高估了,就像延伸的弹簧一样。当找到更短的路径时,估计的成本会降低,弹簧会放松。最终,找到了最短的路径(如果存在

  • 我应该如何在hashCode()中将long映射到int?

    从Java 8开始,您可以使用 Long.hashCodeguid; 对于较旧版本的Java,可以使用以下命令: Long.valueOfguid.hashCode; 请注意,此解决方案为堆栈创建了一个新的Object,而第一个则没有(尽管Java很可能会优化对象创建。) 查

  • 在数组中查找特殊数字

    将数字按位添加mod 3,例如 def speciallst: ones = 0 twos = 0 for x in lst: twos |= ones x ones ^= x not_threes = ~ones twos ones = not_threes twos

  • 顺序生成字母数字字符串

    from string import digits, ascii_uppercase, ascii_lowercase from itertools import product chars = digits + ascii_uppercase + ascii_lowercase for n in range1, 4 + 1: for comb in productchars, repeat=n:

  • 动态编程问题

    我不想为您实际解决SPOJ问题,因此将以下内容作为多时DP的存在证明。 对于固定的K,可以使用的字符串集不受上下文限制。我将使用g和h而不是G和H。例如,对于K = 3,一个语法看起来像 S - ε | g S g S g S G | h S h S h S H G - ε

  • 在O(n)中运行的数组“最大差异”算法?

    令数组为X,令n = length(X)。将每个元素x放入存储区编号为floor((x-min(X))*(n-1)(max(X)-min(X)))中。每个存储桶的宽度为(max(X)-min(X))(n-1),最大相邻差至少为该值,因此所讨论的数字会出现在不同存储桶中。现在我们要做的就是考虑一对,其中一个是存储区i中的最大值,另一个是存储区j中的最小值,其中i j并且(i,j)中的所有存储区k为空。这是线性时间。br

  • 如何仅从语料库中找到“有趣”的单词?

    看一下这篇文章( 单词的级别统计:在文学文本和符号序列中查找关键字 ,发表在 Phys。Rev. E上 )。 第一页上的图片及其标题解释了至关重要的观察结果。在 Don Quixote中 ,单词“ but”和“ Quixote”以相

  • 您如何将一个数组分成两部分,以使这两部分具有相等的平均值?

    您可以将此问题简化为总和子集问题 -也在a href="http:webcache.googleusercontent.comsearch?q=cache%3afYcePS8IwvIJ%3aen.wikipedia.orgwikiSubset_sum_problem+cd=1hl=en

  • 字符串字母的排列:如何删除重复的排列?

    记下您之前交换的字符: char was[256]; * forj = 0; j = 255; j++ was[j] = 0; * bzerowas, 256; for j = i; j = n; j++ { if !was[*a+j] { swapa+i, a+j; permutea, i+1, n;

  • 在大量字符串中找到长时间重复的子字符串

    执行此操作的有效方法是创建子字符串的索引,并对它们进行排序。这是O(n lg n)运算。 BWT压缩执行此步骤,因此这是一个很好理解的问题,并且存在基数和后缀(要求O

  • 确定硬币组合的算法

    这似乎有点像分区,只是您没有在1:50中使用所有整数。它似乎也类似于垃圾箱包装问题,只是存在细微差别: 维基百科:分区(数论) a href="http:en.wikipedia.orgwikiBin_packing_problem"

  • 您知道(在C ++中)最快的Dijkstra实现是什么?

    公路网( 1百万个节点)已知的最佳实现具有以 微秒 表示的查询时间。有关更多详细信息,请参见第9届DIMACS实施挑战(2006)。请注意,这些当然不仅仅是Dijkstra,因为整个目的是为了更快地获得结果。

  • Java中Math.pow()背后的算法是什么

    这是一个有趣的问题。如果查看Java Math类的源代码,您会发现它调用StrictMath.pow(double1,double2),而StrictMath的签名是public static native double powdouble a, double b; 因此,最后,这是一个真正的本地调用,可能会因平台而异。但是,某处有一个实现,而且看起来并不容易。这是函数的描述以及函数

  • 在恒定存储空间中应用置换的算法

    有一个简单的O(n ^ 2)算法,但是您可以在O(n)中执行此操作。例如: A = [a,b,c,d,e] P = [4,3,2,0,1] 我们可以将每个元素交换A为所需的正确元素P,每次交换之后,在正确的位置将再有一个元素,并针对每个位置以循环方式进行此操作(以^s 指向的交换元素):

  • 在小世界图中找到路径的最有效方法是什么?

    一般注意事项 Dijkstra的算法及其优化的变体A *通过图形以最小的成本找到了路径。重要的事情是:a)正确定义图形,以及b)定义适当的成本函数。 面对不断变化的成本函数,Dijksta需要重新计算解决方案。 对于负载平衡,我将扩展Dikstra不仅可以计算最佳路径,还可以使用某种泛洪行为来创建一组可能的路径(按成本排序)以查找替代路径。只有有关特定问题和成本函数的知识才能回答这是否可行

  • 外部分类

    假设您有1-9 9 7 2 6 3 4 8 5 1 并假设一次只有3个内存。 因此,您可以将它们分成3个小块并进行排序,然后将每个结果存储在单独的文件中: 279 346 158 现在,您将三个文件分别作为流打开,并从每个文件中读取第一个值: co

  • KDTree拆分

    至少在光线跟踪社区中,“表面积启发式”(SAH)被认为是构建kd树的最佳拆分方法。想法是添加平面,以使两个子空间的表面积(由每个子对象中objexts的数量加权)相等。 关于此主题的一个很好的参考是Ingo Wald的论文,尤其是第7.3章“高质量的BSP构建”,它比我能更好地解释SAH。

  • 如何合并有序首选项的集合

    一个看起来很优雅并且仍然需要做的解决方案是将每个排序转换为从1到0的分数,其中1是给定审阅者列表中排名第一(排名靠前)的项目,而0是他们的最后一个(底部项目) ),则介于两者之间的所有项目均会获得线性比例的得分。因此,如果审阅者1仅对3个项目进行排名,那么他们将获得该列表的1、0.5和0的分数。然后,您只需将每个项目的平均分数作为一个整理列表即可。领带可能会因某件商品的“评论”数而中断(因此,由3名评论者一致标记为最佳的项目在最终列表中的

  • 使用DFS进行拓扑排序而无需递归

    为了构造postOrder列表,您需要知道算法完成处理node的最后一个子代的时间k。 确定何时将最后一个子节点弹出堆栈的一种方法是在堆栈上放置特殊标记,以指示特定节点的子节点开始的位置。您可以将dfs堆栈的类型更改为`vectorpair co

  • 如何设计一种允许在O(1)时间内搜索,插入和删除整数X的数据结构

    基本上,您将实现一个具有大小限制的多重集,其元素数量(#elements = m)和元素的有效范围(1 = elementValue = n)。 搜索:myCollection.searchx-如果在x内返回True,否则返回False 插入:myCollecti

  • 从加权列表中随机选择一个元素

    您可以使用增强型二进制搜索树来存储元素以及每个子树中权重的总和。这样,您就可以根据需要插入和删除元素和权重。采样和更新每次操作都需要O(lg n)时间,并且空间使用量为O(n)。 通过在[1,S]中生成一个随机整数(其中S是所有权重的总和(S存储在树的根目录中),然后使用为每个子树存储的权重和执行二进制搜索)来完成采样。

  • 成对比较可返回比-1、0,+ 1多的信息的排序算法

    实际上,可以使用额外的信息来最大程度地减少比较的总数。可以使用对super_comparison函数的调用来进行推论,这等同于对常规比较函数的大量调用。例如,a much-less-than b和c little-less-than b暗示a c b。 扣除罐被组织成箱或分区,可以分别分类。实际上,这等效于具有n路分区的QuickS

  • 您可以截断SHA1哈希多少并合理确定具有唯一ID?

    调整Wikipedia上有关生日问题的公式,您可以将碰撞概率近似为1 - e^-n^22^b+1,其中n文档数和b位数是。a href="http:www.wolf