
算法
爱学习的程序员
我很菜的
展开
-
2020实习笔试题——最有价值数的个数
问题描述对一个数组,求每个数左边比他大的数的最小值,右边比他小的数的最大值,若这两个数成倍数关系,则它为最有价值的数问题分析没什么好说的,两次循环记录每个数左边比他大的数的最小值,以及右边比他小的数的最大值。最后,判断是否有最有价值数。代码示例import bisectnum = list(map(int, input().split()))n = len(num)left_max = [float('-inf')] * nright_min = [float('inf')] * n原创 2021-03-16 11:29:24 · 245 阅读 · 0 评论 -
2020年实习笔试题——最大的最短路径和
问题描述现有n个人,m座城市,它们的目的地都是x。此外,两座城市的距离不对称。求最短路径的最大值。问题分析两遍Dijstra算法。代码示例def dijstra(n, x, dist, matrix): for j in range(1, n + 1): dist[j] = matrix[x][j] visited = [False] * (n + 1) visited[x] = True while True: t = -原创 2021-03-16 11:27:28 · 319 阅读 · 1 评论 -
阿里2020.3.30笔试题——养鸡场
问题描述给定鸡场数量nnn,养鸡天数mmm,每次增加数量kkk每一天开始时,每个养鸡场都增加k只鸡;每一天结束时,将数量最多的鸡场数量减半(向下取整)问题分析因为每次选择数量最多的鸡场,所以使用大顶堆即可。代码示例import heapq as hpdef solve(): N, M, K = map(int, input().split()) chicken_list = list(map(int, input().split())) chicken_list =原创 2021-03-15 16:51:24 · 355 阅读 · 1 评论 -
阿里2020.4.3实习笔试题——格子体力
问题描述一个n*m的矩阵格子,每个格子的值是体力,每经过一个格子需花费相应的体力,求从上方越过矩阵到达下方的最小体力花费。问题分析堆优化的动态规划。代码示例class Node: def __init__(self, x, y, dist): super().__init__() self.x = x self.y = y self.dist = distclass MinHeap: def __init__(se原创 2021-03-15 16:28:26 · 443 阅读 · 0 评论 -
阿里2020.3.23笔试题——走迷宫
问题描述小强在玩一个走迷宫的游戏,他操控的人物现在位于迷宫的起点,他的目标是尽快的达到终点。每一次他可以选择花费一个时间单位向上或者向下或者向左或者向右走一格,或是使用自己的对称飞行器花费一个时间单位瞬移到关于当前自己点中心对称的格子,且每一次移动的目的地不能存在障碍物。具体来数说,设当前迷宫有nnn行mmm列,如果当前小强操控的人物位于点A(x,y)A(x, y)A(x,y),那么关于点AAA中心对称的格子B(x′,y′)B(x', y')B(x′,y′)满足x+x′=n+1x + x' = n + 1原创 2021-03-15 16:23:02 · 935 阅读 · 2 评论 -
阿里2020.3.23实习笔试——队伍选择
问题描述现有nnn个人,从中选择任意数量的人组成一支队伍,再从这些人中选出1名队长,求不同方案数对∣109+7∣|10^9 + 7|∣109+7∣ 的结果。如果两个方案选取的人的集合不同或选出的队长不同,则认为这两个方案是不同的。求输入任意人数nnn得到的队伍数。问题分析典型的排列组合问题。因为从nnn个人中选择任意数量的人组成队伍,则依次有Cn1,Cn1,…,CnnC_n^1, C_n^1, \dots, C_n^nCn1,Cn1,…,Cnn中选择方式。然后,在这些队伍中选择一个人作为队长,即原创 2021-03-15 16:17:23 · 220 阅读 · 0 评论 -
阿里2020.4.1实习笔试题——翻转01字符串
问题描述给一串二进制字符串如00011001,希望把他改为全为0,如果更改某个字符,那么他两边的字符也要更改,例如把第二位的0换成1,那么就变成了11111001. 求最少翻转次数。如果无法全0,输出NO。问题解析因为每翻转当前字符,其相邻字符也会翻转,所以每当遇见为1的字符时,将它下一个的字符进行翻转。因为这样做可以保证之前的字符全部为0,即本次翻转不会影响之前的结果。如此循环迭代之后,判断最后一个是否为0即可。代码解析def flip(s, i): def __flip(s, i):原创 2021-03-15 16:07:12 · 2563 阅读 · 0 评论 -
阿里2020.4.1实习笔试题——攻击怪兽
问题描述有NNN个怪兽,MMM个弓箭,每个怪兽有生命值,每个弓箭有杀伤力和价值,每个怪兽只能用一支弓箭攻击,弓箭杀伤>=怪兽生命时可消灭怪兽,求使用弓箭的最小价值。如无法消灭,返回-1。问题解析因为目标是消灭怪兽,而且每个怪兽只能被一只弓箭攻击,所以我们应该在优先考虑消灭的基础上,选择最小价值的弓箭。根据这个推理,我们可以将怪兽的生命值非升序排序,并同时将弓箭按照攻击力进行非升序排序。最后,循环遍历能消灭当前怪兽的弓箭,并使用优先队列进行维护,选择价值最小的那一只即可解决该问题。代码解析N,原创 2021-03-15 15:57:27 · 288 阅读 · 0 评论 -
阿里2020.4.8笔试——木头人攻击
问题描述某人有nnn次机会攻击mmm个怪兽。攻击时,可以一次攻击bbb只怪兽。每个怪兽有aaa滴血,每次攻击能让bbb只怪兽都减一。问题解析很简单。当b>mb > mb>m时,只需判断nnn与aaa的大小关系。nnn大则必定能将mmm只怪兽消灭,反之则一只也无法消灭。当b≤mb \le mb≤m时,因为每次只能选择攻击其中的一部分怪兽,所以需要计算理论上的最大攻击数attacknum=n∗b/aattack_num = n * b / aattacknum=n∗b/a,如果atta原创 2021-03-15 15:46:26 · 205 阅读 · 0 评论 -
阿里2020.4.13实习笔试题——蚂蚁森林之王
问题描述森林里有nnn只动物,编号从1到nnn,编号越小的动物能力越大。他们想投票选出森林之王,每只小动物可以投票选自己,或者与自己的偶像投票相同;如果没有偶像,就只能投自己。 已知小动物是否有偶像以及具体是谁,求每个人能够得到的最高票数是多少?问题分析崇拜的关系是传递的,如果崇拜关系当做树的一条边,题目所求即以iii为根的某棵树的节点数。此外,因为动物顺序是按照能力从大到小排序,所以后向遍历有ans[A[i]]+=ans[i]ans[A[i]] += ans[i]ans[A[i]]+=ans[i]原创 2021-03-15 14:43:14 · 893 阅读 · 0 评论 -
阿里2020.4.10笔试题——取水最小距离和
问题描述二维格点上有nnn座房子,小强打算修一条平行yyy轴的水渠,水渠无限长,现在求小强修水渠的位置,能使得这nnn座房子到水渠的处置距离和最小,输出最小距离和。问题分析因为水渠是平行于yyy轴,且长度无限,所以本题的距离和只需考虑横坐标。因此,只需计算所有房子的中间位置(横坐标),再一一计算房子到水渠的距离,即可求解。代码示例n = int(input())row_list = []for _ in range(n): row, _ = map(int, input().spli原创 2021-03-15 10:20:05 · 412 阅读 · 0 评论 -
阿里2020.4.10笔试题——方格染色
问题描述给定一个m×nm \times nm×n的方格,有ccc种颜色的染料,每一种染料有c[i]c[i]c[i]升,每涂一个格子需要1L,对于某个格子上下左右4邻域的格子不能染成和本身格子一样的颜色,求是否能够找到染色方案?(保证升数总和和格子总数一致。)问题分析由抽屉原理可知,把多于nnn个的物体放到nnn个抽屉里,则至少有一个抽屉里的东西不少于两件。此外,因为相邻格子的横纵坐标和奇偶性不同,所以可以将奇数视作一种组合,偶数视作一种组合。因此,当有一种染料的升数多于某一种集合大小,则必定存在相邻各原创 2021-03-15 10:09:50 · 786 阅读 · 0 评论 -
Bagging与随机森林算法
注:本篇博客主要参考了博客Bagging与随机森林算法原理总结。在集成学习中,有两个流派—— boosting 派系 和 bagging 流派。前者的特点是各个弱学习器之间有依赖关系,而后者的特点是各个弱学习器之间没有依赖关系,可以并行拟合。其中,随机森林算法便是 bagging 流派的典型代表。Bagging原理我们知道,为了得到泛化性能强的集成,则应尽可能地使弱分类器彼此之间相互独立。...原创 2019-06-30 11:18:21 · 1298 阅读 · 0 评论 -
集成学习原理小结
集成学习(ensemble learning)是非常实用的机器学习方法,屡屡在工业界与机器学习相关的竞赛中大放异彩。然而与支持向量机(SVM),朴素贝叶斯(NB)等传统的机器学习方法不同的是,集成学习本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务,用大白话来说就是——“三个臭皮匠抵过一个诸葛亮”。更加难能可贵的是,集成学习用途广泛,不仅可以用于分类问题,还可以应用在...原创 2019-07-03 20:17:15 · 380 阅读 · 0 评论 -
多维度缩放——MDS
我们知道,缓解“维度灾难”的一个重要方法就是降维,即通过某种数学变换将原始高维属性空间转变为一个低维空间。而多维度缩放,就是其中的一个经典算法。简介多维度缩放,英文全称为Multiple Dimension Scaling,简称为MDS。其基本想法是: 降维后的低维空间d′d^{'}d′的欧式距离等于原始空间ddd的欧式距离。然而,它又是如何实现的呢?数学推导假定mmm...原创 2019-02-12 16:52:21 · 769 阅读 · 0 评论 -
原来拉格朗日乘子法这么简单!
在日常生活中,我们经常会遇见带有条件约束的优化问题,如经典的“采购食品”问题等。遇到此类问题时,老师们往往告诉我们使用拉格朗日乘子法解决!它的应用十分广泛,如支持向量机,线性规划等。那么,拉格朗日乘子法到底是什么?它背后的数学原理又是怎样的?本篇博客将为您一一解答。注意,本篇博客只是简单的对拉格朗日乘子法进行介绍和数学推导,并非严格的数学证明!拉格朗日乘子法前面提到,我们往往会遇见带有条件约...原创 2019-02-09 20:44:17 · 434 阅读 · 0 评论 -
浅谈贝叶斯判别(Bayes)
在现实世界中,由许多客观现象的发生,就每一次观察和测量来说,即使在基本条件保持不变的情况下也具有不确定性。只有在大量重复的观察下,其结果才能呈现出某种规律性,即对它们观察到的特征具有统计特性。特征值不再是一个确定的向量,而是一个随机向量。此时,只能利用模式集的统计特性来分类,以使分类器发生错误的概率最小。这就是贝叶斯判别的基本出发点。简介给定一个输入x\mathbf{x}x,我们想要确定它属...原创 2019-02-11 16:51:34 · 14464 阅读 · 0 评论 -
“近朱者赤,近墨者黑”的分类算法——k最近邻算法
k最近邻算法是一种经典的机器学习分类算法,最早由Cover T和Hart P于1967年提出。对原论文感兴趣的同学可下载此论文Nearest neighbor pattern classification。算法概念k最近邻,英文名为k-Nearest Neighbor,简称为kNN,是一种极其简单的机器学习分类算法,甚至可能是最简单的分类算法。其中,k表示样本的邻居数。k最近邻算法思想...原创 2018-06-13 11:08:03 · 1366 阅读 · 1 评论 -
《算法导论》——简洁明了的插入排序算法
《算法导论》——插入排序基本概念所谓插入排序,即将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,适用于少量数据的稳定排序,时间复杂度为O(n2)O(n2)O(n^2)。既然插入排序是用于数据的排序,不如就顺便阐述一下排序的概念:输入:n个数的一个序列(a1,a2,…,an)(a1,a2,…,an)(a_1, a_2,\ldots, a_n).输出:...原创 2018-06-28 21:54:08 · 333 阅读 · 0 评论 -
《算法导论》——十分钟了解归并排序!
《算法导论》——归并排序基本概念与插入排序相同,归并排序也是一种常见的排序算法。归并排序是建立在归并操作上的一种高效且稳定的排序算法。该算法是采用分治法将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。算法思想归并算法的核心思想即分治法。所谓分治法,就是将问题分而治之。它将原问题分解为几个规模较...原创 2018-06-28 22:43:15 · 337 阅读 · 0 评论 -
《算法导论》——十分钟了解堆排序!
《算法导论》——堆排序基本概念堆排序,顾名思义,也是排序算法的一种。与归并排序算法一样,堆排序的时间复杂度是O(nlgn)O(nlgn)O(n\lg n),整体优于插入排序。然而与归并排序不同的是,堆排序和插入排序一样,具有空间原址性:任何时候都只需要常数个额外的元素空间存储临时数据。因此,堆排序是集成了插入排序和归并排序的优点于一身的一种排序算法。堆是一种常用的数据结构,不仅用...原创 2018-07-09 17:29:46 · 671 阅读 · 0 评论 -
《算法导论》——十分钟带你了解最大子数组问题
《算法导论》——最大子数组问题问题概述假如你有一天突发奇想,准备投资股票大捞一笔,从而别墅靠海,走向人生巅峰。经过深思熟虑,你最终选定一家公司的股票。你被准许可以在某个时刻买进一股该公司的股票,并在之后某个日期将其卖出,买进卖出都是当天交易结束后进行。为了补偿这一限制,你可以了解股票将来的价格(是不是感到很兴奋啊!)。股票未来一段时间内的价格如图所示。你可能直观地认为,直接在最...原创 2018-07-11 23:23:53 · 332 阅读 · 0 评论 -
《算法导论》——矩阵乘法Strassen算法
《算法导论》——Strassen算法矩阵乘法接触过线性代数的读者,对于矩阵乘法想必一定不陌生。若A=(aij)A=(aij)A=(a_{ij})和B=(bij)B=(bij)B=(b_{ij})是n∗nn∗nn*n的方阵,则对i,j,…,ni,j,…,ni, j, \ldots, n,定义乘积C=A⋅BC=A⋅BC=A \cdot B中的元素cijcijc_{ij}为:cij=...原创 2018-07-13 22:18:41 · 2827 阅读 · 3 评论 -
《算法导论》——十分钟了解快速排序!
《算法导论》——快速排序基本概念快速排序最早由C. A. R. Hoare在1962年提出,一经面世,就备受瞩目。不过,快速排序并不快!对于包含n个数的输入数组来说,快速排序是一种最坏情况下时间复杂度为Θ(n2)Θ(n2)\Theta(n^2)的排序算法。然而,快速排序真的很快!因为,它的平均性能非常好,期望时间复杂度为Θ(nlgn)Θ(nlgn)\Theta(n\lg n),而且Θ...原创 2018-07-15 22:56:56 · 611 阅读 · 0 评论 -
《算法导论》——如何在线性时间内完成排序?
《算法导论》——线性时间排序众所周知,任何比较排序在最坏情况下都要经过Ω(nlgn)Ω(nlgn)\Omega(n \lg n)次比较。所谓比较排序,是指在排序的最终结果中,各元素的次序依赖于它们之间的的比较。之前介绍的,快速排序,堆排序,归并排序等经典排序算法都是其中的代表。那么问题来了,难道真的无法在Ω(nlgn)Ω(nlgn)\Omega(n \lg n)时间内对一个无序数组完成排序...原创 2018-07-19 16:52:13 · 1604 阅读 · 0 评论 -
《算法导论笔记》——十分钟带你了解二叉搜索树(BST)!
搜索树数据结构支持许多动态集合操作,包括SEARCH(查找指定结点)、MINIMUM(最小关键字结点)、MAXMUM(最大关键字结点)、PREDECESSOR(结点的先驱)、SUCCESSOR(结点的后继)、INSERT(结点的插入)和DELETE(结点的删除)等。因此,我们使用一棵搜索树既可以作为一个字典又可以作为一个优先队列。 二叉搜索树上的基本操作所花费的时间与这棵树的高度成正比。对于...原创 2018-07-27 20:18:46 · 32762 阅读 · 10 评论 -
十分钟带你了解Fisher线性判别
应用统计方法解决模式识别问题时,一再碰到的问题之一就是维度问题。在低维空间里计算上行得通的方法,在高维空间中往往行不通,如维度灾难等问题。因此,降低维数有时就会成为处理实际问题的关键。简介前面说到,在处理实际问题时,我们可能需要将维度降低以避免维度灾难等问题。我们不妨考虑把ddd维空间的样本投影到一条直线上,形成一维空间,即把维数压缩到一维。当然,即使样本在ddd维空间里形成若干紧凑的互相分...原创 2019-02-11 10:47:26 · 976 阅读 · 0 评论 -
深入浅出SVM(支持向量机)
支持向量机是机器学习领域中经典的分类算法之一,最早由Corinna Cortes, Vladimir Vapnik于1995年提出。对原论文感兴趣的读者可下载此论文Support-Vector Network简介分类学习的最基本思想就是基于给定的训练集DDD,在样本空间中寻找一个划分超平面,将不同类别的样本分开。假如有一样本集D={(x1,y1),(x2,y2),…,(xm,ym)}D = ...原创 2019-02-10 11:10:17 · 7814 阅读 · 0 评论 -
详解PCA(主成分分析)原理
在我们之前分类器的讨论中,如SVM、贝叶斯判别等,都假定已给出了特征向量维数确定的样本集,其中各样本的每一维都是该样本的一个特征。然而不同的特征对于分类器设计的影响是不同的,如果将数目很多的测量值不做分析,全部直接用作分类特征,不但耗时,而且会影响到分类的效果,产生“特征维数灾难”问题。因此,我们需要对特征进行选择和提取,即“降维”。简介PCA,全名主成分分析(Principal Compo...原创 2019-02-12 15:36:04 · 788 阅读 · 0 评论